天天看點

強大的爬蟲架構 Scrapy

本節來介紹一個強大的爬蟲架構 Scrapy。Scrapy 是一個基于 Twisted 的異步處理架構,是純 Python 實作的爬蟲架構,其架構清晰,子產品之間的耦合程度低,可擴充性極強,可以靈活完成各種需求。

1. Scrapy的架構

Scrapy 的架構圖如下所示:

強大的爬蟲架構 Scrapy

下面對上圖中的各個元件做介紹:

1. Engine:引擎負責控制資料流在系統所有元件中流動,并在相應動作發生時觸發事件。
2. Scheduler:排程器從引擎接受request并将他們入隊,以便之後引擎請求他們時提供給引擎。
3. Downloader:下載下傳器負責擷取頁面資料并提供給引擎,而後提供給spider。
4. Spiders:Spider 是 Scrapy 使用者編寫用于分析 response 并提取 item(即擷取到的 item)或額外跟進的 URL 的類。 每個 spider 負責處理一個特定(或一些)網站。
5. Item Pipelines:Item Pipeline 負責處理被 spider 提取出來的 item。典型的處理有清理、 驗證及持久化(例如存取到資料庫中)。
6. Downloader Middlewares:下載下傳器中間件是在引擎及下載下傳器之間的特定鈎子(specific hook),處理 Downloader 傳遞給引擎的 response。 其提供了一個簡便的機制,通過插入自定義代碼來擴充 Scrapy 功能。
7. Spider Middlewares:Spider 中間件是在引擎及 Spider 之間的特定鈎子(specific hook),處理 spider 的輸入(response)和輸出(items 及 requests)。 其提供了一個簡便的機制,通過插入自定義代碼來擴充 Scrapy 功能。      

2.元件間的資料流

上述各個元件間的資料流由執行引擎控制,其過程如下:

  1. 引擎從爬蟲得到初始請求。
  2. 引擎在排程器中排程請求,并請求下一個要爬取的請求。
  3. 排程器傳回引擎下一個要爬取的請求。
  4. 通過下載下傳中間件,引擎将請求發送到下載下傳器。
  5. 頁面下載下傳完畢之後,下載下傳器生成一個該頁面的響應,并通過下載下傳中間件發送給引擎。
  6. 引擎收到來自下載下傳器的響應,并通過爬蟲中間件,将它發送到爬蟲進行處理。
  7. 爬蟲處理響應,而後通過爬蟲中間件将抓取到的 items 和新的請求傳回到引擎。
  8. 引擎将處理好的items發送到Item Pipelines,然後發送已處理的請求到排程器,并詢問下個可能的請求。
  9. 這個過程重複進行(從1開始),直到排程器沒有更多的請求。

3.項目建立

  1. scrapy.cfg:它是 Scrapy 項目的配置檔案,其内定義了項目的配置檔案路徑、部署相關資訊等内容。
  2. items.py:它定義 Item 資料結構,所有的 Item 的定義都可以放這裡。
  3. middlewares.py:它定義 Spider Middlewares 和 Downloader Middlewares 的實作。
  4. pipelines.py:它定義 Item Pipeline 的實作,所有的 Item Pipeline 的實作都可以放這裡。
  5. settings.py:它定義項目的全局配置。
  6. spiders:其内包含一個個 Spider 的實作,每個 Spider 都有一個檔案。