快速構建實時抓取集羣

定義:
首先,我們定義一下定向抓取,定向抓取是一種特定的抓取需求,目標站點是已知的,站點的頁面是已知的。本文的介紹裏面,主要是側重於如何快速構建一個實時的抓取系統,並不包含通用意義上的比如鏈接分析,站點發現等等特性。

在本文提到的實例系統裏面,主要用到linux+mysql+redis+django+scrapy+webkit,其中scrapy+webkit作爲抓取端,redis作爲鏈接庫存儲,mysql作爲網頁信息存儲,django作爲爬蟲管理界面,快速實現分佈式抓取系統的原型。

名詞解析:
1.  抓取環:抓取環指的是spider在存儲中獲取url,從互聯網上下載網頁,然後將網頁存儲到數據庫裏面,最後在從存儲裏面獲取下一個URL的一個流程。
2.  Linkbase:鏈接庫的存儲模塊,包含一般的鏈接信息;是抓取系統的核心,使用redis存儲。
3.  XPATH:一門在 XML 文檔中查找信息的語言,XPath 可用來在 XML 文檔中對元素和屬性進行遍歷, 是 W3C XSLT 標準的主要元素。使用XPATH以及相關工具lib進行鏈接抽取和信息抽取。
4.  XPathOnClick:一個chrome的插件,支持點擊頁面元素,獲取XPATH路徑,用於編輯配置模板。
5.  Redis:一個開源的KV的內存數據庫,具備很好的數據結構的特徵和很高的存取性能。用於存儲linkbase信息
6.  Django:爬蟲管理工具,用於模板配置,系統監控反饋。Django在這裏主要是用來管理一個數據庫,使用Admin功能。
7.   Pagebase:頁面庫,主要是存儲網頁抓取的結果,以及頁面抽取的結果,和dump交互,使用mysql實現。
8.    Scrapy:一個開源的機遇twisted框架的python的單機爬蟲,該爬蟲實際上包含大多數網頁抓取的工具包,用於爬蟲下載端以及抽取端。
9.     列表頁:指的商品頁面之外的所有頁面
10.    詳情頁:比如商品B2C的抓取中,特指商品頁面,比如:http://item.tmall.com/item.htm?id=10321272374

系統架構
一:存儲 redis+mysql
鏈接庫(linkbase)是抓取系統的核心,基於性能和效率的考慮,本文采用基於內存的redis和磁盤的mysql爲主,對於linkbase主要是存儲抓取必須的鏈接信息,比如url,anchor,等等;對於mysql,則是存放抓取的網頁,便於後續的抽取和處理。
a)      PageBase:使用Mysql分庫分表,存放網頁,如下圖:

b)     Linkbase     使用Redis集羣,存儲linkbase信息。
幾個基本的數據結構:
1:抓取隊列 (candidate list)
分爲待抓取的url隊列和更新的url隊列;隊列存放urlhash,使用redis的list數據結構,對於新提取的url,push到對應的列表裏面,對於spider抓取模塊,從list pop得到。對於一個站點而言,抓取隊列有兩種類型:列表頁抓取隊列和詳情頁抓取隊列。
2:鏈接庫 (linkbase)
鏈接庫實際上是存儲鏈接信息的DB;Key是urlhash,Value是linkinfo,包含url,purl,anchor,xpath。。。;在redis使用hash存儲,直接存放在redis的裏面。KV鏈接庫,不區分頁面類型。
3:已抓取集合(crawled_set)
已抓取集合指的是當前已經下載的頁面的urlhash,存放已經抓取的網頁,使用redis的set實現,set的key是urlhash,score是時間戳,已抓取集合主要是用來記錄哪一些頁面已經抓取和抓取的時間,用於後續的更新頁面調度以及抓取信息的統計。同抓取隊列一樣,每一個站點有兩種類型的已抓取集合,詳情頁和列表頁

二:調度模塊:
調度模塊是抓取系統的關鍵,調度系統的好壞決定了抓取系統的效率;這塊是主要是在redis linkbase之上的數據結構,主要有抓取隊列、抓取集合、抓取優先級等等數據結構組成;對於一個抓取循環來說:獲取URL,提交到抓取模塊的待抓取隊列,啓動抓取,抓取完成之後對新鏈接進行抽取,最後進入等待抓取的隊列裏面。
調度系統的基本配置:
a)     頻率(間隔多少秒)
b)     各個抓取列表的選取比例:get_detail,mod_detail,get_list,mod_list
鏈接抽取:抽取頁面的鏈接,進行除重,對於新的鏈接,插入到待抓取列表裏
內容抽取:按照模塊的配置XPATH,抽取頁面信息,並寫入到pagebase中。
離線調度:按照更新的比例,從crawled_set裏面,定期選取url進入Mod隊列裏面進行刷新。

三:抓取模塊:
抓取模塊是抓取的必要條件,抓取模塊來說,重要的是應付互聯網上各式的問題,以及如何實現對對方站點的ip平衡,當然,這塊是和調度系統的緊密結合的,對於抓取模塊而言,本文主要使用scrapy工具包裏面的下載模塊。
首先,抓取模塊從linkbase獲取對應站點的抓取url,進行頁面下載,然後將頁面信息寫回到pipeline中,並完成鏈接抽取和頁面抽取,同時調用調度模塊,插入到linkbase和pagebase中。
下載端設計:
IP:每臺機器需要配置多個物理公網IP,下載的時候,隨機選擇一個IP下載
抓取頻度調整:讀取配置文件,按照配置文件的抓取頻率進行選取url

四:配置界面:
配置界面主要是對抓取系統的管理和配置,包括:站點feed、頁面模塊抽取、報表系統的反饋等等。

類似於通用的抓取架構,本文提到的抓取系統架構如下圖:


一個完整的抓取數據流:
1:用戶提供種子URL
2:種子URL進入linkbase中新URL隊列中
3:調度模塊選取url進入到抓取模塊的待抓取隊列中
4:抓取模塊讀取站點的配置文件,按照執行的頻率進行抓取
5:抓取的結果返回到pipeline接口中,並完成連接的抽取
6:新發現的連接在linkbase裏面進行dedup,並push到linkbase的新URL模塊裏面
7:調度模塊選取url進入抓取模塊的待抓取隊列,goto 4
8:end

系統擴展
本文提到的抓取系統,核心是調度和存儲模塊;其中,抓取,存儲,調度都是通過數據進行交互的,因此,模塊之間可以任意平行擴展,對於系統規模來說,只需要平行擴展mysql和redis存儲服務集羣以及抓取集羣即可。當然,簡單的擴展會帶來一些問題:比如垃圾列表頁的泛濫,鏈接庫的膨脹等等問題,這些問題後續在討論吧。

聲明:如有版權問題,請與原文作者聯繫。
<!--EndFragment-->
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章