Downloader Middlewares (下載器中間件)
下載器中間件是引擎和下載器之間通信的中間件色徘。在這個中間件中我們可以設(shè)置代理捣域、更換請求頭等來達到反反爬蟲的目的。要寫下載器中間件衣形,可以在下載器中實現(xiàn)兩個方法翎苫。
process_request(self,request,spider)
,這個方法是在請求發(fā)送之前
會執(zhí)行
process_ response(self ,request,response,spider)
零聚,這個方法是數(shù)據(jù)下載到引擎之前執(zhí)行
process_ request(self,request,spider):
這個方法是下載器在發(fā)送請求之前會執(zhí)行的袍暴。一般可以在這個里面設(shè)置隨機代理ip等。
1.參數(shù):
request
發(fā)送請求的request對象隶症。spider
發(fā)送請求的spider對象政模。
2.返回值:
返回
None
:如果返回None, Scrapy將 繼續(xù)處理該request
,執(zhí)行其他中間件中的相應(yīng)方法,直到合適的下載器處理函數(shù)被調(diào)用蚂会。返回
Response
對象: Scrapy將不會調(diào)用任何其他的process. request
方法淋样,將直接返回這個response
對象。
已經(jīng)激活的中間件的process_ response()
方法則會在每個response返回時被調(diào)用胁住。
- 返回
Request
對象:不再使用之前的request
對象去下載數(shù)據(jù)趁猴,而是根據(jù)現(xiàn)在返回的request
對象返回數(shù)據(jù)刊咳。如果這個方法中拋出了異常,則會調(diào)用process. exception
方法儡司。
process_response(self,request,response,spider):
這個是下載器下載的數(shù)據(jù)到引擎中間會執(zhí)行的方法娱挨。
1.參數(shù):
request
: request對象。response
:被處理的response對象枫慷。spider
: splder對象让蕾。
2.返回值:
返回
Response
對象: 會將這個新的response
對象傳給其他中間件,最終傳給爬蟲或听。返回
Request
對象:下載器鏈被切斷探孝,返回的request
會重新被下載器調(diào)度下載。如果拋出一個異常誉裆,那么調(diào)用request的errback 方法顿颅,如果沒有指定這個方法,那么會拋出一個異常足丢。
隨機請求頭中間件:
爬蟲在頻繁訪問一個頁面的時候粱腻,這個請求頭如果一直保持一致。那么很容易被服務(wù)器發(fā)現(xiàn)斩跌,從而禁止掉這個請求頭的訪問绍些。因此我們要在訪問這個頁面之前隨機的更改請求頭,這樣才可以避免尼蟲被抓耀鸦。隨機更改請求頭柬批,可以在下載中間件中實現(xiàn)。在請求發(fā)送給服務(wù)器之前袖订,隨機的選擇一一個請求頭氮帐。這樣就可以避免總使用一個請求頭了。示例代碼如下:
1.在middlewares.py
里面編寫隨機請求頭中間件
請求頭可以去這個網(wǎng)站去找
http://www.useragentstring.com/pages/useragentstring.php?typ=Browser
class UserAgentDownloadMiddleware(object):
# user-agent 設(shè)置隨機的請求頭中間鍵
USER_AGENTS = [
'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko',
'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.21pre) Gecko K-Meleon/1.7.0',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows XP 5.1) Lobo/0.98.4',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.28) Gecko/20120410 Firefox/3.6.28 '
]
def process_request(self, request, spider):
# random.choice()在列表中隨機選擇一個
user_agent = random.choice(self.USER_AGENTS)
request.headers['User-Agent'] = user_agent
- 寫好中間件之后記得要在
settings.py
調(diào)用
DOWNLOADER_MIDDLEWARES = {
'useragent_demo.middlewares.UserAgentDownloadMiddleware': 543,
}