scrapy的Middleware
生活随笔
收集整理的這篇文章主要介紹了
scrapy的Middleware
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于下載中間件
settings里的數字大小:
- process_request的順序 數字越小,越先調用
- process_response 的順序, 數字越大,越先調用
process_exception : 【None : 繼續調用其他process_exception處理這個異常】 【Response object:開始調用process_response方法】 【Request object: 此request將被添加到請求隊列,process_exception流程就結束了】
process_exception是在下載處理器(download handler)或下載中間件的process_request拋出異常時被調用的。 from_crawler : 這個方法是scrapy的核心屬性的一個入口,用于創建中間件實例 。如果需要用到signals,settings,spiders等,可以通過crawler.settings這種操作來 獲取,cls(crawler.stats)是調用這個方法所在的class來實例化一個對象,crawler.stats相當于傳給__init__(self,stats)的參數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: #在這里可以添加一些邏輯,在重試請求之前, ? ? ? ? ? ? ? ? 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) ? ? ? ? ? ? #返回一個request,到schedule中,等待下載,從重新走所有的middleware。? ?? ? ? ? ? ? ? return self._retry(request, exception, spider) ?
?
要啟用自定義的retry middleware ,需要將默認的RetryMiddleware設置為None
'DOWNLOADER_MIDDLEWARES' :{
'dayspider.middlewares.my_retry_middleware.CustomRetryMiddleware': 550,
'scrapy.downloadermiddlewares.retry.RetryMiddleware' : None,
},
?
下載異常
- 像是 響應超時,網絡連接異常, forbidden 502這類的沒有response的異常? 直接被process_exception 捕獲
- 像是 429(請求太頻繁,403(禁止訪問)500(服務器端返回一個表示錯誤的代碼),有收到response的異常,可以用process_response進行處理
?
轉載于:https://www.cnblogs.com/Ting-light/p/9582843.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的scrapy的Middleware的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mydrivers指的是什么文件
- 下一篇: [JS]string.substr(st