以經典的Scrapy框架為例,一起學學爬蟲的架構。
作者:mickelfeng
原文:https://my.oschina.net/mickelfeng/blog/726460
最近在學 Python ,同時也在學如何使用 python 抓取數據,于是就被我發(fā)現了這個非常受歡迎的 Python 抓取框架 Scrapy ,下面一起學習下 Scrapy 的架構,便于更好的使用這個工具。
一、概述
下圖顯示了 Scrapy 的大體架構,其中包含了它的主要組件及系統(tǒng)的數據處理流程(綠色箭頭所示)。下面就來一個個解釋每個組件的作用及數據的處理過程。
另外推薦一篇自己造輪子的爬蟲教程:
二、組件
1、 Scrapy Engine ( Scrapy 引擎)
Scrapy 引擎是用來控制整個系統(tǒng)的數據處理流程,并進行事務處理的觸發(fā)。更多的詳細內容可以看下面的數據處理流程。
2、 Scheduler (調度)
調度程序從 Scrapy 引擎接受請求并排序列入隊列,并在 Scrapy 引擎發(fā)出請求后返還給他們。
3、 Downloader (下載器)
下載器的主要職責是抓取網頁并將網頁內容返還給蜘蛛 \ ( Spiders\ )。
4、 Spiders (蜘蛛)
蜘蛛是有 Scrapy 用戶自己定義用來解析網頁并抓取制定 URL 返回的內容的類,每個蜘蛛都能處理一個域名或一組域名。換句話說就是用來定義特定網站的抓取和解析規(guī)則。
蜘蛛的整個抓取流程(周期)是這樣的:
首先獲取第一個 URL 的初始請求,當請求返回后調取一個回調函數。第一個請求是通過調用 start_requests\ ( \ )方法。該方法默認從 start_urls 中的 Url 中生成請求,并執(zhí)行解析來調用回調函數。
在回調函數中,你可以解析網頁響應并返回項目對象和請求對象或兩者的迭代。這些請求也將包含一個回調,然后被 Scrapy 下載,然后有指定的回調處理。
在回調函數中,你解析網站的內容,同程使用的是 Xpath 選擇器(但是你也可以使用 BeautifuSoup , lxml 或其他任何你喜歡的程序),并生成解析的數據項。
最后,從蜘蛛返回的項目通常會進駐到項目管道。
5、 Item Pipeline (項目管道)
項目管道的主要責任是負責處理有蜘蛛從網頁中抽取的項目,他的主要任務是清晰、驗證和存儲數據。當頁面被蜘蛛解析后,將被發(fā)送到項目管道,并經過幾個特定的次序處理數據。每個項目管道的組件都是有一個簡單的方法組成的 Python 類。他們獲取了項目并執(zhí)行他們的方法,同時他們還需要確定的是是否需要在項目管道中繼續(xù)執(zhí)行下一步或是直接丟棄掉不處理。
項目管道通常執(zhí)行的過程有:
清洗 HTML 數據
驗證解析到的數據(檢查項目是否包含必要的字段)
檢查是否是重復數據(如果重復就刪除)
將解析到的數據存儲到數據庫中
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 引擎進行控制,其主要的運行方式為:
引擎打開一個域名,時蜘蛛處理這個域名,并讓蜘蛛獲取第一個爬取的 URL 。
引擎從蜘蛛那獲取第一個需要爬取的 URL ,然后作為請求在調度中進行調度。
引擎從調度那獲取接下來進行爬取的頁面。
調度將下一個爬取的 URL 返回給引擎,引擎將他們通過下載中間件發(fā)送到下載器。
當網頁被下載器下載完成以后,響應內容通過下載中間件被發(fā)送到引擎。
引擎收到下載器的響應并將它通過蜘蛛中間件發(fā)送到蜘蛛進行處理。
蜘蛛處理響應并返回爬取到的項目,然后給引擎發(fā)送新的請求。
引擎將抓取到的項目項目管道,并向調度發(fā)送請求。
系統(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