日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

scrapy的Middleware

發布時間:2023/12/15 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scrapy的Middleware 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于下載中間件

settings里的數字大小:

  • process_request的順序 數字越小,越先調用
  • process_response 的順序, 數字越大,越先調用
返回值: process_request: 【None :繼續調用下一個中間件的process_request方法;】          【Response object:預示著下載已經完成,就以返回的response作為下載結果,進而開始調用process_response方法】          【Request object: 將這個請求request添加到任務隊列中,當前的request的process_request流程就結束了,沒有其他操作了】          【拋出IgnoreRequest異常:將調用process_exception(),process_exception()如果沒有處理該異常,則會繼續調用errback來處理,如果errback           中也沒有對它處理的,就會忽視該異常】 process_response : 【Response :這個response可以是傳過來的response,也可以是一個新的response,將繼續調用下一個process_response】           【Request :這個request將被添加到請求隊列,然后該response的process_response流程就結束了】            【拋出IgnoreRequest異常:將調用request.errback方法處理,如果該方法中沒有對此異常進行處理,此異常 將被忽視】
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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。