十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
小編給大家分享一下Python3爬蟲中Spider Middleware的用法,相信大部分人都還不怎么了解,因此分享這篇文章給大家學習,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學習方法吧!
Spider Middleware 的用法
Spider Middleware 是介入到 Scrapy 的 Spider 處理機制的鉤子框架。
當 Downloader 生成 Response 之后,Response 會被發(fā)送給 Spider,在發(fā)送給 Spider 之前,Response 會首先經(jīng)過 Spider Middleware 處理,當 Spider 處理生成 Item 和 Request 之后,Item 和 Request 還會經(jīng)過 Spider Middleware 的處理。
Spider Middleware 有如下三個作用:
·我們可以在 Downloader 生成的 Response 發(fā)送給 Spider 之前,也就是在 Response 發(fā)送給 Spider 之前對 Response 進行處理。
·我們可以在 Spider 生成的 Request 發(fā)送給 Scheduler 之前,也就是在 Request 發(fā)送給 Scheduler 之前對 Request 進行處理。
·我們可以在 Spider 生成的 Item 發(fā)送給 Item Pipeline 之前,也就是在 Item 發(fā)送給 Item Pipeline 之前對 Item 進行處理。
1. 使用說明
需要說明的是,Scrapy 其實已經(jīng)提供了許多 Spider Middleware,它們被 SPIDER_MIDDLEWARES_BASE 這個變量所定義。
SPIDER_MIDDLEWARES_BASE 變量的內(nèi)容如下:
{ 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50, 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500, 'scrapy.spidermiddlewares.referer.RefererMiddleware': 700, 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800, 'scrapy.spidermiddlewares.depth.DepthMiddleware': 900, }
和 Downloader Middleware 一樣,Spider Middleware 首先加入到 SPIDER_MIDDLEWARES 設置中,該設置會和 Scrapy 中 SPIDER_MIDDLEWARES_BASE 定義的 Spider Middleware 合并。然后根據(jù)鍵值的數(shù)字優(yōu)先級排序,得到一個有序列表。第一個 Middleware 是最靠近引擎的,最后一個 Middleware 是最靠近 Spider 的。
2. 核心方法
Scrapy 內(nèi)置的 Spider Middleware 為 Scrapy 提供了基礎的功能。如果我們想要擴展其功能,只需要實現(xiàn)某幾個方法即可。
每個 Spider Middleware 都定義了以下一個或多個方法的類,核心方法有如下 4 個:
·process_spider_input(response, spider)
·process_spider_output(response, result, spider)
·process_spider_exception(response, exception, spider)
·process_start_requests(start_requests, spider)
只需要實現(xiàn)其中一個方法就可以定義一個 Spider Middleware。下面我們來看看這 4 個方法的詳細用法。
process_spider_input(response, spider)
當 Response 通過 Spider Middleware 時,該方法被調(diào)用,處理該 Response。
方法的參數(shù)有兩個:
·response,即 Response 對象,即被處理的 Response;
·spider,即 Spider 對象,即該 response 對應的 Spider。
process_spider_input() 應該返回 None 或者拋出一個異常。
如果其返回 None,Scrapy 將會繼續(xù)處理該 Response,調(diào)用所有其他的 Spider Middleware 直到 Spider 處理該 Response。
如果其拋出一個異常,Scrapy 將不會調(diào)用任何其他 Spider Middlewar e 的 process_spider_input() 方法,并調(diào)用 Request 的 errback() 方法。 errback 的輸出將會以另一個方向被重新輸入到中間件中,使用 process_spider_output() 方法來處理,當其拋出異常時則調(diào)用 process_spider_exception() 來處理。
process_spider_output(response, result, spider)
當 Spider 處理 Response 返回結(jié)果時,該方法被調(diào)用。
方法的參數(shù)有三個:
·response,即 Response 對象,即生成該輸出的 Response;
·result,包含 Request 或 Item 對象的可迭代對象,即 Spider 返回的結(jié)果;
·spider,即 Spider 對象,即其結(jié)果對應的 Spider。
process_spider_output() 必須返回包含 Request 或 Item 對象的可迭代對象。
process_spider_exception(response, exception, spider)
當 Spider 或 Spider Middleware 的 process_spider_input() 方法拋出異常時, 該方法被調(diào)用。
方法的參數(shù)有三個:
·response,即 Response 對象,即異常被拋出時被處理的 Response;
·exception,即 Exception 對象,被拋出的異常;
·spider,即 Spider 對象,即拋出該異常的 Spider。
process_spider_exception() 必須要么返回 None , 要么返回一個包含 Response 或 Item 對象的可迭代對象。
如果其返回 None,Scrapy 將繼續(xù)處理該異常,調(diào)用其他 Spider Middleware 中的 process_spider_exception() 方法,直到所有 Spider Middleware 都被調(diào)用。
如果其返回一個可迭代對象,則其他 Spider Middleware 的 process_spider_output() 方法被調(diào)用, 其他的 process_spider_exception() 將不會被調(diào)用。
process_start_requests(start_requests, spider)
該方法以 Spider 啟動的 Request 為參數(shù)被調(diào)用,執(zhí)行的過程類似于 process_spider_output() ,只不過其沒有相關聯(lián)的 Response 并且必須返回 Request。
方法的參數(shù)有兩個:
·start_requests,即包含 Request 的可迭代對象,即 Start Requests;
·spider,即 Spider 對象,即 Start Requests 所屬的 Spider。
其必須返回另一個包含 Request 對象的可迭代對象。
3. 結(jié)語
本節(jié)介紹了 Spider Middleware 的基本原理和自定義 Spider Middleware 的方法。Spider Middleware 使用的頻率不如 Downloader Middleware 的高,在必要的情況下它可以用來方便數(shù)據(jù)的處理。
以上是Python3爬蟲中Spider Middleware的用法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)-成都網(wǎng)站建設公司行業(yè)資訊頻道!