鄭定超 麻少秋
摘要:針對(duì)當(dāng)前網(wǎng)絡(luò)上信息呈爆炸式增長(zhǎng)的態(tài)勢(shì),我們?nèi)绾胃酶斓孬@取有效信息就成了一個(gè)問(wèn)題。我們獲得信息最主要的途徑就是通過(guò)搜索引擎,網(wǎng)絡(luò)爬蟲(chóng)在整個(gè)搜索引擎中起著最為重要的作用。研究網(wǎng)絡(luò)爬蟲(chóng)的功能和結(jié)構(gòu)、設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基于廣度優(yōu)先爬行策略的帶URL消重功能的網(wǎng)絡(luò)爬蟲(chóng)、對(duì)該網(wǎng)絡(luò)爬蟲(chóng)進(jìn)行測(cè)試驗(yàn)證爬行效果和對(duì)設(shè)計(jì)的三種消重算法的性能進(jìn)行比較研究,提高爬蟲(chóng)的爬行效率;最后,采用廣度優(yōu)先的爬行策略,驗(yàn)證了該爬蟲(chóng)的爬行效果。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲(chóng);廣度優(yōu)先;搜索引擎
中圖分類(lèi)號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)25-0043-03
Research and Design of Web Crawler based on Breadth Strategy
ZHENG Ding-chao,MA Shao-qiu
(Zhejiang Oriental Vocational and Technical College, Wenzhou 325000,China)
Abstract:In view of the explosive growth of information on the Internet, how to get effective information faster and faster has become a problem. The most important way for us to get information is through search engines, and web crawlers play the most important role in the whole search engine. This paper studies the function and structure of the web crawler, designs and implements a network crawler with URL weight elimination function based on the breadth first crawling strategy, tests the crawl effect on the web crawler, and compares the performance of the three design algorithms to improve the crawling efficiency. Finally, the breadth priority is adopted. The crawling strategy verifies the crawling effect of the crawler.
Key words:web crawler; breadth priority; search engine
現(xiàn)在網(wǎng)絡(luò)上信息是以爆炸式的速度在增長(zhǎng),怎么樣更多、更快、更好地獲得這些網(wǎng)絡(luò)信息資源就成了一個(gè)問(wèn)題。在如此海量的信息源中,我們獲得信息最主要的途徑就是通過(guò)搜索引擎,而基于網(wǎng)絡(luò)爬蟲(chóng)(即網(wǎng)絡(luò)蜘蛛)的搜索引擎(即第四代搜索引擎)已經(jīng)是當(dāng)今搜索引擎技術(shù)和Web信息挖掘中的研究熱點(diǎn)和難點(diǎn)。
網(wǎng)絡(luò)爬蟲(chóng)是搜索引擎系統(tǒng)所有模塊當(dāng)中最為核心的模塊之一。作為搜索引擎系統(tǒng)最核心的模塊,網(wǎng)絡(luò)爬蟲(chóng)在整個(gè)搜索引擎中起著最為重要的作用,因?yàn)樗钦麄€(gè)搜索引擎的數(shù)據(jù)來(lái)源,沒(méi)有它,搜索引擎的所有后繼工作都將停滯下來(lái)。而網(wǎng)絡(luò)爬蟲(chóng)設(shè)計(jì)的好與壞就直接決定了整個(gè)引擎系統(tǒng)的內(nèi)容豐富與否,還有信息能否得到及時(shí)的更新,而這也直接決定了搜索引擎的成敗。而還有一些網(wǎng)絡(luò)爬蟲(chóng)是定制的,這些爬蟲(chóng)得到的數(shù)據(jù),可以用作實(shí)時(shí)檢測(cè)與監(jiān)控以及網(wǎng)絡(luò)安全等許多實(shí)際應(yīng)用的數(shù)據(jù)來(lái)源。因此,對(duì)網(wǎng)絡(luò)爬蟲(chóng)的研究具有非常重要的現(xiàn)實(shí)意義。
1 網(wǎng)絡(luò)爬蟲(chóng)設(shè)計(jì)
網(wǎng)絡(luò)爬蟲(chóng)程序采用Java語(yǔ)言和Berkeley DB來(lái)實(shí)現(xiàn)。在Java包中有便捷和豐富的HTTP訪(fǎng)問(wèn)和保存的API接口,從而對(duì)網(wǎng)絡(luò)爬蟲(chóng)的網(wǎng)頁(yè)抓取這個(gè)關(guān)鍵技術(shù)的實(shí)現(xiàn)提供了保障。而從HTML文本里提取出URL鏈接的時(shí)候采用了正則表達(dá)式提取的方式,這樣可以將文字的匹配速度以及運(yùn)行的效率和運(yùn)用Java包匹配的效率相比都有較大的提高。這樣,網(wǎng)絡(luò)爬蟲(chóng)的另一個(gè)關(guān)鍵技術(shù)——URL提取技術(shù)也可以順利的實(shí)現(xiàn)。同時(shí),在處理HTML文本的內(nèi)容過(guò)濾,也就是提取文字信息的時(shí)候,也是采用了正則式匹配的技術(shù)。
1.1 框架設(shè)計(jì)
網(wǎng)絡(luò)爬蟲(chóng)總體框架劃分如圖1所示。
在總體框架結(jié)構(gòu)圖中,開(kāi)始和結(jié)束的控制都由Contoller來(lái)負(fù)責(zé),而GetPage模塊負(fù)責(zé)發(fā)起HTTP訪(fǎng)問(wèn)和進(jìn)行鏈接并保存文件到本地的工作。之后有TextFilter模塊處理文本文檔的過(guò)濾和頁(yè)面分析的工作,并將提取出來(lái)的URL全都交給URL_Filter模塊進(jìn)行消重的處理。在處理之后,不重復(fù)的URL鏈接交給URL_List模塊進(jìn)行入隊(duì)的操作。爬行完一個(gè)URL鏈接之后,由Contoller判斷是否停止,如果要繼續(xù)的話(huà),從URL_List中出隊(duì)一個(gè)新的URL鏈接,重復(fù)之前的操作。
1.2 功能和結(jié)構(gòu)分析
在研究了爬蟲(chóng)程序的背景知識(shí)和共有功能后,設(shè)計(jì)了一個(gè)爬蟲(chóng)程序。改爬蟲(chóng)程序采取Java2開(kāi)發(fā)平臺(tái)在MyEclipse 7.0開(kāi)發(fā)環(huán)境中實(shí)現(xiàn)。
本文所設(shè)計(jì)的爬蟲(chóng)主要提供了以下幾個(gè)主要的功能:
1) 從一個(gè)目標(biāo)URL地址或者URL地址集開(kāi)始爬行,能夠通過(guò)訪(fǎng)問(wèn)相應(yīng)URL獲取源文件并保存在本地;
2) 將源文件保存為html文檔格式,方便用戶(hù)直觀(guān)了解得到的頁(yè)面;
3) 將源文件過(guò)濾處理以后保存文字內(nèi)容;
4) 將源文件中所有的URL鏈接提取出來(lái);
5) 在將解析出的URL作為后繼爬行目標(biāo)地址前可進(jìn)行URL消重;
6) 可以將消重之后剩下的URL加入待爬行隊(duì)列中去以供后繼爬行;
7) 可連續(xù)爬行;
8) 可自行設(shè)定停止條件;
9) 提供爬行軌跡的記錄。
該爬蟲(chóng)程序所涉及的數(shù)據(jù)包括目標(biāo)URL地址或目標(biāo)URL地址集、爬行目標(biāo)URL地址得到的源文件和頁(yè)面、從得到的源文件中解析出的URL、URL消重以后得到的URL地址集和爬行記錄。
1.3 爬行策略的選擇
網(wǎng)絡(luò)爬蟲(chóng)的爬行方式主要是基于圖論來(lái)工作的,以事先就已經(jīng)選取好的一些種子鏈接作為爬行的起始點(diǎn),使用某種爬行策略,寬度優(yōu)先或者深度優(yōu)先等,對(duì)網(wǎng)絡(luò)上存在的網(wǎng)頁(yè)進(jìn)行遍歷,其目標(biāo)是盡最大可能地爬行到整個(gè)網(wǎng)絡(luò)。
在本文所設(shè)計(jì)的網(wǎng)絡(luò)爬蟲(chóng)中,采用的寬度策略,對(duì)當(dāng)前URL地址層進(jìn)行訪(fǎng)問(wèn)時(shí),對(duì)于每一個(gè)URL,獲取到頁(yè)面以后,從該頁(yè)面提取出了所有的URL地址,會(huì)用消重模塊對(duì)每一個(gè)提取出的URL地址進(jìn)行消重處理,之后會(huì)記錄從該頁(yè)面中提取出了多少有效的URL地址。當(dāng)訪(fǎng)問(wèn)完了整個(gè)一層的URL以后,記錄在該層中提取出的有效URL總數(shù)。這樣,和在已經(jīng)在URL隊(duì)列里的URL數(shù)相加,就得到了包含下一層URL地址數(shù)量的隊(duì)列總數(shù)量m。這樣,用這個(gè)m來(lái)作為URL層級(jí)的標(biāo)志就十分簡(jiǎn)單而方便了。在每一層URL爬行完畢時(shí),將當(dāng)前總數(shù)m記錄在層級(jí)標(biāo)志數(shù)組中。當(dāng)前已經(jīng)爬行過(guò)的URL數(shù)量和作為標(biāo)志的數(shù)量相比較,就可以很容易地知道是否是爬行完了一層。策略的流程圖如圖2所示。
2 網(wǎng)絡(luò)爬蟲(chóng)實(shí)現(xiàn)
該爬蟲(chóng)程序共由六個(gè)模塊來(lái)實(shí)現(xiàn)全部功能。分別是爬蟲(chóng)總體控制模塊、抓取源文件模塊、過(guò)濾源文件模塊、解析URL模塊、URL消重模塊、URL總隊(duì)列管理模塊。
2.1 抓取目標(biāo)頁(yè)面模塊的實(shí)現(xiàn)
實(shí)現(xiàn)的功能有接受用戶(hù)輸入的目標(biāo)URL地址或者目標(biāo)URL地址集,控制爬蟲(chóng)程序連續(xù)爬行、爬行的策略和爬行深度,判斷是否達(dá)到停止條件,并提供爬行記錄。
提供爬行的功能有兩塊程序來(lái)實(shí)現(xiàn)。第一塊將第一個(gè)爬行的URL地址和時(shí)間記錄下來(lái),第二塊程序采用循環(huán)控制的方式自動(dòng)記錄所有爬行的過(guò)的URL地址。用FileWriter類(lèi)的對(duì)象fw調(diào)用write()函數(shù)來(lái)實(shí)現(xiàn)寫(xiě)在本地的功能。并用Date類(lèi)的對(duì)象dd來(lái)調(diào)用getHours()函數(shù)、getMinutes()函數(shù)和getSeconds()函數(shù)來(lái)得到爬行各個(gè)URL地址的時(shí)間。
2.2 抓取目標(biāo)頁(yè)面模塊的實(shí)現(xiàn)
在GetPage類(lèi)中實(shí)現(xiàn)的功能有,鏈接目標(biāo)URL地址,得到該URL地址對(duì)應(yīng)的頁(yè)面和源文件并以html格式和txt文本文檔的格式分別保存在本地。鏈接目標(biāo)URL地址,首先需要將目標(biāo)URL地址傳給GetPage類(lèi)的對(duì)象,在Controller類(lèi)中創(chuàng)建GetPage類(lèi)對(duì)象后,將目標(biāo)URL和其在總隊(duì)列的當(dāng)前位置作為參數(shù)傳入。其代碼如下:
GetPagetogeturllink=new GetPage();//創(chuàng)建GetPage類(lèi)的鏈接對(duì)象togeturllink.SetLink(list.get(0),0);//開(kāi)始爬行初始URL
2.3 源文件過(guò)濾模塊的實(shí)現(xiàn)
TextFilter類(lèi)對(duì)得到的源文件做簡(jiǎn)單標(biāo)簽去除等處理后以文本文檔形式保存在本地,方便用戶(hù)查閱和做后繼的工作,如進(jìn)行主題爬行時(shí),方便檢查頁(yè)面內(nèi)容從而確定該頁(yè)面是否是用戶(hù)需求的頁(yè)面,處理后也便于保存。對(duì)源文件進(jìn)行過(guò)濾就是對(duì)HTML文檔的處理過(guò)程。
2.4 URL模塊的實(shí)現(xiàn)
在GetURLsFromTXT類(lèi)中實(shí)現(xiàn)了將源文件中的URL解析出來(lái),并使用URL_Filter類(lèi)的對(duì)象進(jìn)行URL消重的功能。在Controller類(lèi)中創(chuàng)建GetURLsFromTXT類(lèi)的對(duì)象,該對(duì)象調(diào)用GetaURL()函數(shù),將要處理的源文件的標(biāo)號(hào)i作為參數(shù)傳入。返回一個(gè)鏈表,該鏈表的內(nèi)容是處理這個(gè)源文件后得到的消重以后的所有的URL地址集。在得到一個(gè)匹配結(jié)果后,檢查該結(jié)果是否是一個(gè)有效地URL,應(yīng)為有的匹配結(jié)果中包含了一些字符,如<,會(huì)使該匹配結(jié)果成為一個(gè)無(wú)效的URL地址。
在URL_Filter類(lèi)中實(shí)現(xiàn)了對(duì)單個(gè)URL消重的功能。在一個(gè)頁(yè)面中,相同的URL非常的多,如果不消重,則爬蟲(chóng)的效率將會(huì)非常的底下。對(duì)于每一個(gè)URL地址,將其每個(gè)字符所對(duì)應(yīng)的ASCII碼相加,算出一個(gè)k值,將k值映射到hashTable[i][0]。hashTable[i][0]用于標(biāo)記在爬蟲(chóng)的目標(biāo)URL地址總隊(duì)列中是否有相同k值的URL存在,N表示沒(méi)有,Y表示有。在一次函數(shù)調(diào)用中,如果hashTable[i][0]值為N,則該URL地址是一個(gè)新的目標(biāo)URL地址,應(yīng)該要加入到總隊(duì)列地址集中,于是將N置為Y,將該URL地址放入hashTable[i][1];如果是Y,則表示總隊(duì)列中已經(jīng)存在有相同K值的URL,于是將該URL與有相同k值的URL依次進(jìn)行比較,如果是重復(fù)的,則放棄,如果沒(méi)有重復(fù),則將該URL加入到總隊(duì)列地址集中,并在二維hashTable[i][]中添加進(jìn)相應(yīng)的位置。
3 網(wǎng)絡(luò)爬蟲(chóng)測(cè)試
爬蟲(chóng)程序整體測(cè)試在真實(shí)網(wǎng)絡(luò)環(huán)境中運(yùn)行爬蟲(chóng)程序,URL消重模塊采用IntString算法,得到的結(jié)果包括:爬行軌跡、爬下地網(wǎng)頁(yè)源文件(txt文檔)、頁(yè)面形式的文檔(html文檔)、初步過(guò)濾的源文件(txt文檔),并計(jì)算出爬行的平均速度。
用http://blog.sohu.com的源文件作為輸入,以html結(jié)尾的URL作為解析的目標(biāo)URL,三種URL消重算法的比較研究的測(cè)試結(jié)果見(jiàn)表1。
爬蟲(chóng)抓取源文件的平均效率在40KB/S以上。用http://blogz.sohu.com作為輸入的起始URL目標(biāo)地址的實(shí)驗(yàn)中,將源文件過(guò)濾掉了93.6%的內(nèi)容,剩下了6.4%。用http://sports.163.com作為輸入的起始URL目標(biāo)地址的實(shí)驗(yàn)中,將源文件過(guò)濾掉了98.3%的內(nèi)容,剩下了1.7%。在試驗(yàn)中,采用的是StringHash算法進(jìn)行URL消重,URL消重的情況良好,沒(méi)有出現(xiàn)任何重復(fù)頁(yè)面。
4 結(jié)束語(yǔ)
研究網(wǎng)絡(luò)爬蟲(chóng)的功能和結(jié)構(gòu)、設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基于廣度優(yōu)先爬行策略的帶URL消重功能的網(wǎng)絡(luò)爬蟲(chóng)、對(duì)該網(wǎng)絡(luò)爬蟲(chóng)進(jìn)行測(cè)試驗(yàn)證爬行效果和對(duì)設(shè)計(jì)的三種消重算法的性能進(jìn)行比較研究,提高了爬蟲(chóng)的爬行效率;最后,利用真實(shí)站點(diǎn),采用廣度優(yōu)先的爬行策略,從獲取的頁(yè)面源文件數(shù)量、解析出的URL地址狀況、爬行軌跡、爬行速度、過(guò)濾源文件標(biāo)簽質(zhì)量等方面,驗(yàn)證了該爬蟲(chóng)的爬行效果。
參考文獻(xiàn):
[1] 陳魁.基于Java語(yǔ)言提取網(wǎng)站內(nèi)部URL的算法[J].電腦編程技巧與維護(hù),2004(8).
[2] 經(jīng)濟(jì)觀(guān)察網(wǎng)http://www.eeo.com.cn/today_media/sjg/2008/09/09/113029.html.
[3] 劉金紅.主題網(wǎng)絡(luò)爬蟲(chóng)研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2007,24(10).
[4] 夏詔杰.化學(xué)主題網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)和實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2006(10).
[5] 徐遠(yuǎn)超.基于Web 的網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2007,23(7-3).
【通聯(lián)編輯:唐一東】