Scrapy原始碼閱讀分析_1_整體框架和流程介紹

擒賊先擒王發表於2019-02-19

 

From:https://blog.csdn.net/weixin_37947156/article/details/74435304

Scrapy github 下載地址:https://github.com/scrapy/scrapy

 

 

介紹

 

Scrapy是一個基於Python編寫的一個開源爬蟲框架,它可以幫你快速、簡單的方式構建爬蟲,並從網站上提取你所需要的資料。

這裡不再介紹Scrapy的安裝和使用,本系列主要通過閱讀原始碼講解Scrapy實現思路為主。

如果有不懂如何使用的同學,請參考官方網站或官方文件學習。

------------------------------------------------------------------------------------------
scrapy 中文文件 和 scrapy 英文文件參照看。因為中文文件比較老,英文文件是最新的。
scrapy 英文文件:https://doc.scrapy.org/en/latest
scrapy 中文文件:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html
高效能爬蟲 Scrapy 框架:https://www.cnblogs.com/wwg945/articles/9021888.html
------------------------------------------------------------------------------------------

簡單來說構建和執行一個爬蟲只需完成以下幾步:

  1. 使用 scrapy startproject spider_project 建立爬蟲模板或自己編寫爬蟲指令碼
  2. 爬蟲類 繼承 scrapy.Spider,重寫 parse 方法
  3. parse 方法中 yield 或 return 字典、Request、Item
  4. 使用 scrapy crawl <spider_name>scrapy runspider <spider_file.py>執行

經過簡單的幾行程式碼,就能採集到某個網站下一些頁面的資料,非常方便。

但是在這背後到底發生了什麼?Scrapy到底是如何幫助我們工作的呢?

 

 

 

架構

 

來看一看 Scrapy 的架構圖:

 

 

 

核心元件

 

Scrapy有以下幾大元件:

  1. Scrapy Engine:核心引擎,負責控制和排程各個元件,保證資料流轉;
  2. Scheduler:負責管理任務、過濾任務、輸出任務的排程器,儲存、去重任務都在此控制;
  3. Downloader:下載器,負責在網路上下載網頁資料,輸入待下載URL,輸出下載結果;
  4. Spiders:使用者自己編寫的爬蟲指令碼,可自定義抓取意圖;
  5. Item Pipeline:負責輸出結構化資料,可自定義輸出位置;

除此之外,還有兩大中介軟體元件:

  1. Downloader middlewares:介於引擎和下載器之間,可以在網頁在下載前、後進行邏輯處理;
  2. Spider middlewares:介於引擎和爬蟲之間,可以在呼叫爬蟲輸入下載結果和輸出請求/資料時進行邏輯處理;

 

 

 

資料流轉

 

按照架構圖的序號,資料流轉大概是這樣的:

  1. 引擎從自定義爬蟲中獲取初始化請求(也叫種子URL);
  2. 引擎把該請求放入排程器中,同時引擎向排程器獲取一個待下載的請求(這兩部是非同步執行的);
  3. 排程器返回給引擎一個待下載的請求;
  4. 引擎傳送請求給下載器,中間會經過一系列下載器中介軟體;
  5. 這個請求通過下載器下載完成後,生成一個響應物件,返回給引擎,這中間會再次經過一系列下載器中介軟體;
  6. 引擎接收到下載返回的響應物件後,然後傳送給爬蟲,執行自定義爬蟲邏輯,中間會經過一系列爬蟲中介軟體;
  7. 爬蟲執行對應的回撥方法,處理這個響應,完成使用者邏輯後,會生成結果物件或新的請求物件給引擎,再次經過一系列爬蟲中介軟體;
  8. 引擎把爬蟲返回的結果物件交由結果處理器處理,把新的請求物件通過引擎再交給排程器;
  9. 從1開始重複執行,直到排程器中沒有新的請求處理;

 

 

 

核心元件互動圖

 

我在讀完原始碼後,整理出一個更詳細的架構圖,其中展示了更多相關元件的細節:

這裡需要說明一下圖中的Scrapyer,其實這也是在原始碼的一個核心類,但官方架構圖中沒有展示出來,這個類其實是處於EngineSpidersPipeline之間,是連通這3個元件的橋樑,後面在文章中會具體講解。

 

 

 

核心類圖

 

涉及到的一些核心類如下:

其中標沒有樣式的黑色文字是類的核心屬性黃色樣式的文字都是核心方法

可以看到,Scrapy的核心類,其實主要包含5大元件、4大中介軟體管理器、爬蟲類和爬蟲管理器、請求、響應物件和資料解析類這幾大塊。

 

 

 

相關文章