架構介紹
五個元件
- Scrapy Engine(Scrapy引擎)
- Scheduler(排程器)
- Downloader(下載下傳器)
- Spiders(蜘蛛)
- Item Pipeline(項目管道)
五大元件及其中間件的功能如下:
- Scrapy引擎:控制整個系統的資料處理流程,觸發事務處理流程,負責串聯各個子產品
- Scheduler(排程器):維護待爬取的URL隊列,當接受引擎發送的請求時,會從待爬取的URL隊列中取出下一個URL傳回給排程器(Scheduler)。
- Downloader(下載下傳器):向該網絡伺服器發送下載下傳頁面的請求,用于下載下傳網頁内容,并将網頁内容交與蜘蛛(Spiders)去處理。
- Spiders(蜘蛛):制定要爬取的網站位址,選擇所需資料内容,定義域名過濾規則和網頁的解析規則等。
- Item Pipeline(項目管道):處理由蜘蛛(Spiders)從網頁中抽取的資料,主要任務是清洗、驗證、過濾、去重和存儲資料等。
-
Middlewares(中間件):中間件是處于Scrapy引擎和Scheduler,Downloader,Spiders之間的構件,主要是處理它們之間的請求及響應。
Downloader Middlewares,下載下傳器中間件,位于引擎和下載下傳器之間的鈎子架構,主要是處理引擎與下載下傳器之間的請求及響應。
Spider Middlewares, 蜘蛛中間件,位于引擎和蜘蛛之間的鈎子架構,主要工作是處理蜘蛛輸入的響應和輸出的結果及新的請求。
- 項目(Item):它定義了爬取結果的資料結構,爬取的資料會被指派成該對象。
爬取過程
Scrapy引擎發送請求,之後排程器(Scheduler)把初始URL交給下載下傳器(Downloader),然後下載下傳器(Downloader)向伺服器發送服務請求,得到響應後将下載下傳的網頁内容交與蜘蛛(Spiders)來處理,然後蜘蛛會對網頁進行詳細的解析。蜘蛛分析的結果有兩種:一種是得到新的URL,之後再次請求排程器,開始進行新一輪的爬取,不斷的重複上述過程;另一種是得到所需的資料,之後會轉交給項目管道繼續處理。項目管道負責資料的清洗、驗證、過濾、去重和存儲等後期處理,最後由Pipeline輸出到檔案中,或者存入資料庫等。
補:
Scrapy 中的資料流由引擎控制,其過程如下:
- Engine 首先打開一個網站,找到處理該網站的 Spider 并向該 Spider 請求第一個要爬取的 URL。
- Engine 從 Spider 中擷取到第一個要爬取的 URL 并通過 Scheduler 以 Request 的形式排程。
- Engine 向 Scheduler (排程器)請求下一個要爬取的 URL。
- Scheduler(排程器) 傳回下一個要爬取的 URL 給 Engine,Engine 将 URL 通過 Downloader Middlewares (下載下傳器中間件)轉發給 Downloader (下載下傳器)下載下傳。
- 一旦頁面下載下傳完畢, Downloader(下載下傳器) 生成一個該頁面的 Response,并将其通過 Downloader Middlewares (下載下傳器中間件)發送給 Engine。
- Engine 從下載下傳器中接收到 Response(響應) 并通過 Spider Middlewares 發送給 Spider 處理。
- Spider(蜘蛛) 處理 Response (響應)并傳回爬取到的 Item(項目) 及新的 Request (請求)給 Engine。
- 重複第二步到最後一步,直到 Scheduler(排程器) 中沒有更多的 Request(請求),Engine 關閉該網站,爬取結束。
通過多個元件的互相協作、不同元件完成工作的不同、元件對異步處理的支援,Scrapy 最大限度地利用了網絡帶寬,大大提高了資料爬取和處理的效率。
項目結構
Scrapy 架構和 pyspider 不同,它是通過指令行來建立項目的,代碼的編寫還是需要 IDE。項目建立之後,項目檔案結構如下所示:
在此要将各個檔案的功能描述如下:
- scrapy.cfg:它是 Scrapy 項目的配置檔案,其内定義了項目的配置檔案路徑、部署相關資訊等内容。
- items.py:它定義 Item 資料結構,所有的 Item 的定義都可以放這裡。
- pipelines.py:它定義 Item Pipeline 的實作,所有的 Item Pipeline 的實作都可以放這裡。
- settings.py:它定義項目的全局配置。
- middlewares.py:它定義 Spider Middlewares 和 Downloader Middlewares 的實作。
- spiders:其内包含一個個 Spider 的實作,每個 Spider 都有一個檔案。
參考文章:
一篇文章教會你了解Scrapy網絡爬蟲架構的工作原理和資料采集過程《Python 3 網絡爬蟲開發實戰》13.1-Scrapy架構介紹