91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中Spider Middleware的使用方法

發布時間:2021-10-09 17:15:29 來源:億速云 閱讀:191 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關Python中Spider Middleware的使用方法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

前言

大部分人的身上,有一種近乎無解的矛盾——

★  

想要養成早起的習慣,卻一不小心刷手機到凌晨兩點;

看到一篇干貨文章,第一反應是加收藏夾下次再看(收藏從未停止,學習從未開始。/ 收藏==學會);

想要瘦身塑形,卻在深夜破功:“吃飽了才有力氣減肥”;

看到一門不錯的課程,卻還是告訴自己有時間了再學......

”    

Spider Middleware的使用方法

Spider Middleware是介入到Scrapy的Spider處理機制的鉤子框架。

當Downloader生成Response之后,Response會被發送給Spider,在發送Spider之前,Response會首先經過Spider Middleware處理,當Spider處理生成Item和Request之后,Item和Request還會經過Spider Middleware的處理。

Spider Middleware有如下三個作用:

  • 我們可以在Downloader生成Response發送給Spider之前,也就是Response發送給Spider之前對Response進行處理。
  • 我們可以Spider生成Request發送給Scheduler之前,也就是Request發送給Scheduler之前對Request進行處理。
  • 我們可以在Spider生成Item發送給Item Pipeline之前,也就是Item發送給Item Pipeline之前對Item進行處理。
 

使用說明

需要說明的是Scrapy其實已經提供了許多Spider Middleware,它們被SPIDER_MIDDLEWARES_BASE這個變量所定義。

SPIDER_MIDDLEWARE_BASE變量內容如下:

{
    '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合并。然后根據鍵值的數字優先級排序,得到一個有序列表。第一個Middleware是最靠近引擎的,最后一個MIddleware是最靠近Spider的。

 

核心方法

Scrapy內置的Spider Middleware為Spider提供了基礎功能。如果我們想要拓展其功能,只需要實現某個方法即可。

每個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)
 

process_spider_input(response, spider)

當Response通過Spider Middleware時,該方法被調用,處理該Response。

方法的參數有兩個:

  • response:即Response對象,即被處理的Response
  • Spider:即Spider對象,即該Response對應的Spider

process_spider_input()應該返回None或拋出異常。

  • 如果返回None,Scrapy將繼續處理該Response,調用其他的Spider Middleware直到Spider處理該Response。
  • 如果拋出一個異常,Scrapy將不會調用任何其他Spider Middleware的process_spider_input()的方法,并調用Request的errback()方法。errback()的輸出將會以另一個方向被重新輸入到中間件中,使用process_spider-output()方法來處理,當其拋出異常時,則調用process_spider_exception()來處理。
 

process_spider_output(response, result, spider)

當Spider處理Response返回結果時,該方法被調用。

方法的參數有三個:

  • response,即Response對象,即生成該輸出的Response;
  • result,包含Request或Item對象的可迭代對象,即Spider返回的結果;
  • spider,即Spider對象,即其結果對應的Spider。

process_spider_output()必須返回包含Request或Item對象的可迭代對象。

 

process_spider_exception(response, exception, spider)

當Spider或Spider Middleware的process_spider_input()方法拋出異常時,該方法被調用。

方法的參數有三個:

  • response,即Response對象,即異常被拋出時被處理的Response。
  • exception,即Exception對象,被拋出的異常。
  • spider,即Spider對象,即拋出異常的Spider

process_spider_exception()要么返回None,要么返回一個包含Response或Item對象的可迭代對象。

  • 如果其返回None,Scrapy將繼續處理該異常,調用其他Spider Middleware中的process_spider_exception()方法,直到所有的Spider Middleware被調用。
  • 如果返回一個可迭代對象,則其他的Spider Middleware的process_spider_output()方法被調用,其他的process_spider_exception()將不會被調用。
 

process_start_requests(start_requests, spider)

該方法以Spider啟動的Request為參數被調用,執行的過程類似于process_spider_output(),只不過其他沒有相關聯的Response并且必須返回Request。

方法的參數有兩個:

  • start_requests,即包含Request的可迭代對象,即Start Requests
  • spider,即Spider對象,即Start Requests所屬的Spider

其必須返回一個包含Request對象的可迭代對象。

 

開啟Spider Middleware

每當我們創建一個新的項目的時候,就會生成一個middlewares.py的文件,在這個文件中有一個類:MiddletestSpiderMiddleware,這個類與我們創建的項目名相關,我創建的項目名為``Middletest`。因此,當我們修改這個項目名的時候,這個類名也要跟著修改。

在這個類中,里面就有我們上面所描述的四個核心方法。

我們要開啟這個Spider Middleware,可以到settings.py里面去開啟:

# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
SPIDER_MIDDLEWARES = {
    'middletest.middlewares.MiddletestSpiderMiddleware': 543,
}

只需要取消注釋即可。

看完上述內容,你們對Python中Spider Middleware的使用方法有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蕲春县| 峨山| 玛纳斯县| 古交市| 茌平县| 惠州市| 雷山县| 太原市| 台东县| 承德市| 长岭县| 长垣县| 连云港市| 青田县| 博乐市| 广昌县| 宣威市| 蛟河市| 伊宁县| 阜平县| 兴隆县| 邓州市| 三明市| 泰州市| 淮滨县| 岱山县| 锡林郭勒盟| 鄯善县| 龙陵县| 肇庆市| 青州市| 沙湾县| 壤塘县| 峡江县| 通渭县| 大渡口区| 双峰县| 大庆市| 蓬安县| 合肥市| 罗江县|