Scrapy是一個基於Twisted的非同步處理框架,是純Python實現的爬蟲框架,其架構清晰,模組之間的耦合程度低,可擴充套件性極強,可以靈活完成各種需求。我們只需要定製開發幾個模組就可以輕鬆實現一個爬蟲。
1. 架構介紹
首先我們看看Scrapy框架的架構,如下圖所示。
它可以分為如下的幾個部分。
Engine。引擎,處理整個系統的資料流處理、觸發事務,是整個框架的核心。
Item。專案,它定義了爬取結果的資料結構,爬取的資料會被賦值成該Item物件。
Scheduler。排程器,接受引擎發過來的請求並將其加入佇列中,在引擎再次請求的時候將請求提供給引擎。
Downloader。下載器,下載網頁內容,並將網頁內容返回給蜘蛛。
Spiders。蜘蛛,其內定義了爬取的邏輯和網頁的解析規則,它主要負責解析響應並生成提取結果和新的請求。
Item Pipeline。專案管道,負責處理由蜘蛛從網頁中抽取的專案,它的主要任務是清洗、驗證和儲存資料。
Downloader Middlewares。下載器中介軟體,位於引擎和下載器之間的鉤子框架,主要處理引擎與下載器之間的請求及響應。
Spider Middlewares。蜘蛛中介軟體,位於引擎和蜘蛛之間的鉤子框架,主要處理蜘蛛輸入的響應和輸出的結果及新的請求。
2. 資料流
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。
Engine將Spider返回的Item給Item Pipeline,將新的Request給Scheduler。
重複第二步到最後一步,直到Scheduler中沒有更多的Request,Engine關閉該網站,爬取結束。
通過多個元件的相互協作、不同元件完成工作的不同、元件對非同步處理的支援,Scrapy最大限度地利用了網路頻寬,大大提高了資料爬取和處理的效率。
3. 專案結構
Scrapy框架和pyspider不同,它是通過命令列來建立專案的,程式碼的編寫還是需要IDE。專案建立之後,專案檔案結構如下所示:
scrapy.cfg
project/
__init__.py
items.py
pipelines.py
settings.py
middlewares.py
spiders/
__init__.py
spider1.py
spider2.py
...複製程式碼
這裡各個檔案的功能描述如下。
scrapy.cfg:它是Scrapy專案的配置檔案,其內定義了專案的配置檔案路徑、部署相關資訊等內容。
items.py:它定義Item資料結構,所有的Item的定義都可以放這裡。
pipelines.py:它定義Item Pipeline的實現,所有的Item Pipeline的實現都可以放這裡。
settings.py:它定義專案的全域性配置。
middlewares.py:它定義Spider Middlewares和Downloader Middlewares的實現。
spiders:其內包含一個個Spider的實現,每個Spider都有一個檔案。
4. 結語
本節介紹了Scrapy框架的基本架構、資料流過程以及專案結構。後面我們會詳細瞭解Scrapy的用法,感受它的強大。
本資源首發於崔慶才的個人部落格靜覓: Python3網路爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注我的個人微信公眾號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)