分佈式爬蟲(Zookeeper+Redis+Spring+WebMgic+Dubbo)

Dpider

參考網上大佬的一張分佈式爬蟲的架構圖,對其的一個實現。因爲時間比較急,所以在某些地方跟原架構圖不一樣(有的省去了,有的用的其他技術),但總體架構是按照這個來的。文章很棒,推薦大家看一看!

系統分爲如下幾部分

根據架構圖,系統分爲

  • URL調度系統,對應着dpider-urlScheduler模塊
  • 子爬蟲,對應着dpider-spider模塊
  • 監控系統,對應着dpider-monitor模塊

其中子爬蟲、URL調度系統爲集羣,監控系統爲單點監控。

以下是對這三個模塊的介紹。

URL調度系統

是整個分佈式爬蟲系統的任務調度系統,向外暴露兩個方法:poll,push。另外還具有URL去重功能,後面還可以加入增量爬取支持,在URL調度系統側的爬蟲任務量統計等功能。

通過dubbo向外暴露服務。

使用spring-quartz定時向zk報告自身信息。

這裏可以有多種實現,這裏先只提供了一種Redis實現,該實現包括了poll,push,去重功能。在redis中有三個存儲:

  1. 使用set結構的一個已消費存儲,存儲的是已經消費過(已經被push過)的URL,用來去重用的,後面的增量爬取支持,在URL調度系統側的爬蟲任務量統計等功能也需要使用到它。
  2. 使用list結構的一個高優先級隊列,存儲的是高優先級的URL(比如說列表頁),隊列的實現方式是利用redis的左邊添加,右邊彈的方式。
  3. 使用list結構的一個低優先級隊列,存儲的是低優先級的URL(比如說詳情頁)。

poll方法

用於子爬蟲從URL管理隊列中獲取需要爬取的鏈接。先從高優先級隊裏獲取,如果沒有的話,再從低優先級隊列裏獲取。

push方法

用於子爬蟲向URL管理隊列添加新的鏈接。先去已消費隊列中看看是不是存在,如果存在則丟棄,否則判斷是哪種URL並放入對應隊列中。

子爬蟲-spider

獲取一個URL,下載其頁面,解析其頁面,將獲得數據進行持久化等操作(添加進數據庫等),將獲取到的新的URL添加回URL調度系統。

以上都是基於webMagic實現,架構圖中其內部的download,parser等部件跟webMagic一樣。這裏因爲時間原因沒有實現IP池。後面我覺得可以專門寫一個IP代理管理系統,該系統可以通過不同的方式添加可用IP(爬蟲爬取或者人工添加),自己管理失效IP等,向外暴露服務。

使用spring-quartz定時向zk報告自身信息。

後面還準備實現監控端的動態啓停。

監控系統-monitor

基於Monitor接口,可以有多種實現,現在只提供了Zookeeper的實現方式。

他實現了兩個主要功能:監聽子爬蟲節點、URL調度系統節點的上下線狀態並通知給工作人員,web端的節點狀態信息(爬蟲的工作量,健康狀況,URL調度系統節點的信息統計等)的監控及一些操作。

監聽節點情況

使用zk的註冊watcher的方式,監聽節點狀態,當有節點上下線的時候,調用Notice接口進行通知。這裏的Notice後面也可以單拿出來做成一個系統,使其可以通過dubbo或者消息隊列向外提供服務。

web端操作支持

主要是監控一些信息,後面會加入動態啓停等主動干預操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章