SCRAPY中DOWNLOADER_MIDDLEWARES中間件的配置順序

在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ì)依賴于之前(或者之后)執(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,
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容