日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Downloader Middlewares反反爬虫【学习笔记04】

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Downloader Middlewares反反爬虫【学习笔记04】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

反反爬蟲相關(guān)機(jī)制

Some websites implement certain measures to prevent bots from crawling them, with varying degrees of sophistication. Getting around those measures can be difficult and tricky, and may sometimes require special infrastructure. Please consider contacting commercial support if in doubt.

(有些些網(wǎng)站使用特定的不同程度的復(fù)雜性規(guī)則防止爬蟲訪問,繞過這些規(guī)則是困難和復(fù)雜的,有時(shí)可能需要特殊的基礎(chǔ)設(shè)施,如果有疑問,請(qǐng)聯(lián)系商業(yè)支持。)

來自于Scrapy官方文檔描述:http://doc.scrapy.org/en/master/topics/practices.html#avoiding-getting-banned

通常防止爬蟲被反主要有以下幾個(gè)策略:

  • 動(dòng)態(tài)設(shè)置User-Agent(隨機(jī)切換User-Agent,模擬不同用戶的瀏覽器信息)

  • 禁用Cookies(也就是不啟用cookies middleware,不向Server發(fā)送cookies,有些網(wǎng)站通過cookie的使用發(fā)現(xiàn)爬蟲行為)

    • 可以通過COOKIES_ENABLED?控制 CookiesMiddleware 開啟或關(guān)閉
  • 設(shè)置延遲下載(防止訪問過于頻繁,設(shè)置為 2秒 或更高)

  • Google Cache 和 Baidu Cache:如果可能的話,使用谷歌/百度等搜索引擎服務(wù)器頁面緩存獲取頁面數(shù)據(jù)。

  • 使用IP地址池:VPN和代理IP,現(xiàn)在大部分網(wǎng)站都是根據(jù)IP來ban的。

  • 使用?Crawlera(專用于爬蟲的代理組件),正確配置和設(shè)置下載中間件后,項(xiàng)目所有的request都是通過crawlera發(fā)出。

    DOWNLOADER_MIDDLEWARES = {'scrapy_crawlera.CrawleraMiddleware': 600}CRAWLERA_ENABLED = TrueCRAWLERA_USER = '注冊(cè)/購買的UserKey'CRAWLERA_PASS = '注冊(cè)/購買的Password'

設(shè)置下載中間件(Downloader Middlewares)

