爬蟲可能都會用,但是背后的架構你真的懂了嗎?

以經典的Scrapy框架為例,一起學學爬蟲的架構。

作者:mickelfeng

原文:https://my.oschina.net/mickelfeng/blog/726460

最近在學 Python ,同時也在學如何使用 python 抓取數據,于是就被我發(fā)現了這個非常受歡迎的 Python 抓取框架 Scrapy ,下面一起學習下 Scrapy 的架構,便于更好的使用這個工具。

一、概述

下圖顯示了 Scrapy 的大體架構,其中包含了它的主要組件及系統(tǒng)的數據處理流程(綠色箭頭所示)。下面就來一個個解釋每個組件的作用及數據的處理過程。

另外推薦一篇自己造輪子的爬蟲教程:

500 行 Python 代碼構建一個輕量級爬蟲框架

二、組件

1、 Scrapy Engine ( Scrapy 引擎)

Scrapy 引擎是用來控制整個系統(tǒng)的數據處理流程,并進行事務處理的觸發(fā)。更多的詳細內容可以看下面的數據處理流程。

2、 Scheduler (調度)

調度程序從 Scrapy 引擎接受請求并排序列入隊列,并在 Scrapy 引擎發(fā)出請求后返還給他們。

3、 Downloader (下載器)

下載器的主要職責是抓取網頁并將網頁內容返還給蜘蛛 \ ( Spiders\ )。

4、 Spiders (蜘蛛)

蜘蛛是有 Scrapy 用戶自己定義用來解析網頁并抓取制定 URL 返回的內容的類,每個蜘蛛都能處理一個域名或一組域名。換句話說就是用來定義特定網站的抓取和解析規(guī)則。

蜘蛛的整個抓取流程(周期)是這樣的:

  1. 首先獲取第一個 URL 的初始請求,當請求返回后調取一個回調函數。第一個請求是通過調用 start_requests\ ( \ )方法。該方法默認從 start_urls 中的 Url 中生成請求,并執(zhí)行解析來調用回調函數。

  2. 在回調函數中,你可以解析網頁響應并返回項目對象和請求對象或兩者的迭代。這些請求也將包含一個回調,然后被 Scrapy 下載,然后有指定的回調處理。

  3. 在回調函數中,你解析網站的內容,同程使用的是 Xpath 選擇器(但是你也可以使用 BeautifuSoup , lxml 或其他任何你喜歡的程序),并生成解析的數據項。

  4. 最后,從蜘蛛返回的項目通常會進駐到項目管道。

5、 Item Pipeline (項目管道)

項目管道的主要責任是負責處理有蜘蛛從網頁中抽取的項目,他的主要任務是清晰、驗證和存儲數據。當頁面被蜘蛛解析后,將被發(fā)送到項目管道,并經過幾個特定的次序處理數據。每個項目管道的組件都是有一個簡單的方法組成的 Python 類。他們獲取了項目并執(zhí)行他們的方法,同時他們還需要確定的是是否需要在項目管道中繼續(xù)執(zhí)行下一步或是直接丟棄掉不處理。

項目管道通常執(zhí)行的過程有:

  1. 清洗 HTML 數據

  2. 驗證解析到的數據(檢查項目是否包含必要的字段)

  3. 檢查是否是重復數據(如果重復就刪除)

  4. 將解析到的數據存儲到數據庫中

6、 Downloader middlewares (下載器中間件)

下載中間件是位于 Scrapy 引擎和下載器之間的鉤子框架,主要是處理 Scrapy 引擎與下載器之間的請求及響應。它提供了一個自定義的代碼的方式來拓展 Scrapy 的功能。下載中間器是一個處理請求和響應的鉤子框架。他是輕量級的,對 Scrapy 盡享全局控制的底層的系統(tǒng)。

7、 Spider middlewares (蜘蛛中間件)

蜘蛛中間件是介于 Scrapy 引擎和蜘蛛之間的鉤子框架,主要工作是處理蜘蛛的響應輸入和請求輸出。它提供一個自定義代碼的方式來拓展 Scrapy 的功能。蛛中間件是一個掛接到 Scrapy 的蜘蛛處理機制的框架,你可以插入自定義的代碼來處理發(fā)送給蜘蛛的請求和返回蜘蛛獲取的響應內容和項目。

8、 Scheduler middlewares (調度中間件)

調度中間件是介于 Scrapy 引擎和調度之間的中間件,主要工作是處從 Scrapy 引擎發(fā)送到調度的請求和響應。他提供了一個自定義的代碼來拓展 Scrapy 的功能。

三、數據處理流程

Scrapy 的整個數據處理流程有 Scrapy 引擎進行控制,其主要的運行方式為:

  1. 引擎打開一個域名,時蜘蛛處理這個域名,并讓蜘蛛獲取第一個爬取的 URL 。

  2. 引擎從蜘蛛那獲取第一個需要爬取的 URL ,然后作為請求在調度中進行調度。

  3. 引擎從調度那獲取接下來進行爬取的頁面。

  4. 調度將下一個爬取的 URL 返回給引擎,引擎將他們通過下載中間件發(fā)送到下載器。

  5. 當網頁被下載器下載完成以后,響應內容通過下載中間件被發(fā)送到引擎。

  6. 引擎收到下載器的響應并將它通過蜘蛛中間件發(fā)送到蜘蛛進行處理。

  7. 蜘蛛處理響應并返回爬取到的項目,然后給引擎發(fā)送新的請求。

  8. 引擎將抓取到的項目項目管道,并向調度發(fā)送請求。

  9. 系統(tǒng)重復第二部后面的操作,直到調度中沒有請求,然后斷開引擎與域之間的聯系。

四、驅動器

Scrapy是由Twisted寫的一個受歡迎的Python事件驅動網絡框架,它使用的是非堵塞的異步處理。如果要獲得更多關于異步編程和Twisted的信息,請參考下面兩條鏈接。


題圖:pexels,CC0 授權。

點擊閱讀原文,查看更多 Python 教程和資源。



閱讀原文:http://mp.weixin.qq.com/s?__biz=MzAwNDc0MTUxMw==&mid=2649639866&idx=1&sn=336c89db5b6044278c9ce6670e450608&chksm=833dab5cb44a224a5f4960af589bfdec338b3b41008050549e00ef9e4f26c6b9f262d68ded91#rd
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容