- 首頁|
- 網(wǎng)校|
- 焚題庫|
- APP |
-
微信公眾號(hào)
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 之前對 Response 進(jìn)行處理。
·我們可以在 Spider 生成的 Request 發(fā)送給 Scheduler 之前,也就是在 Request 發(fā)送給 Scheduler 之前對 Request 進(jìn)行處理。
·我們可以在 Spider 生成的 Item 發(fā)送給 Item Pipeline 之前,也就是在 Item 發(fā)送給 Item Pipeline 之前對 Item 進(jìn)行處理。
1. 使用說明
需要說明的是,Scrapy 其實(shí)已經(jīng)提供了許多 Spider Middleware,它們被 SPIDER_MIDDLEWARES_BASE 這個(gè)變量所定義。
SPIDER_MIDDLEWARES_BASE 變量的內(nèi)容如下:
|
和 Downloader Middleware 一樣,Spider Middleware 首先加入到 SPIDER_MIDDLEWARES 設(shè)置中,該設(shè)置會(huì)和 Scrapy 中 SPIDER_MIDDLEWARES_BASE 定義的 Spider Middleware 合并。然后根據(jù)鍵值的數(shù)字優(yōu)先級排序,得到一個(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 對象,即被處理的 Response;
·spider,即 Spider 對象,即該 response 對應(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 對象,即生成該輸出的 Response;
·result,包含 Request 或 Item 對象的可迭代對象,即 Spider 返回的結(jié)果;
·spider,即 Spider 對象,即其結(jié)果對應(yīng)的 Spider。
process_spider_output() 必須返回包含 Request 或 Item 對象的可迭代對象。
process_spider_exception(response, exception, spider)
當(dāng) Spider 或 Spider Middleware 的 process_spider_input() 方法拋出異常時(shí), 該方法被調(diào)用。
方法的參數(shù)有三個(gè):
·response,即 Response 對象,即異常被拋出時(shí)被處理的 Response;
·exception,即 Exception 對象,被拋出的異常;
·spider,即 Spider 對象,即拋出該異常的 Spider。
process_spider_exception() 必須要么返回 None , 要么返回一個(gè)包含 Response 或 Item 對象的可迭代對象。
如果其返回 None,Scrapy 將繼續(xù)處理該異常,調(diào)用其他 Spider Middleware 中的 process_spider_exception() 方法,直到所有 Spider Middleware 都被調(diào)用。
如果其返回一個(gè)可迭代對象,則其他 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 的可迭代對象,即 Start Requests;
·spider,即 Spider 對象,即 Start Requests 所屬的 Spider。
其必須返回另一個(gè)包含 Request 對象的可迭代對象。
初級會(huì)計(jì)職稱中級會(huì)計(jì)職稱經(jīng)濟(jì)師注冊會(huì)計(jì)師證券從業(yè)銀行從業(yè)會(huì)計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級會(huì)計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級建造師二級建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測工程師建筑八大員注冊建筑師二級造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會(huì)工作者司法考試職稱計(jì)算機(jī)營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護(hù)士資格證初級護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論