快速構建實時抓取集羣

(http://www.searchtb.com/hot?spm=0.0.0.0.kHYUSU)python

定義:mysql

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


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


名詞解析:redis

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
sql


系統架構chrome

一:存儲 redis+mysql數據庫

連接庫(linkbase)是抓取系統的核心,基於性能和效率的考慮,本文采用基於內存的redis和磁盤的mysql爲主,對於linkbase主要是存儲抓取必須的連接信息,好比url,anchor,等等;對於mysql,則是存放抓取的網頁,便於後續的抽取和處理。django

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存儲服務集羣以及抓取集羣便可。固然,簡單的擴展會帶來一些問題:好比垃圾列表頁的泛濫,連接庫的膨脹等等問題,這些問題後續在討論吧。


enjoy  (http://www.searchtb.com/hot?spm=0.0.0.0.kHYUSU)

Filed under

相關文章
相關標籤/搜索