Scrapy 框架理解
scrapy的架構圖:
組件
Scrapy Engine
引擎負責控制數據流在系統中所有組件中流動,並在相應動作發生時觸發事件。
調度器(Scheduler)
調度器從引擎接受request並將他們入隊,以便之後引擎請求他們時提供給引擎。
下載器(Downloader)
下載器負責獲取頁面數據並提供給引擎,而後提供給spider。
Spiders
Spider是Scrapy用戶編寫用於分析response並提取item(即獲取到的item)或額外跟進的URL的類。 每個spider負責處理一個特定(或一些)網站。 更多內容請看 Spiders 。
Item Pipeline
Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、 驗證及持久化(例如存取到數據庫中)。 更多內容查看 Item Pipeline 。
下載器中間件(Downloader middlewares)
下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的response(也包括引擎傳遞給下載器的Request)。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。更多內容請看 下載器中間件(Downloader Middleware) 。
一句話總結就是:處理下載請求部分
Spider中間件(Spider middlewares)
Spider中間件是在引擎及Spider之間的特定鉤子(specific hook),處理spider的輸入(response)和輸出(items及requests)。 其提供了一個簡便的機制,通過插入自定義代碼來擴展Scrapy功能。更多內容請看 Spider中間件(Middleware) 。
一句話總結就是:處理解析部分
數據流(Data flow)
Scrapy中的數據流由執行引擎控制,其過程如下:
- 引擎打開一個網站(open a domain),找到處理該網站的Spider並向該spider請求第一個要爬取的URL(s)。
- 引擎從Spider中獲取到第一個要爬取的URL並在調度器(Scheduler)以Request調度。
- 引擎向調度器請求下一個要爬取的URL。
- 調度器返回下一個要爬取的URL給引擎,引擎將URL通過下載中間件(請求(request)方向)轉發給下載器(Downloader)。
- 一旦頁面下載完畢,下載器生成一個該頁面的Response,並將其通過下載中間件(返回(response)方向)發送給引擎。
- 引擎從下載器中接收到Response並通過Spider中間件(輸入方向)發送給Spider處理。
- Spider處理Response並返回爬取到的Item及(跟進的)新的Request給引擎。
- 引擎將(Spider返回的)爬取到的Item給Item Pipeline,將(Spider返回的)Request給調度器。
- (從第二步)重復直到調度器中沒有更多地request,引擎關閉該網站。
DownloaderMiddleware主要處理請求Request發出去和結果Response返回的一些回調,
比如說你要加UserAgent,使用代理,修改refferer,添加cookie,或者請求異常超時處理啥的
主要有幾個方法:
process_request
(request, spider)
當每個request通過下載中間件時,該方法被調用,這裏可以修改UA,代理,Refferer
process_response
(request, response, spider) 這裏可以看返回是否是200加入重試機制
process_exception
(request, exception, spider) 這裏可以處理超時
SpiderMiddleware主要處理解析Item的相關邏輯修正,比如數據不完整要添加默認,增加其他額外信息等
process_spider_input
(response, spider)當response通過spider中間件時,該方法被調用,處理該response。
rocess_spider_output
(response, result, spider)
當Spider處理response返回result時,該方法被調用。
process_spider_exception
(response, exception, spider)
當spider或(其他spider中間件的) process_spider_input()
跑出異常時, 該方法被調用。
#轉載於https://blog.csdn.net/xnby/article/details/52297047 侵刪
Scrapy 框架理解