下載中間件是處于引擎(crawler.engine)和下載器(crawler.engine.download())之間的一層組件,可以有多個(gè)下載中間件被加載運(yùn)行。

  • 當(dāng)引擎?zhèn)鬟f請(qǐng)求給下載器的過程中,下載中間件可以對(duì)請(qǐng)求進(jìn)行處理 (例如增加http header信息,增加proxy信息等);

  • 在下載器完成http請(qǐng)求,傳遞響應(yīng)給引擎的過程中, 下載中間件可以對(duì)響應(yīng)進(jìn)行處理(例如進(jìn)行g(shù)zip的解壓等)

  • 要激活下載器中間件組件,將其加入到 DOWNLOADER_MIDDLEWARES 設(shè)置中。 該設(shè)置是一個(gè)字典(dict),鍵為中間件類的路徑,值為其中間件的順序(order)。

    這里是一個(gè)例子:

    DOWNLOADER_MIDDLEWARES = {'mySpider.middlewares.MyDownloaderMiddleware': 543, }

    編寫下載器中間件十分簡單。每個(gè)中間件組件是一個(gè)定義了以下一個(gè)或多個(gè)方法的Python類:

    class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

    process_request(self, request, spider)

    • 當(dāng)每個(gè)request通過下載中間件時(shí),該方法被調(diào)用。

    • process_request() 必須返回以下其中之一:一個(gè) None 、一個(gè) Response 對(duì)象、一個(gè) Request 對(duì)象或 raise IgnoreRequest:

      • 如果其返回 None ,Scrapy將繼續(xù)處理該request,執(zhí)行其他的中間件的相應(yīng)方法,直到合適的下載器處理函數(shù)(download handler)被調(diào)用, 該request被執(zhí)行(其response被下載)。

      • 如果其返回 Response 對(duì)象,Scrapy將不會(huì)調(diào)用 任何 其他的 process_request() 或 process_exception() 方法,或相應(yīng)地下載函數(shù); 其將返回該response。 已安裝的中間件的 process_response() 方法則會(huì)在每個(gè)response返回時(shí)被調(diào)用。

      • 如果其返回 Request 對(duì)象,Scrapy則停止調(diào)用 process_request方法并重新調(diào)度返回的request。當(dāng)新返回的request被執(zhí)行后, 相應(yīng)地中間件鏈將會(huì)根據(jù)下載的response被調(diào)用。

      • 如果其raise一個(gè) IgnoreRequest 異常,則安裝的下載中間件的 process_exception() 方法會(huì)被調(diào)用。如果沒有任何一個(gè)方法處理該異常, 則request的errback(Request.errback)方法會(huì)被調(diào)用。如果沒有代碼處理拋出的異常, 則該異常被忽略且不記錄(不同于其他異常那樣)。

    • 參數(shù):

      • request (Request 對(duì)象)?– 處理的request
      • spider (Spider 對(duì)象)?– 該request對(duì)應(yīng)的spider

    process_response(self, request, response, spider)

    當(dāng)下載器完成http請(qǐng)求,傳遞響應(yīng)給引擎的時(shí)候調(diào)用

    • process_request() 必須返回以下其中之一: 返回一個(gè) Response 對(duì)象、 返回一個(gè) Request 對(duì)象或raise一個(gè) IgnoreRequest 異常。

      • 如果其返回一個(gè) Response (可以與傳入的response相同,也可以是全新的對(duì)象), 該response會(huì)被在鏈中的其他中間件的 process_response() 方法處理。

      • 如果其返回一個(gè) Request 對(duì)象,則中間件鏈停止, 返回的request會(huì)被重新調(diào)度下載。處理類似于 process_request() 返回request所做的那樣。

      • 如果其拋出一個(gè) IgnoreRequest 異常,則調(diào)用request的errback(Request.errback)。 如果沒有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常那樣)。

    • 參數(shù):

      • request (Request 對(duì)象)?– response所對(duì)應(yīng)的request
      • response (Response 對(duì)象)?– 被處理的response
      • spider (Spider 對(duì)象)?– response所對(duì)應(yīng)的spider

    使用案例:

    1. 創(chuàng)建middlewares.py文件。

    Scrapy代理IP、Uesr-Agent的切換都是通過DOWNLOADER_MIDDLEWARES進(jìn)行控制,我們?cè)趕ettings.py同級(jí)目錄下創(chuàng)建middlewares.py文件,包裝所有請(qǐng)求。

    # middlewares.py#!/usr/bin/env python # -*- coding:utf-8 -*-import random import base64from settings import USER_AGENTS from settings import PROXIES# 隨機(jī)的User-Agent class RandomUserAgent(object):def process_request(self, request, spider):useragent = random.choice(USER_AGENTS)request.headers.setdefault("User-Agent", useragent)class RandomProxy(object):def process_request(self, request, spider):proxy = random.choice(PROXIES)if proxy['user_passwd'] is None:# 沒有代理賬戶驗(yàn)證的代理使用方式request.meta['proxy'] = "http://" + proxy['ip_port']else:# 對(duì)賬戶密碼進(jìn)行base64編碼轉(zhuǎn)換base64_userpasswd = base64.b64encode(proxy['user_passwd'])# 對(duì)應(yīng)到代理服務(wù)器的信令格式里request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswdrequest.meta['proxy'] = "http://" + proxy['ip_port']

    為什么HTTP代理要使用base64編碼:

    HTTP代理的原理很簡單,就是通過HTTP協(xié)議與代理服務(wù)器建立連接,協(xié)議信令中包含要連接到的遠(yuǎn)程主機(jī)的IP和端口號(hào),如果有需要身份驗(yàn)證的話還需要加上授權(quán)信息,服務(wù)器收到信令后首先進(jìn)行身份驗(yàn)證,通過后便與遠(yuǎn)程主機(jī)建立連接,連接成功之后會(huì)返回給客戶端200,表示驗(yàn)證通過,就這么簡單,下面是具體的信令格式:

    CONNECT 59.64.128.198:21 HTTP/1.1 Host: 59.64.128.198:21 Proxy-Authorization: Basic bGV2I1TU5OTIz User-Agent: OpenFetion

    其中Proxy-Authorization是身份驗(yàn)證信息,Basic后面的字符串是用戶名和密碼組合后進(jìn)行base64編碼的結(jié)果,也就是對(duì)username:password進(jìn)行base64編碼。

    HTTP/1.0 200 Connection established

    OK,客戶端收到收面的信令后表示成功建立連接,接下來要發(fā)送給遠(yuǎn)程主機(jī)的數(shù)據(jù)就可以發(fā)送給代理服務(wù)器了,代理服務(wù)器建立連接后會(huì)在根據(jù)IP地址和端口號(hào)對(duì)應(yīng)的連接放入緩存,收到信令后再根據(jù)IP地址和端口號(hào)從緩存中找到對(duì)應(yīng)的連接,將數(shù)據(jù)通過該連接轉(zhuǎn)發(fā)出去。

    2. 修改settings.py配置USER_AGENTS和PROXIES

    • 添加USER_AGENTS:
      USER_AGENTS = ["Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"]
    • 添加代理IP設(shè)置PROXIES:

      免費(fèi)代理IP可以網(wǎng)上搜索,或者付費(fèi)購買一批可用的私密代理IP:

    PROXIES = [{'ip_port': '111.8.60.9:8123', 'user_passwd': 'user1:pass1'},{'ip_port': '101.71.27.120:80', 'user_passwd': 'user2:pass2'},{'ip_port': '122.96.59.104:80', 'user_passwd': 'user3:pass3'},{'ip_port': '122.224.249.122:8088', 'user_passwd': 'user4:pass4'}, ]
    • 除非特殊需要,禁用cookies,防止某些網(wǎng)站根據(jù)Cookie來封鎖爬蟲。
    COOKIES_ENABLED = False
    • 設(shè)置下載延遲
    DOWNLOAD_DELAY = 3
    • 最后設(shè)置setting.py里的DOWNLOADER_MIDDLEWARES,添加自己編寫的下載中間件類。
    DOWNLOADER_MIDDLEWARES = {#'mySpider.middlewares.MyCustomDownloaderMiddleware': 543,'mySpider.middlewares.RandomUserAgent': 1,'mySpider.middlewares.ProxyMiddleware': 100 }

    總結(jié)

    以上是生活随笔為你收集整理的Downloader Middlewares反反爬虫【学习笔记04】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。