資源描述:
《網(wǎng)絡爬蟲java實現(xiàn)原理》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在學術論文-天天文庫。
1、網(wǎng)絡爬蟲(Spider)Java實現(xiàn)原理收藏?“網(wǎng)絡蜘蛛”或者說“網(wǎng)絡爬蟲”,是一種能訪問網(wǎng)站并跟蹤鏈接的程序,通過它,可快速地畫出一個網(wǎng)站所包含的網(wǎng)頁地圖信息。本文主要講述如何使用Java編程來構建一個“蜘蛛”,我們會先以一個可復用的蜘蛛類包裝一個基本的“蜘蛛”,并在示例程序中演示如何創(chuàng)建一個特定的“蜘蛛”來掃描相關網(wǎng)站并找出死鏈接。Java語言在此非常適合構建一個“蜘蛛”程序,其內(nèi)建了對HTTP協(xié)議的支持,通過它可以傳輸大部分的網(wǎng)頁信息;其還內(nèi)建了一個HTML解析器,正是這兩個原因使Java語言成為本文構建“蜘蛛”程序的首選。文章后
2、面例1的示例程序,將會掃描一個網(wǎng)站,并尋找死鏈接。使用這個程序時需先輸入一個URL并單擊“Begin”按鈕,程序開始之后,“Begin”按鈕會變成“Cancel”按鈕。在程序掃描網(wǎng)站期間,會在“Cancel”按鈕之下顯示進度,且在檢查當前網(wǎng)頁時,也會顯示相關正常鏈接與死鏈接的數(shù)目,死鏈接將顯示在程序底部的滾動文本框中。單擊“Cancel”按鈕會停止掃描過程,之后可以輸入一個新的URL;如果期間沒有單擊“Cancel”,程序將會一直運行直到查找完所有網(wǎng)頁,此后,“Cancel”按鈕會再次變回“Begin”,表示程序已停止。下面將演示示例程
3、序是如何與可復用“Spider”類交互的,示例程序包含在例1的CheckLinks類中,這個類實現(xiàn)了ISpiderReportable接口,如例2所示,正是通過這個接口,蜘蛛類才能與示例程序相交互。在這個接口中,定義了三個方法:第一個方法是“spiderFoundURL”,它在每次程序定位一個URL時被調(diào)用,如果方法返回true,表示程序應繼續(xù)執(zhí)行下去并找出其中的鏈接;第二個方法是“spiderURLError”,它在每次程序檢測URL導致錯誤時被調(diào)用(如“404頁面未找到”);第三個方法是“spiderFoundEMail”,它在每次
4、發(fā)現(xiàn)電子郵件地址時被調(diào)用。有了這三個方法,Spider類就能把相關信息反饋給創(chuàng)建它的程序了。在begin方法被調(diào)用后,“蜘蛛”就開始工作了;為允許程序重繪其用戶界面,“蜘蛛”是作為一個單獨的線程啟動的。點擊“Begin”按鈕會開始這個后臺線程,當后臺線程運行之后,又會調(diào)用“CheckLinks”類的run方法,而run方法是由Spider對象實例化時啟動的,如下所示:spider=newSpider(this);spider.clear();base=newURL(url.getText());spider.addURL(base);s
5、pider.begin();首先,一個新的Spider對象被實例化,在此,需要傳遞一個“ISpiderReportable”對象給Spider對象的構造函數(shù),因為“CheckLinks”類實現(xiàn)了“ISpiderReportable”接口,只需簡單地把它作為當前對象(可由關鍵字this表示)傳遞給構造函數(shù)即可;其次,在程序中維護了一個其訪問過的URL列表,而“clear”方法的調(diào)用則是為了確保程序開始時URL列表為空,程序開始運行之前必須添加一個URL到它的待處理列表中,此時用戶輸入的URL則是添加到列表中的第一個,程序就由掃描這個網(wǎng)頁開
6、始,并找到與這個起始URL相鏈接的其他頁面;最后,調(diào)用“begin”方法開始運行“蜘蛛”,這個方法直到“蜘蛛”工作完畢或用戶取消才會返回。當“蜘蛛”運行時,可以調(diào)用由“ISpiderReportable”接口實現(xiàn)的三個方法來報告程序當前狀態(tài),程序的大部分工作都是由“spiderFoundURL”方法來完成的,當“蜘蛛”發(fā)現(xiàn)一個新的URL時,它首先檢查其是否有效,如果這個URL導致一個錯誤,就會把它當作一個死鏈接;如果鏈接有效,就會繼續(xù)檢查它是否在一個不同的服務器上,如果鏈接在同一服務器上,“spiderFoundURL”返回true,表
7、示“蜘蛛”應繼續(xù)跟蹤這個URL并找出其他鏈接,如果鏈接在另外的服務器上,就不會掃描是否還有其他鏈接,因為這會導致“蜘蛛”不斷地瀏覽Internet,尋找更多、更多的網(wǎng)站,所以,示例程序只會查找用戶指定網(wǎng)站上的鏈接。構造Spider類前面已經(jīng)講了如何使用Spider類,請看例3中的代碼。使用Spider類及“ISpiderReportable”接口能方便地為某一程序添加“蜘蛛”功能,下面繼續(xù)講解Spider類是怎樣工作的。Spider類必須保持對其訪問過的URL的跟蹤,這樣做的目的是為了確?!爸┲搿辈粫L問同一URL一次以上;進一步來說,
8、“蜘蛛”必須把URL分成三組,第一組存儲在“workloadWaiting”屬性中,包含了一個未處理的URL列表,“蜘蛛”要訪問的第一個URL也存在其中;第二組存儲在“workloadProcessed”中