华南俳烁实业有限公司

python

當(dāng)前位置:中華考試網(wǎng) >> python >> python爬蟲 >> 文章內(nèi)容

Python3爬蟲入門:SpiderMiddleware的用法

來源:中華考試網(wǎng)  [2020年10月21日]  【

  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)容如下:

1

2

3

4

5

6

7

{

    '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)先級排序,得到一個(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 對象的可迭代對象。

python課程免費(fèi)試聽預(yù)約

  • 地區(qū):
  • 姓名:
  • 手機(jī):
責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
明溪县| 特克斯县| 西乌珠穆沁旗| 彰化市| 黎川县| 泰和县| 龙游县| 巢湖市| 上杭县| 田东县| 肥城市| 黄骅市| 化德县| 湟源县| 井冈山市| 旬阳县| 将乐县| 吕梁市| 大悟县| 贵德县| 慈溪市| 沂水县| 姚安县| 合阳县| 望江县| 文登市| 商水县| 鄢陵县| 仪征市| 康定县| 灵宝市| 偃师市| 固镇县| 邯郸县| 邯郸市| 渝中区| 泗水县| 文山县| 棋牌| 辰溪县| 兴义市|