Scrapy爬蟲之下載中間件的處理流程

在這裏插入圖片描述
scrapy的下載中間件都有三個函數:

函數 返回對象
process_request 1.None
2.Response
3.Request
4.Raise IgnoreRequest
process_response A.Response
B.Request
C.Raise IgnoreRequest
process_exception i.None
ii.Response
iii.Request

process_request

以圖中的下載中間件2爲例說明:

  1. 返回None:將請求傳給後面的中間件的process_request函數繼續處理
  2. 返回Response:請求不再傳給後面的中間件,而是直接進入最後一箇中間件的process_response函數裏來處理Response對象
  3. 返回Request:重新開始處理請求,即進入第一個中間件的process_request函數
  4. Raise IgnoreRequest:斷言請求忽略的異常,直接進入最後一箇中間件的process_exception函數,用該函數來處理這個異常;如果沒有任何中間件的此函數來處理這個異常,則再調用Reuest對象的errorblack回調函數來處理;如果連這個回調都沒有,則引擎直接忽略該異常。

process_response

以圖中的下載中間件3爲例說明:

  1. 返回Response:將響應交由下一個中間件的process_response函數繼續處理
  2. 返回Request:請求將重新開始,即進入第一個中間件的process_request函數
  3. Raise IgnoreRequest:注意此時不會進入process_exception函數,而是調用Reuest對象的errorblack回調函數來處理,如果沒有定義這個回調則忽略。

process_exception

以圖中的下載中間件3爲例說明:

  1. 返回None:將異常交給下一個中間件的process_exception函數處理
  2. 返回Response: 將該響應交由最後一箇中間件的process_response函數處理
  3. 返回Request:重新開始處理請求,即進入第一個中間件的process_request函數

備註:

  1. 中間件需要安裝才能處理,請記得安裝配置中間件的優先級。
  2. 中間件的優先級:數字越小越靠近引擎,數字越大越靠近下載器。請求最先從引擎處開始傳遞,逐次經過優先級數字越來越大的中間件;相反,下載器返回響應時,則逐次經過優先級數字越來越小的中間件處理。因此,以上圖爲例:不要認爲一個請求最先是中間件1處理的,那麼響應也會最先由中間件1來處理,這是錯誤的。請求最先由優先級數字最小的中間件來處理,而響應最先由優先級數字最大的中間件處理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章