您好,登錄后才能下訂單哦!
小編給大家分享一下Python3爬蟲中Spider Middleware的用法,相信大部分人都還不怎么了解,因此分享這篇文章給大家學(xué)習(xí),希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學(xué)習(xí)方法吧!
Spider Middleware 的用法
Spider Middleware 是介入到 Scrapy 的 Spider 處理機(jī)制的鉤子框架。
當(dāng) Downloader 生成 Response 之后,Response 會(huì)被發(fā)送給 Spider,在發(fā)送給 Spider 之前,Response 會(huì)首先經(jīng)過 Spider Middleware 處理,當(dāng) Spider 處理生成 Item 和 Request 之后,Item 和 Request 還會(huì)經(jīng)過 Spider Middleware 的處理。
Spider Middleware 有如下三個(gè)作用:
·我們可以在 Downloader 生成的 Response 發(fā)送給 Spider 之前,也就是在 Response 發(fā)送給 Spider 之前對(duì) Response 進(jìn)行處理。
·我們可以在 Spider 生成的 Request 發(fā)送給 Scheduler 之前,也就是在 Request 發(fā)送給 Scheduler 之前對(duì) Request 進(jìn)行處理。
·我們可以在 Spider 生成的 Item 發(fā)送給 Item Pipeline 之前,也就是在 Item 發(fā)送給 Item Pipeline 之前對(duì) Item 進(jìn)行處理。
1. 使用說明
需要說明的是,Scrapy 其實(shí)已經(jīng)提供了許多 Spider Middleware,它們被 SPIDER_MIDDLEWARES_BASE 這個(gè)變量所定義。
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 設(shè)置中,該設(shè)置會(huì)和 Scrapy 中 SPIDER_MIDDLEWARES_BASE 定義的 Spider Middleware 合并。然后根據(jù)鍵值的數(shù)字優(yōu)先級(jí)排序,得到一個(gè)有序列表。第一個(gè) Middleware 是最靠近引擎的,最后一個(gè) Middleware 是最靠近 Spider 的。
2. 核心方法
Scrapy 內(nèi)置的 Spider Middleware 為 Scrapy 提供了基礎(chǔ)的功能。如果我們想要擴(kuò)展其功能,只需要實(shí)現(xiàn)某幾個(gè)方法即可。
每個(gè) Spider Middleware 都定義了以下一個(gè)或多個(gè)方法的類,核心方法有如下 4 個(gè):
·process_spider_input(response, spider)
·process_spider_output(response, result, spider)
·process_spider_exception(response, exception, spider)
·process_start_requests(start_requests, spider)
只需要實(shí)現(xiàn)其中一個(gè)方法就可以定義一個(gè) Spider Middleware。下面我們來看看這 4 個(gè)方法的詳細(xì)用法。
process_spider_input(response, spider)
當(dāng) Response 通過 Spider Middleware 時(shí),該方法被調(diào)用,處理該 Response。
方法的參數(shù)有兩個(gè):
·response,即 Response 對(duì)象,即被處理的 Response;
·spider,即 Spider 對(duì)象,即該 response 對(duì)應(yīng)的 Spider。
process_spider_input() 應(yīng)該返回 None 或者拋出一個(gè)異常。
如果其返回 None,Scrapy 將會(huì)繼續(xù)處理該 Response,調(diào)用所有其他的 Spider Middleware 直到 Spider 處理該 Response。
如果其拋出一個(gè)異常,Scrapy 將不會(huì)調(diào)用任何其他 Spider Middlewar e 的 process_spider_input() 方法,并調(diào)用 Request 的 errback() 方法。 errback 的輸出將會(huì)以另一個(gè)方向被重新輸入到中間件中,使用 process_spider_output() 方法來處理,當(dāng)其拋出異常時(shí)則調(diào)用 process_spider_exception() 來處理。
process_spider_output(response, result, spider)
當(dāng) Spider 處理 Response 返回結(jié)果時(shí),該方法被調(diào)用。
方法的參數(shù)有三個(gè):
·response,即 Response 對(duì)象,即生成該輸出的 Response;
·result,包含 Request 或 Item 對(duì)象的可迭代對(duì)象,即 Spider 返回的結(jié)果;
·spider,即 Spider 對(duì)象,即其結(jié)果對(duì)應(yīng)的 Spider。
process_spider_output() 必須返回包含 Request 或 Item 對(duì)象的可迭代對(duì)象。
process_spider_exception(response, exception, spider)
當(dāng) Spider 或 Spider Middleware 的 process_spider_input() 方法拋出異常時(shí), 該方法被調(diào)用。
方法的參數(shù)有三個(gè):
·response,即 Response 對(duì)象,即異常被拋出時(shí)被處理的 Response;
·exception,即 Exception 對(duì)象,被拋出的異常;
·spider,即 Spider 對(duì)象,即拋出該異常的 Spider。
process_spider_exception() 必須要么返回 None , 要么返回一個(gè)包含 Response 或 Item 對(duì)象的可迭代對(duì)象。
如果其返回 None,Scrapy 將繼續(xù)處理該異常,調(diào)用其他 Spider Middleware 中的 process_spider_exception() 方法,直到所有 Spider Middleware 都被調(diào)用。
如果其返回一個(gè)可迭代對(duì)象,則其他 Spider Middleware 的 process_spider_output() 方法被調(diào)用, 其他的 process_spider_exception() 將不會(huì)被調(diào)用。
process_start_requests(start_requests, spider)
該方法以 Spider 啟動(dòng)的 Request 為參數(shù)被調(diào)用,執(zhí)行的過程類似于 process_spider_output() ,只不過其沒有相關(guān)聯(lián)的 Response 并且必須返回 Request。
方法的參數(shù)有兩個(gè):
·start_requests,即包含 Request 的可迭代對(duì)象,即 Start Requests;
·spider,即 Spider 對(duì)象,即 Start Requests 所屬的 Spider。
其必須返回另一個(gè)包含 Request 對(duì)象的可迭代對(duì)象。
3. 結(jié)語
本節(jié)介紹了 Spider Middleware 的基本原理和自定義 Spider Middleware 的方法。Spider Middleware 使用的頻率不如 Downloader Middleware 的高,在必要的情況下它可以用來方便數(shù)據(jù)的處理。
以上是Python3爬蟲中Spider Middleware的用法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。