1. 程式人生 > >Scrapy研究探索(三)——Scrapy核心架構與代碼執行分析

Scrapy研究探索(三)——Scrapy核心架構與代碼執行分析

動作 rap sdn rep edi 而後 spi download 其它

學習曲線總是這樣,簡單樣例“淺嘗”。在從理論+實踐慢慢攻破。理論永遠是基礎,切記“勿在浮沙築高臺”。


一. 核心架構

關於核心架構。在官方文檔中闡述的非常清晰,地址:http://doc.scrapy.org/en/latest/topics/architecture.html。

英文有障礙可查看中文翻譯文檔。筆者也參與了Scraoy部分文檔的翻譯。我的翻譯GitHub地址:https://github.com/younghz/scrapy_doc_chs。源repo地址:https://github.com/marchtea/scrapy_doc_chs。

以下就直接轉載部分文檔(地址:http://scrapy-chs.readthedocs.org/zh_CN/latest/topics/architecture.html):


概述

接下來的圖表展現了Scrapy的架構,包含組件及在系統中發生的數據流的概覽(綠色箭頭所看到的)。

以下對每一個組件都做了簡介,並給出了具體內容的鏈接。

數據流例如以下所描寫敘述。

技術分享圖片

Scrapy architecture

組件
Scrapy Engine
引擎負責控制數據流在系統中全部組件中流動,並在相應動作發生時觸發事件。 具體內容查看以下的數據流(Data Flow)部分。

調度器(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。

其提供了一個簡便的機制。通過插入自己定義代碼來擴展Scrapy功能。很多其它內容請看 下載器中間件(Downloader Middleware) 。



Spider中間件(Spider middlewares)
Spider中間件是在引擎及Spider之間的特定鉤子(specific hook)。處理spider的輸入(response)和輸出(items及requests)。 其提供了一個簡便的機制。通過插入自己定義代碼來擴展Scrapy功能。很多其它內容請看 Spider中間件(Middleware) 。



數據流(Data flow)

Scrapy中的數據流由執行引擎控制,其步驟例如以下:

1.引擎打開一個站點(open a domain),找到處理該站點的Spider並向該spider請求第一個要爬取的URL(s)。
2.引擎從Spider中獲取到第一個要爬取的URL並在調度器(Scheduler)以Request調度。


3.引擎向調度器請求下一個要爬取的URL。
4.調度器返回下一個要爬取的URL給引擎,引擎將URL通過下載中間件(請求(request)方向)轉發給下載器(Downloader)。
5.一旦頁面完成下載。下載器生成一個該頁面的Response,並將其通過下載中間件(返回(response)方向)發送給引擎。
6.引擎從下載器中接收到Response並通過Spider中間件(輸入方向)發送給Spider處理。
7.Spider處理Response並返回爬取到的Item及(跟進的)新的Request給引擎。


8.引擎將(Spider返回的)爬取到的Item給Item Pipeline,將(Spider返回的)Request給調度器。
9.(從第二步)反復直到調度器中沒有很多其它地request,引擎關閉該站點。


二. 數據流與代碼執行分析


這裏主要分析數據流部分並與代碼結合起來。與上面的流程1-9相應。

(1)找spider——在spider目錄下查找相關定義爬蟲文件
(2)引擎獲取URL——自己定義spider中start_urls列表中獲取
(3)...
(4)...
(5)通過(3)(4)(5)就在內部實現了依據URL生成request。下載器依據request生成response這個過程。即URL-》request-》reponse。
(6)...
(7)在自己定義spider中調用默認的parse()方法或是制定的parse_*()方法處理接收到的reponse,處理的結果非常重要:

第一個,抽取item值。

第二個,假設須要繼續爬取。這裏會返回request給引擎。(這是“自己主動”爬取多個網頁的關鍵)。

(8)(9)引擎繼續調度。直至無request。


進階:

Scrapy架構呈現星型拓撲結構。“引擎”作為整個架構的核心協調、控制整個系統的執行。


原創,轉載註明:http://blog.csdn.net/u012150179/article/details/34441655

Scrapy研究探索(三)——Scrapy核心架構與代碼執行分析