Scrapy是基於用Python寫的一個流行的事件驅動網絡框架Twisted編寫的。因此,它使用非阻塞(即異步)代碼實現併發。
舊版Scrapy架構圖 :
新版Scrapy架構圖 :
Scrapy中的數據流由執行引擎控制,如下所示:
- Engine獲得從爬行器中爬行的初始請求。
- Engine在調度程序中調度請求,並請求下一次抓取請求。
- 調度程序將下一個請求返回到引擎。
- 引擎將請求發送到下載器,通過下載器中間件(請參閱process_request())。
- 頁面下載完成後,下載器生成一個響應(帶有該頁面)並將其發送給引擎,通過下載器中間件(請參閱process_response())。
- 引擎從下載加載程序接收響應,並將其發送給Spider進行處理,並通過Spider中間件(請參閱process_spider_input())。
- Spider處理響應,並向引擎返回報廢的項和新請求(要跟蹤的),通過Spider中間件(請參閱process_spider_output())。
- 引擎將已處理的項目發送到項目管道,然後將已處理的請求發送到調度程序,並請求可能的下一個請求進行抓取。
- 這個過程重複(從第1步),直到調度程序不再發出請求。
Scrapy各組件介紹:
- Scrapy Engine --- Scrapy引擎 :
Scrapy Engine 負責 Spider、ItemPipeline、Downloader、Scheduler 中間的通訊,信號、數據傳遞等。
- Scheduler --- 調度器 :
Scheduler 負責接收 引擎 發送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給 引擎。
- Downloader --- 下載器 :
Downloader 負責下載 Scrapy Engine(引擎) 發送的所有Requests請求,並將其獲取得到的Responses交還給 Scrapy Engine(引擎) ,由 引擎 交給 Spider 處理,
- spider --- 爬蟲 :
spider 負責處理所有的Responses,從中分析提取數據,獲取Item字段需要的數據,並將需要跟進的URL提交給 引擎,再次進入 Scheduler(調度器),
- Item Pipeline --- 項目管道 :
Item Pipeline 負責處理 Spider 中獲取到的Item,並進行後期處理(詳細分析、過濾、存儲等)的地方。
- Downloader Middlewares --- 下載中間件 :
Downloader Middlewares 可以當作是一個可以自定義擴展下載功能的組件。
- Spider Middlewares --- 爬蟲中間件 :
你可以理解爲是一個可以自定義擴展和操作 引擎 和 Spider 中間 通信 的功能(比如進入 Spider 的Responses,和從 Spider 出去的Requesrs)
使用Spider中間件場景:
- Spider回調的後處理輸出-更改/添加/刪除請求或項;
- 後處理start_requests;
- 處理Spider異常;
- 對一些基於響應內容的請求調用errback而不是回調。
如果您需要執行以下操作之一,請使用下載器中間件:
- 在將請求發送到Downloader之前處理請求(即在Scrapy將請求發送到網站之前);
- 更改在傳遞給Spider之前收到響應;
- 發送一個新的請求,而不是將接收到的響應傳遞給爬行器;
- 將響應傳遞給Spider,而不獲取web頁面;
- 靜靜地丟掉一些請求。
Scrapy的運作流程 :
代碼寫好,程序開始運行 ...
- 引擎 :Hi!Spider ,你要處理哪一 個網站?
- Spider :老大要我處理 xxx .com.T
- 引擎 :你把第一個需要處理的URL給我吧。
- Spider :給你,第一個URL是 xxxxxx .com。
- 引擎 :Hi!調度器,我這有request請求你幫我排序入隊一下。
- 調度器 :好的,正在處理你等一下。
- 引擎 :Hi!調度器 ,把你處理好的request請求給我。
- 調度器 :給你,這是我處理好的request
- 引擎 :Hi!下載器,你按照老大的 下載中間件 的設置幫我下載一下這個request請求
- 下載器 :好的!給你,這是下載好的東西。(如果失敗:sorry,這個request下載失敗了。然後 引擎 告訴 調度器 ,這個request下載失敗了,你記錄一下,我們待會兒再下載)
- 引擎 :Hi!Spider,這是下載好的東西,並且已經按照老大的 下載中間件 處理過了,你自己處理一 下
(注意!這兒responses默認是交給 def parse() 這個函數處理的)
製作Scrapy爬蟲 一共需要4步:
- 新建項目 (scrapyQtartproject xxx):新建一個新的爬蟲項目
- 明確目標 (編寫items.py):明確你想要抓取的目標
- 製作爬蟲 (spiders/xxspider.py):製作爬蟲開始爬取網頁
- 存儲內容( (pipelines.py):設計管道存儲爬取內容