日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Scrapy-middlewares對象

作者:lonely-hermit 更新時間: 2022-05-13 編程語言

Scrapy的中間件分為Download Middleware和Spider Middleware

下載中間件,他是處于Request和Response中間的處理模塊

Scheduler調度器從隊列中拿出一個Request發送給Downloader執行下載,這個過程會經過Downloader Middleware的處理。另外,當Downloader將Request下載完成得到Response返回給Spider時會再次經過Downloader Middleware處理。所以整個架構中Download Middleware能起到的作用有以下兩個

在Request執行下載之前,對我們的Request請求進行修改

下載后生成的Response發送給Spider之前,也就是我們可以在生成Resposne被Spider解析之前對其進行修改

Downloader Middleware的功能十分強大,修改User-Agent、處理重定向、設置代理、失敗重試、設置Cookies等功能都需要借助它來實現。

一、說明

需要說明的是,Scrapy其實已經提供了許多Downloader Middleware,比如負責失敗重試、自動重定向等功能的Middleware,它們被DOWNLOADER_MIDDLEWARES_BASE變量所定義。

DOWNLOADER_MIDDLEWARES_BASE變量的內容如下所示:

'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,

這是一個字典格式,字典的鍵名是Scrapy內置的Downloader Middleware的名稱,鍵值代表了調用的優先級,數字小的Downloader Middleware會被優先調用。

如果向己定義Downloader Middleware要添加到項目里,DOWNLOADER_MIDDLEWARES_BASE變量不能直接修改。Scrapy提供了另外一個設置變量DOWNLOADER_MIDDLEWARES,我們直接修改這個變盤就可以添加向己定義的Downloader Middleware,以及禁用DOWNLOADER_MIDDLEWARES_BASE里面定義的Downloader Middleware

二、中間件方法

Scrapy內置的Downloader Middleware為Scrapy提供了基礎的功能,但在項目實戰中我們往往需要單獨定義Downloader Middleware。不用擔心,這個過程非常簡單,我們只需要實現某幾個方法即可。每個Downloader Middleware都定義了一個或多個方法的類,核心的方法有如下三個。

process_request(request, spider)
process_response(request, response, spider)
process_exception(request, exception, spider)

我們只需要實現至少一個方法,就可以定義一個Downloader Middleware。下面我們來看看這三個方法的詳細用法:

2.1、process_request(request, spider)

Request被Scrapy引擎調度給Downloader之前,process_request()方法就會被調用,也就是在Request從隊列里調度出來到Downloader下載執行之前,我們都可以用processrequest()方法對Request進行處理。方法的返回值必須為None、Response對象、Request對象之一,或者拋出IgnoreRequest異常

兩個參數:

request  #是Request對象,即被處理的Request。
spider  #是Spdier對象,即此Request對應的Spider。

返回None,Scrapy將繼續處理該request,執行其他中間件中的相應方法,直到合適的下載器處理函數被調用
返回為Response對象時,更低優先級的Downloader Middleware的process_request()和process_exception()方法就不會被繼續調用,每個Downloader Middleware的process_response()方法轉而被依次調用。調用完畢之后,直接將Response對象發送給Spider來處理。
當返回為Request對象時,更低優先級的Downloader Middleware的process_request()方法會停止執行。這個Request會重新放到調度隊列里,其實它就是一個全新的Request,等待被調度。如果被Scheduler調度了,那么所有的Downloader Middleware的process_request()方法會被重新按照順序執行。(不再使用之前的request對象去下載數據,而是根據現在返回的request對象返回數據,接著執行其他下載器處理函數。)
如果IgnoreRequest異常拋出,則所有的Downloader Middleware的process_exception()方法會依次執行。如果沒有一個方法處理這個異常,那么Request的errorback()方法就會回調。如果該異常還沒有被處理,那么它便會被忽略。(如果這個方法中拋出了異常,則會調用process_exception方法。)

2.2、process_response(request, response, spider)

Downloader執行Request下載之后,會得到對應的Response。Scrapy引擎便會將Response發送給Spider進行解析。在發送之前,我們都可以用process_response()方法來對Response進行處理。方法的返回值必須為Request對象、Response對象之一,或者拋出IgnoreRequest異常。

process_response()方法的參數有如下三個:

request #是Request對象,即此Response對應的Request。
response #是Response對象,即此被處理的Response。
spider #是Spider對象,即此Response對應的Spider。

2.3、process_exception(request, exception, spider)

當Downloader或process_request()方法拋出異常時,例如拋出IgnoreRequest異常,process_exception()方法就會被調用。方法的返回值必須為None、Response對象、Request對象之一。

process_exception()方法的參數有如下三個。

request #是Request對象,即產生異常的Request。
exception #是Exception對象,即拋出的異常。
spdier #是Spider對象,即Request對應的Spider。

原文鏈接:https://blog.csdn.net/weixin_43903639/article/details/122816105

欄目分類
最近更新