Dpider
參考網上大佬的一張分佈式爬蟲的架構圖,對其的一個實現。因爲時間比較急,所以在某些地方跟原架構圖不一樣(有的省去了,有的用的其他技術),但總體架構是按照這個來的。文章很棒,推薦大家看一看!
-
項目地址:
-
架構圖如下:
系統分爲如下幾部分
根據架構圖,系統分爲
- URL調度系統,對應着dpider-urlScheduler模塊
- 子爬蟲,對應着dpider-spider模塊
- 監控系統,對應着dpider-monitor模塊
其中子爬蟲、URL調度系統爲集羣,監控系統爲單點監控。
以下是對這三個模塊的介紹。
URL調度系統
是整個分佈式爬蟲系統的任務調度系統,向外暴露兩個方法:poll,push。另外還具有URL去重功能,後面還可以加入增量爬取支持,在URL調度系統側的爬蟲任務量統計等功能。
通過dubbo向外暴露服務。
使用spring-quartz定時向zk報告自身信息。
這裏可以有多種實現,這裏先只提供了一種Redis實現,該實現包括了poll,push,去重功能。在redis中有三個存儲:
- 使用set結構的一個已消費存儲,存儲的是已經消費過(已經被push過)的URL,用來去重用的,後面的增量爬取支持,在URL調度系統側的爬蟲任務量統計等功能也需要使用到它。
- 使用list結構的一個高優先級隊列,存儲的是高優先級的URL(比如說列表頁),隊列的實現方式是利用redis的左邊添加,右邊彈的方式。
- 使用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端操作支持
主要是監控一些信息,後面會加入動態啓停等主動干預操作。