Scrapy框架的使用之Scrapy框架介紹

崔慶才丨靜覓發表於2018-05-02

Scrapy是一個基於Twisted的非同步處理框架,是純Python實現的爬蟲框架,其架構清晰,模組之間的耦合程度低,可擴充套件性極強,可以靈活完成各種需求。我們只需要定製開發幾個模組就可以輕鬆實現一個爬蟲。

1. 架構介紹

首先我們看看Scrapy框架的架構,如下圖所示。

Scrapy框架的使用之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… (二維碼自動識別)


相關文章