當前位置:
首頁 > 知識 > 爬蟲可能都會用,但是背後的架構你真的懂了嗎?

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

點擊上方

Python開發

」,選擇「置頂公眾號」


關鍵時刻,第一時間送達!



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


一、概述


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



二、組件


1、 Scrapy Engine ( Scrapy 引擎)


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


2、 Scheduler (調度)


調度程序從 Scrapy 引擎接受請求並排序列入隊列,並在 Scrapy 引擎發出請求後返還給他們。


3、 Downloader (下載器)

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


4、 Spiders (蜘蛛)


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


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




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



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



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



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


5、 Item Pipeline (項目管道)


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

項目管道通常執行的過程有:




  1. 清洗 HTML 數據



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



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



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


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


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


7、 Spider middlewares (蜘蛛中間件)


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


8、 Scheduler middlewares (調度中間件)

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


三、數據處理流程


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




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



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



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



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



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



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



  7. 蜘蛛處理響應並返回爬取到的項目,然後給引擎發送新的請求。



  8. 引擎將抓取到的項目項目管道,並向調度發送請求。



  9. 系統重複第二部後面的操作,直到調度中沒有請求,然後斷開引擎與域之間的聯繫。


四、驅動器


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





  • 作者:mickelfeng



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



  • Python開發整理髮布,轉載請聯繫作者獲得授權


【點擊成為Java大神】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

Python 作用域和 LEGB
python wsgi 簡介

TAG:Python開發 |