不知不覺,2011已經過去了,這一年中的大多時間,都花在了輿情監控系統的探索和研發上。尤其是作為輿情監控系統的基礎子系統——網絡爬蟲系統,更是消耗了不少的時間和精力。下面簡單分享一下在網絡爬蟲系統設計開發中的一些經驗和不足。
首次接觸爬蟲,是在前年的時候,一次偶然的機會,從圖書館帶回一本書中,夾帶了一個網絡爬蟲的demo源碼,當時只覺得非常敬仰那些能夠寫出爬蟲程 序的人,認為倘若有一天自己也能寫一個網絡爬蟲出來,該是一件多么讓人興奮的事。后來工作之后,參與的第一個項目,就是網絡輿情監控系統的開發,不過當時 因為只是應屆畢業生,且公司的這套產品已趨向成熟,正在推廣期間,所以工作內容主要是該系統下網絡爬蟲子系統的配置和維護,以及爬蟲日志的分析。也正是從 這里開始,真正踏上了網絡爬蟲的探索之路。
期間,我的畢業設計作品就是一個小型的搜索引擎系統,做這個東西的目的也很明確,就是為了探索網絡爬蟲系統在實際應用中的一些核心技術,并積累一些 經驗。后來來了上海,沒想到公司又是搞搜索、搞網絡輿情的,所以又繼續沿著之前的路走:設計開發爬蟲,數據分析,和海量數據的全文檢索。
這樣的日子,不知不覺已經有一年了,在這一年里,采用不同的技術、不同的設計理念和不同的目的,主要做了三個版本的爬蟲系統,最滿意的要數現在這個 了。個人認為最主要的原因還是因為有了之前的經驗積累和沉淀,使得在爬蟲設計之初就注意到了并避開了之前爬蟲遇到的各種各樣的問題?,F在的爬蟲系統,主要 是作為一個定向數據采集和網頁文本挖掘軟件為網絡輿情監控系統服務的,除了常規爬蟲的網頁采集、鏈接跟蹤等功能外,還帶有網頁主題識別和價值文本抽取等稍 微有點“特色”的功能。在筆者看來,這樣的網絡爬蟲稍顯“另類”,因為它與常規的網絡爬蟲相比,人工依賴更多,但是數據抽取更精準,更高效。不同于公司版 本的網絡爬蟲是以命令行方式控制,筆者個人探索研究之用的UI版,整合了一個簡單的界面,以使用戶可以更方便、更直觀的控制和配置爬蟲。界面在設計之初, 參考了國內某著名信息采集系統的UI,所以看起來爬蟲更像是一個網頁數據采集系統。但事實上,輿情監控使用的爬蟲跟普通的網頁信息采集系統,并沒有很大的 區別。以下是該系統的部分截圖:
該系統目前采用的技術架構是:Quartz + HtmlUnit + HttpClient + DBCP,采用XPath來精確抽取網頁文本,最低內存消耗5M,最長運行時間15天,最快抓取速度10208網頁/小時,最高寬帶占用38M/s
測試環境為:Windows Server2003 SP3 32位Hotspot 1536M內存 100M光纖 MySql5.1
其實對于網絡爬蟲工作模式,以及網絡爬蟲的模塊設計,應該說很多人即便是沒有做過爬蟲的人,也能說出來個大概。事實上,雖然網絡爬蟲系統是技術密集型的軟件系統,但是如果一個基礎扎實的程序員要做一個像模像樣的“簡化版”爬蟲,也不是什么十分困難的事情。
為什么這么說呢?筆者認為,爬蟲的核心,無非就是網頁獲取、鏈接抽取、文本抽取,稍微高級一點即是權重分析、網頁去重、更新策略,再高級就是人工智 能和分布式集群了。拋開人工智能和分布式,要做一個單機版的爬蟲,還是很容易的:java世界中,網頁獲取技術可謂多如繁星,如HttpClient等, 鏈接抽取自然也不在話下,對于單機版的爬蟲,權重分析、網頁去重和更新策略可以暫時不去做,那么就剩下一個文本抽取了,過濾HTML標簽就是最簡單的文本 抽取(當然實際上很少有這么簡單處理的),而這對HtmlParser來講,簡直是小菜一碟。
在筆者看來,一套完善的網絡爬蟲系統,應該具備以下特點:
1、良好的框架結構
2、合適的網頁獲取技術
3、高度優化的代碼
4、易于配置和管理
第一點:因為爬蟲系統一旦運行起來,可能好幾周甚至更長時間都不會停下來,良好的框架結構可以保證爬蟲在這個漫長的作戰過程中盡量少的犯錯誤,和較低資源占用;同時,良好的框架結構也為擴展和增強爬蟲的功能奠定良好的基礎;
第二點:在 一年多的網絡爬蟲開發過程中,筆者接觸了眾多的網頁獲取技術,如Watij、JRex、JSoup再到后來的HtppClient和目前的 HtmlUnit,總的來講,各有優劣,所謂“優劣”,主要的判斷標準有同一網頁的獲取時間、解析時間、是否支持腳本以及對內存和CPU的占用,爬蟲要面 對不同的頁面類型,何時采用何種頁面獲取技術,以使爬蟲消耗的資源和時間最少,是爬蟲設計者不得不考慮的問題;據筆者了解,HttpClient應該是 Java開源爬蟲中用的最多的技術,也確實應該是爬蟲的首選網頁獲取技術;
第三點:正如第一點所說,在爬蟲長時間運行過程中,如果不對代碼做高度優化,那么萬一出現內存泄露,對爬蟲而言,將會是致命的打擊;另外,經過高度優化的代碼,可以使CPU占用處于低位,如此,便可保證同樣的服務器硬件上,爬蟲的效率、速度和穩定性都會有質的提高;
第四點:爬蟲系統不是智能的,很多情況不能夠自己判斷并作出決定,但是為了讓爬蟲變得聰明,往往需要配置大量的參數來“指導”和管理爬蟲工作
正是基于上述四點保證,現有爬蟲才能在最低5M內存時穩定運行,才能在兩周的連續運行時間內不出現任何內存泄露等問題。不過這不能掩飾爬蟲的“內傷”,而這些“內傷”也正是2012所要解決的問題:
1、雖然爬蟲能夠精確抽取論壇主題和回帖,以及點擊量和回復數,但爬蟲嚴重依賴XPath,不能夠自主識別鏈接重要程度,不能夠自主識別網頁價值數據;
2、爬蟲采用插件模式,每個站點都有一個插件,以此來保證抽取數據的準確性,但是缺乏大規模全網爬取的能力;
3、不支持robots協議,像個“流氓”;
4、不支持集群;
5、采用關系型數據庫,而沒有使用NOSQL數據庫;
這些內傷有的影響了爬蟲的性能,有的限制了爬蟲的成長,有的則使爬蟲看起來像個“流氓”,所以在未來的2012上半年,需要解決這些問題。目前的打算如下:
爬蟲改定向爬取為定向爬取與全網爬取共存后,爬蟲需要自動跟蹤鏈接、抽取文本,所以要用到主題識別技術、網頁切片技術和網頁權重分析技術;
系統應該提供一個默認的插件,來兼容絕大部分網頁,但要保留現有的插件模式;
為爬蟲加入robots協議的支持,使其變成“正規軍”;
好的爬蟲當然是要支持集群的,目前考慮采用apache的hadoop來做分布式的爬蟲;
URL數據存儲在關系型數據庫中對爬蟲性能的影響十分明顯,稍后要用MongoDB來取代關系型數據庫來管理URL數據
網上已有很多開源爬蟲,筆者也研究過好幾款,只能說良莠不齊吧,且筆者覺得大多爬蟲采用的技術都比較老,而且普遍存在一個問題,就是對網頁權重分析 和URL鏈接管理做得很不到位,或者干脆就沒有做,不明白為什么。不過作為開源軟件的一名貢獻者,其作者的精神和勇氣還是值得欽佩的,在此向所有開源事業 的先驅們致敬!
原創文章,轉載請注明出處:http://yshjava.iteye.com/blog/1338896