Scrapy 源碼剖析(1):架構概覽

在爬蟲開發領域,使用最多的主流語言主要是 Java 和 Python 這兩種,如果你經常使用 Python 開發爬蟲,那麼肯定聽說過 Scrapy 這個開源框架,它正是由 Python 編寫的。

Scrapy 在開源爬蟲框架中名聲非常大,幾乎用 Python 寫爬蟲的人,都用過這個框架。而且業界很多開源的爬蟲框架都是模仿和參考 Scrapy 的思想和架構實現的,如果想深入學習爬蟲,研讀 Scrapy 的源碼還是很有必要的。

從這篇文章開始,我就和你分享一下當時我在做爬蟲時,閱讀 Scrapy 源碼的思路和經驗總結。

這篇文章我們先來介紹一下 Scrapy 的整體架構,從宏觀層面上學習一下 Scrapy 運行的流程。之後的幾篇文章,我會帶你深入到每個模塊,剖析這個框架的實現細節。

介紹

首先,我們先來看一下 Scrapy 的官方是如何介紹它的。從官方網站,我們可以看到 Scrapy 如下定義。

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

也就是說,使用 Scrapy 能幫你快速簡單的編寫一個爬蟲,用來抓取網站數據。

本篇文章不再介紹 Scrapy 的安裝和使用,這個系列主要通過閱讀源碼講解 Scrapy 的實現思路,關於如何安裝和使用的問題,請參考官方網站和官方文檔學習。(注:寫本篇文章時,Scrapy 版本爲 1.2,雖然版本有些低,但與最新版的實現思路基本沒有很大出入。)

使用 Scrapy 開發一個爬蟲非常簡單,這裏使用 Scrapy 官網上的例子來說明如何編寫一個簡單爬蟲:

簡單來講,編寫和運行一個爬蟲只需以下幾步:

  1. 使用 scrapy startproject 命令創建一個爬蟲模板,或自己按模板編寫爬蟲代碼

  2. 定義一個爬蟲類,並繼承 scrapy.Spider,然後重寫 parse 方法

  3. parse 方法裏編寫網頁解析邏輯,以及抓取路徑

  4. 使用 scrapy runspider <spider_file.py> 運行這個爬蟲

可見,使用 Scrapy 編寫簡單的幾行代碼,就能採集到一個網站頁面的數據,非常方便。

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

架構

要想知道 Scrapy 是如何工作的,首先我們來看一下 Scrapy 的架構圖,從宏觀角度來了解一下它是如何運行的:

核心模塊

從架構圖可以看到,Scrapy 主要包含以下五大模塊:

如果你觀察地比較仔細的話,可以看到還有兩個模塊:

瞭解了這些核心模塊,我們再來看使用 Scrapy 時,它內部的採集流程是如何流轉的,也就是說各個模塊是如何交互協作,來完成整個抓取任務的。

運行流程

按照上面架構圖標識出的序號,我們可以看到,Scrapy 運行時的數據流轉大概是這樣的:

  1. 引擎自定義爬蟲中獲取初始化請求(也叫種子 URL);

  2. 引擎把該請求放入調度器中,同時調度器向引擎獲取待下載的請求;

  3. 調度器把待下載的請求發給引擎;

  4. 引擎發送請求給下載器,中間會經過一系列下載器中間件

  5. 這個請求通過下載器下載完成後,生成一個響應對象,返回給引擎,這中間會再次經過一系列下載器中間件

  6. 引擎接收到下載器返回的響應後,發送給爬蟲,中間會經過一系列爬蟲中間件,最後執行爬蟲自定義的解析邏輯

  7. 爬蟲執行完自定義的解析邏輯後,生成結果對象新的請求對象給引擎,再次經過一系列爬蟲中間件

  8. 引擎把爬蟲返回的結果對象交由結果處理器處理,把新的請求通過引擎再交給調度器

  9. 重複執行 1-8,直到調度器中沒有新的請求處理,任務結束;

核心模塊的協作

可見,Scrapy 的架構圖還是比較清晰的,各個模塊之間互相協作,完成抓取任務。

我在讀完它的源碼後,整理出了一個更詳細的核心模塊交互圖,其中展示了更多模塊的相關細節,你可以參考一下:

這裏需要說明一下圖中的 Scrapyer 模塊,其實這也是 Scrapy 的一個核心模塊,但官方的架構圖中沒有展示出來。這個模塊其實是處於 EngineSpidersPipeline 之間,是連接這 3 個模塊的橋樑,我會在後面的源碼分析文章中具體講到。

核心類圖

另外,在讀源碼的過程中,我還整理了這些核心模塊的類圖,這對於你學習源碼會有很大的幫助。

對於這個核心類圖簡單解釋一下:

你在讀源碼的過程中,可以針對這些核心屬性和方法重點關注。

結合官方架構圖以及我總結的核心模塊交互圖、核心類圖,我們可以看到,Scrapy 涉及到的組件主要包括以下這些。

我們先對 Scrapy 整個架構有一個初步認識,在接下來的文章裏,我會針對上述的這些類和方法進行更加詳細的源碼講解。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/mrImc0WTJFSddK_wFHXXnw