Scrapy 是一個為了爬取網站資料,提取結構性資料而編寫的應用架構。 可以應用在包括資料挖掘、資訊處理或存儲曆史資料等一系列的程式中。本文着重介紹 Scrapy 架構及其元件之間的互動。
Scrapy Engine 引擎負責控制資料流在系統中所有元件中流動,并在相應動作發生時觸發事件。 詳細内容檢視下面的資料流(Data Flow)部分。
排程器(Scheduler) 排程器從引擎接受request并将他們入隊,以便之後引擎請求他們時提供給引擎。
下載下傳器(Downloader) 下載下傳器負責擷取頁面資料并提供給引擎,而後提供給spider。
Spiders Spider 是 Scrapy使用者編寫用于分析response并提取item(即擷取到的item)或額外跟進的URL的類。 每個spider負責處理一個特定(或一些)網站。
Item Pipeline Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、 驗證及持久化(例如存取到資料庫中)。
下載下傳器中間件(Downloader middlewares) 下載下傳器中間件是在引擎及下載下傳器之間的特定鈎子(specific hook),處理Downloader傳遞給引擎的response。 其提供了一個簡便的機制,通過插入自定義代碼來擴充Scrapy功能。
Spider中間件(Spider middlewares) Spider中間件是在引擎及Spider之間的特定鈎子(specific hook),處理spider的輸入(response)和輸出(items及requests)。 其提供了一個簡便的機制,通過插入自定義代碼來擴充Scrapy功能。
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,引擎關閉該網站。
關于異步程式設計及Twisted更多的内容請檢視下列連結:
<a href="http://twistedmatrix.com/documents/current/core/howto/defer-intro.html">Introduction to Deferreds in Twisted</a>
<a href="http://jessenoller.com/2009/02/11/twisted-hello-asynchronous-programming/">Twisted – hello, asynchronous programming</a>
原文釋出時間:2017-07-23