scrapy的Middleware
生活随笔
收集整理的這篇文章主要介紹了
scrapy的Middleware
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)于下載中間件
settings里的數(shù)字大小:
- process_request的順序 數(shù)字越小,越先調(diào)用
- process_response 的順序, 數(shù)字越大,越先調(diào)用
process_exception : 【None : 繼續(xù)調(diào)用其他process_exception處理這個(gè)異常】 【Response object:開(kāi)始調(diào)用process_response方法】 【Request object: 此request將被添加到請(qǐng)求隊(duì)列,process_exception流程就結(jié)束了】
process_exception是在下載處理器(download handler)或下載中間件的process_request拋出異常時(shí)被調(diào)用的。 from_crawler : 這個(gè)方法是scrapy的核心屬性的一個(gè)入口,用于創(chuàng)建中間件實(shí)例 。如果需要用到signals,settings,spiders等,可以通過(guò)crawler.settings這種操作來(lái) 獲取,cls(crawler.stats)是調(diào)用這個(gè)方法所在的class來(lái)實(shí)例化一個(gè)對(duì)象,crawler.stats相當(dāng)于傳給__init__(self,stats)的參數(shù)stats @classmethod from_crawler(cls,crawler): instance = cls(crawler.stats) return instance? 自定義retry中間件 from scrapy.downloadermiddlewares.retry import RetryMiddleware import time? class CustomRetryMiddleware(RetryMiddleware): ? ? ? def __init__(self,settings): ? ? ? ? self.request_error = 0 ? ? ? ? super(CustomRetryMiddleware, self).__init__(settings) ? ? def process_response(self, request, response, spider): ? ? ? ? if request.meta.get('dont_retry', False): ? ? ? ? ? ? return response ? ? ? ? if response.status in self.retry_http_codes: ? ? ? ? ? ? if response.status==429: #在這里可以添加一些邏輯,在重試請(qǐng)求之前, ? ? ? ? ? ? ? ? spider.logger.info("[response]retry Middleware,Got 429 error,would stop 6 minutes,%s",request.url) ? ? ? ? ? ? ? ? time.sleep(60*6) ? ? ? ? ? ? spider.logger.info("[response]Retry Middleware ,response.status :%d,will start retry request,%s",response.status,request.url) ? ? ? ? ? ? reason = response_status_message(response.status) ? ? ? ? ? ? return self._retry(request, reason, spider) or response ? ? ? ? return response ? ? ? ? def process_exception(self, request, exception, spider): ? ? ? ? if isinstance(exception, self.EXCEPTIONS_TO_RETRY) \ ? ? ? ? ? ? ? ? and not request.meta.get('dont_retry', False): ? ? ? ? ? ? spider.logger.info("[exception]Retry Middleware ,exception :%s,will start retry request,%s",exception,request.url) ? ? ? ? ? ? #返回一個(gè)request,到schedule中,等待下載,從重新走所有的middleware。? ?? ? ? ? ? ? ? return self._retry(request, exception, spider) ?
?
要啟用自定義的retry middleware ,需要將默認(rèn)的RetryMiddleware設(shè)置為None
'DOWNLOADER_MIDDLEWARES' :{
'dayspider.middlewares.my_retry_middleware.CustomRetryMiddleware': 550,
'scrapy.downloadermiddlewares.retry.RetryMiddleware' : None,
},
?
下載異常
- 像是 響應(yīng)超時(shí),網(wǎng)絡(luò)連接異常, forbidden 502這類的沒(méi)有response的異常? 直接被process_exception 捕獲
- 像是 429(請(qǐng)求太頻繁,403(禁止訪問(wèn))500(服務(wù)器端返回一個(gè)表示錯(cuò)誤的代碼),有收到response的異常,可以用process_response進(jìn)行處理
?
轉(zhuǎn)載于:https://www.cnblogs.com/Ting-light/p/9582843.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的scrapy的Middleware的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mydrivers指的是什么文件
- 下一篇: rsync定时任务引起cpu负载高