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爲例說明:
- 返回None:將請求傳給後面的中間件的process_request函數繼續處理
- 返回Response:請求不再傳給後面的中間件,而是直接進入最後一箇中間件的process_response函數裏來處理Response對象
- 返回Request:重新開始處理請求,即進入第一個中間件的process_request函數
- Raise IgnoreRequest:斷言請求忽略的異常,直接進入最後一箇中間件的process_exception函數,用該函數來處理這個異常;如果沒有任何中間件的此函數來處理這個異常,則再調用Reuest對象的errorblack回調函數來處理;如果連這個回調都沒有,則引擎直接忽略該異常。
process_response
以圖中的下載中間件3爲例說明:
- 返回Response:將響應交由下一個中間件的process_response函數繼續處理
- 返回Request:請求將重新開始,即進入第一個中間件的process_request函數
- Raise IgnoreRequest:注意此時不會進入process_exception函數,而是調用Reuest對象的errorblack回調函數來處理,如果沒有定義這個回調則忽略。
process_exception
以圖中的下載中間件3爲例說明:
- 返回None:將異常交給下一個中間件的process_exception函數處理
- 返回Response: 將該響應交由最後一箇中間件的process_response函數處理
- 返回Request:重新開始處理請求,即進入第一個中間件的process_request函數
備註:
- 中間件需要安裝才能處理,請記得安裝配置中間件的優先級。
- 中間件的優先級:數字越小越靠近引擎,數字越大越靠近下載器。請求最先從引擎處開始傳遞,逐次經過優先級數字越來越大的中間件;相反,下載器返回響應時,則逐次經過優先級數字越來越小的中間件處理。因此,以上圖爲例:不要認爲一個請求最先是中間件1處理的,那麼響應也會最先由中間件1來處理,這是錯誤的。請求最先由優先級數字最小的中間件來處理,而響應最先由優先級數字最大的中間件處理