在setting中捂敌,可以自定義中間件岖赋,接受各種request芒涡、response浮驳、 exception消息
比如有的人想在請(qǐng)求超時(shí)時(shí) 做一些處理吁峻,
有的人想為request設(shè)置代理
DOWNLOADER_MIDDLEWARES = {
'discountSpider.middlewares.ProcessMiddleware':90,
'discountSpider.middlewares.ProxyMiddleware': 750,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 751,
'discountSpider.middlewares.RandomUserAgent': 400,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
}
然而滑负,中間件的順序是很重要的
如果是想截取process_request,則越前面越早收到通知,然后順著向后依次通知用含,沒(méi)什么意外的話是這樣矮慕。
但是如果是截取process_response,獲得request請(qǐng)求完成后啄骇,返回response的消息痴鳄,如果是正常下載完成的話,是第一個(gè)中間件收到通知缸夹,然后順序向后通知痪寻。
但是往往會(huì)發(fā)生很多意外螺句,比如請(qǐng)求超時(shí),比如請(qǐng)求被retry橡类,那么是不會(huì)發(fā)送通知到第一個(gè)的蛇尚,而是根據(jù)scrapy默認(rèn)中間件的位置發(fā)送,
分配中間件的順序請(qǐng)查看 DOWNLOADER_MIDDLEWARES_BASE 設(shè)置猫态,而后根據(jù)您想要放置中間件的位置選擇一個(gè)值佣蓉。由于每個(gè)中間件執(zhí)行不同的動(dòng)作,您的中間件可能會(huì)依賴(lài)于之前(或者之后)執(zhí)行的中間件亲雪,因此順序是很重要的勇凭。
比如DOWNLOADER_MIDDLEWARES_BASE中
'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 500, 如果你把自定義的中間件序號(hào)設(shè)為100,那么當(dāng)下載器發(fā)生錯(cuò)誤504 500錯(cuò)誤义辕,需要retry虾标,則會(huì)將response狀態(tài)為retry的消息通知后面中間件,你的中間件的process_response將無(wú)法收到消息灌砖,因?yàn)樗菑?00序號(hào)開(kāi)始向后通知璧函,所需你將自己的中間件序號(hào)改為500以后,則可以收到消息基显。
又比如
'scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware': 350,如果你想收到下載頁(yè)面超時(shí)的消息蘸吓,請(qǐng)將中間件放到350以后,process_response才能收到消息撩幽。因?yàn)橄螺d發(fā)生超時(shí)后库继,scrapy會(huì)直接找到scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware模塊的位置350,通知他窜醉,然后消息依次通知后面的比如400,500,550,700等位置的中間件宪萄。如果你的中間件位置在100之類(lèi)的,那是收不到消息的榨惰。
下面附上默認(rèn)中間件的信息
DOWNLOADER_MIDDLEWARES_BASE
{
'scrapy.contrib.downloadermiddleware.robotstxt.RobotsTxtMiddleware': 100,
'scrapy.contrib.downloadermiddleware.httpauth.HttpAuthMiddleware': 300,
'scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware': 350,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 400,
'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 500,
'scrapy.contrib.downloadermiddleware.defaultheaders.DefaultHeadersMiddleware': 550,
'scrapy.contrib.downloadermiddleware.redirect.MetaRefreshMiddleware': 580,
'scrapy.contrib.downloadermiddleware.httpcompression.HttpCompressionMiddleware': 590,
'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': 600,
'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 750,
'scrapy.contrib.downloadermiddleware.chunked.ChunkedTransferMiddleware': 830,
'scrapy.contrib.downloadermiddleware.stats.DownloaderStats': 850,
'scrapy.contrib.downloadermiddleware.httpcache.HttpCacheMiddleware': 900,
}