如何設計一個定向Web爬蟲?

目前的做法:
1.模塊分為:html解析,html下載中心,下載器
2.html解析 負責: 發起下載任務,接收下載後的html並進行邏輯處理
html下載中心 負責:接收下載任務,並分發給多個下載器,接收下載器返回的HTML,返回HTML給解析器
3.如果有圖片要下載的話,要將圖片的二進位數據返回到htnl解析器

現在的我的疑惑是:這樣一來,是不是數據傳輸過於冗餘?能有比較好的設計嗎?


從整體搜索引擎角度,分成三個子系統:爬蟲(URL管理和調度下載解析等)、索引(用於全文檢索)、存儲(解析後的內容和快照等);

爬蟲子系統部分,又分為四個組件:Seeder- &> Manager- &> Harvester- &> Collector(- &> Seeder).
1) Seeder負責URL管理,也就是定向網站種子url,以及曾經抓過的所有url,可擴展存儲網頁指紋,歷史抓取信息等
2) Manager負責調度,根據你的抓取策略(定時、增量、隨機等)從Seeder調取url生成抓取任務;
3) Harvester有多個,競爭得到抓取任務並專心下載,下載後內容傳遞給Collector;
4) Collector有倆任務,解析html、搜集新鏈接,並把解析後的內容根據需要傳遞給索引系統和存儲系統,把搜集的新連接傳遞給Seeder模塊。

這個設計是參考了國外一些論文實現的,個人感覺有幾個好處:
a) 四個組件組成良性循環,結構清晰,分工和擴展容易;
b) Seeder+Manager 負責長期目標:指定的下載策略控制,根據不同的適用場景可以由不同的演算法;
c) Harvester+Collector 負責短期目標:充分發揮計算機資源(CPU/Memory/IO/網路)完成下載和內容解析;

幾點說明:
1) URL去重可以放到Seeder來做,一個Bloomfilter就行;
2) Harvester網頁下載實現可以用一些高效非同步IO,比如java的NIO等,單個線程同時發起上千個並發下載沒有任何問題;
3) Collecter網頁解析主要是個浪費CPU的事情,一般只能開個線程池並發處理,為了提高解析效率,不在乎鏈接發現很全的情況下,可以考慮正則表達式解析(非常快,推薦);

如果是圖片的話,Collector就好辦了,判斷下載完的資源如果是圖片,直接到存儲系統。

當然裡面還有很多細節話題需要考慮,在此先一併忽略了~~


定向爬蟲?有多定向?特定某類站點的抓取么?
基本上NUTCH能滿足你的抓取要求,如果你不想寫代碼的話。
如果要寫代碼。主要問題應該集中在:
1、內存的管理(如果用c#,避免使用遞歸函數,內存釋放機制不好)
2、爬蟲路徑的配置
3、數據挖掘(解析)的配置(建議用一個開源的html解析器,使用xpath解析,比正則來的輕鬆,效率也高)
4、更新策略

我的建議,不要過度設計(若真要擴展性,直接擴展NUTCH就好了),適用即可。定向爬蟲,極有可能是一次性的代碼。
我統計過,若狀態好,一個站點,抽取不算複雜的情況,3個小時就可以完成。


最近看到的一個淘寶的搜索架構的文章
http://blog.nosqlfan.com/html/2604.html


定向爬蟲 我是用 c#加mongo資料庫做


對象化唄、模塊化


來一個全局的消重吧,要簡單的話可以用bloomfilter,不過不支持刪除操作,會存在錯誤率。稍微帶邏輯可以redis試試,能夠支持過期這樣的操作。


贊同劉嘉瑜的回答,或者你可以用隊列來做任務調度保證一個url只處理一次
可以參照一下一些爬蟲框架的設計,比如http://scrapy.org/


推薦閱讀:

為什麼知乎的搜索功能如此之爛?
網頁如何判斷一個請求來自於爬蟲?又應該如何繞過?
未來移動互聯網的應用搜索相比當前的移動搜索最大的優勢是什麼?
搜索引擎優化(SEO)10大假裡面,你能理解幾個是假的?
大型網站如何建立 SEO 體系?

TAG:爬蟲計算機網路 | 搜索引擎 |