基于網(wǎng)絡(luò)爬蟲的搜索引擎設(shè)計與實現(xiàn)_第1頁
基于網(wǎng)絡(luò)爬蟲的搜索引擎設(shè)計與實現(xiàn)_第2頁
基于網(wǎng)絡(luò)爬蟲的搜索引擎設(shè)計與實現(xiàn)_第3頁
基于網(wǎng)絡(luò)爬蟲的搜索引擎設(shè)計與實現(xiàn)_第4頁
基于網(wǎng)絡(luò)爬蟲的搜索引擎設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

本科畢業(yè)設(shè)計題目:基于網(wǎng)絡(luò)爬蟲的搜索引擎設(shè)計與實現(xiàn)系別:專業(yè):計算機科學(xué)與技術(shù)班級:學(xué)號:姓名:同組人:指導(dǎo)教師:教師職稱:協(xié)助指導(dǎo)教師:教師職稱:摘要本文從搜索引擎的應(yīng)用出發(fā),探討了網(wǎng)絡(luò)蜘蛛在搜索引擎中的作用和地住,提出了網(wǎng)絡(luò)蜘蛛的功能和設(shè)計要求。在對網(wǎng)絡(luò)蜘蛛系統(tǒng)結(jié)構(gòu)和工作原理所作分析的基礎(chǔ)上,研究了頁面爬取、解析等策略和算法,并使用Java實現(xiàn)了一個網(wǎng)絡(luò)蜘蛛的程序,對其運行結(jié)果做了分析。關(guān)鍵字:爬蟲、搜索引擎AbstractThepaper,discussingfromtheapplicationofthesearchengine,searchestheimportanceandfunctionofWebspiderinthesearchengine.a(chǎn)ndputsforwarditsdemandoffunctionanddesign.OnthebaseofanalyzingWebSpider’ssystemstrtuctureandworkingelements.thispaperalsoresearchesthemethodandstrategyofmultithreadingscheduler,WebpagecrawlingandHTMLparsing.Andthen.a(chǎn)programofwebpagecrawlingbasedonJavaisappliedandanalyzed.Keyword:spider,searchengine目錄摘要 2Abstract 3一、項目背景 51.1搜索引擎現(xiàn)狀分析 51.2課題開發(fā)背景 61.3網(wǎng)絡(luò)爬蟲的工作原理 8二、系統(tǒng)開發(fā)工具和平臺 92.1關(guān)于java語言 92.2Jbuilder介紹 102.3servlet的原理 12三、系統(tǒng)總體設(shè)計 143.1系統(tǒng)總體結(jié)構(gòu) 143.2系統(tǒng)類圖 14四、系統(tǒng)詳細設(shè)計 174.1搜索引擎界面設(shè)計 174.2servlet的實現(xiàn) 194.3網(wǎng)頁的解析實現(xiàn) 204.3.1網(wǎng)頁的分析 204.3.2網(wǎng)頁的處理隊列 214.3.3搜索字符串的匹配 224.3.4網(wǎng)頁分析類的實現(xiàn) 224.4網(wǎng)絡(luò)爬蟲的實現(xiàn) 25五、系統(tǒng)測試 33六、結(jié)論 35致謝 35參考文獻 36一、項目背景1.1搜索引擎現(xiàn)狀分析互聯(lián)網(wǎng)被普及前,人們查閱資料首先想到的便是擁有大量書籍的圖書館,而在當(dāng)今很多人都會選擇一種更方便、快捷、全面、準確的方式——互聯(lián)網(wǎng).如果說互聯(lián)網(wǎng)是一個知識寶庫,那么搜索引擎就是打開知識寶庫的一把鑰匙.搜索引擎是隨著WEB信息的迅速增加,從1995年開始逐漸發(fā)展起來的技術(shù),用于幫助互聯(lián)網(wǎng)用戶查詢信息的搜索工具.搜索引擎以一定的策略在互聯(lián)網(wǎng)中搜集、發(fā)現(xiàn)信息,對信息進行理解、提取、組織和處理,并為用戶提供檢索服務(wù),從而起到信息導(dǎo)航的目的.目前搜索引擎已經(jīng)成為倍受網(wǎng)絡(luò)用戶關(guān)注的焦點,也成為計算機工業(yè)界和學(xué)術(shù)界爭相研究、開發(fā)的對象.目前較流行的搜索引擎已有Google,Yahoo,Infoseek,baidu等.出于商業(yè)機密的考慮,目前各個搜索引擎使用的Crawler系統(tǒng)的技術(shù)內(nèi)幕一般都不公開,現(xiàn)有的文獻也僅限于概要性介紹.隨著Web信息資源呈指數(shù)級增長及Web信息資源動態(tài)變化,傳統(tǒng)的搜索引擎提供的信息檢索服務(wù)已不能滿足人們?nèi)找嬖鲩L的對個性化服務(wù)的需要,它們正面臨著巨大的挑戰(zhàn).以何種策略訪問Web,提高搜索效率,成為近年來專業(yè)搜索引擎網(wǎng)絡(luò)爬蟲研究的主要問題之一。1.2課題開發(fā)背景目前雖然有很多種搜索引擎,但各種搜索引擎基本上由三個組成部分:(1)在互聯(lián)網(wǎng)上采集信息的網(wǎng)頁采集系統(tǒng):網(wǎng)頁采集系統(tǒng)主要使用一種工作在互聯(lián)網(wǎng)上的采集信息的“網(wǎng)絡(luò)蜘蛛”。“網(wǎng)絡(luò)蜘蛛”實際上是一些基于web的程序,利用主頁中的超文本鏈接遍歷Web.利用能夠從互聯(lián)網(wǎng)上自動收集網(wǎng)頁的“網(wǎng)絡(luò)蜘蛛”程序,自動訪問互聯(lián)網(wǎng),并沿著任何網(wǎng)頁中的所有URL爬到其它網(wǎng)頁,重復(fù)這過程,并把爬過的所有網(wǎng)頁收集到網(wǎng)頁數(shù)據(jù)庫中。(2)對采集到的信息進行索引并建立索引庫的索引處理系統(tǒng):索引處理系統(tǒng)對收集回來的網(wǎng)頁進行分析,提取相關(guān)網(wǎng)頁信息(包括網(wǎng)頁所在URL、編碼類型、頁面內(nèi)容包含的關(guān)鍵詞、關(guān)鍵詞位置、生成時間、大小、與其它網(wǎng)頁的鏈接關(guān)系等),根據(jù)一定的相關(guān)度算法進行大量復(fù)雜計算,得到每一個網(wǎng)頁針對頁面內(nèi)容中及超鏈中每一個關(guān)鍵詞的相關(guān)度(或重要性),然后建立索引并存人到網(wǎng)頁索引數(shù)據(jù)庫中.索引數(shù)據(jù)庫可以采用通用的大型數(shù)據(jù)庫,如Oracle,Sybase等,也可以自己定義文件格式進行存放.為了保證索引數(shù)據(jù)庫中的信息與Web內(nèi)容的同步,索引數(shù)據(jù)庫必須定時更新,更新頻率決定了搜索結(jié)果的及時性.索引數(shù)據(jù)庫的更新是通過啟動“網(wǎng)絡(luò)蜘蛛”對Web空間重新搜索來實現(xiàn)的.(3)完成用戶提交查詢請求的網(wǎng)頁檢索器:網(wǎng)頁檢索器一般是一個在Web服務(wù)器上運行的服務(wù)器程序,它首先接收用戶提交的查詢條件,根據(jù)查詢條件對索引庫進行查找并將查詢到的結(jié)果返回給用戶.當(dāng)用戶使用搜索引擎查找信息時,網(wǎng)頁檢索器接收用戶提交的關(guān)鍵詞,由搜索系統(tǒng)程序從網(wǎng)頁索引數(shù)據(jù)庫中找到符合該關(guān)鍵詞的所有相關(guān)網(wǎng)頁.有的搜索引擎系統(tǒng)綜合相關(guān)信息和網(wǎng)頁級別形成相關(guān)度數(shù)值,然后進行排序,相關(guān)度越高,排名越靠前.最后由頁面生成系統(tǒng)將搜索結(jié)果的鏈接地址和頁面內(nèi)容摘要等內(nèi)容組織起來返回給用戶.典型的搜索引擎系統(tǒng)如Google就是采用這種策略.信息的飛速增長,使搜索引擎成為人們查找信息的首選工具,Google、百度、中國搜索等大型搜索引擎一直是人們討論的話題.搜索引擎技術(shù)的研究,國外比中國要早近十年,從最早的Archie,到后來的Excite,以及ahvista、overture、google等搜索引擎面世,搜索引擎發(fā)展至今,已經(jīng)有十幾年的歷史,而國內(nèi)開始研究搜索引擎是在上世紀末本世紀初.在許多領(lǐng)域,都是國外的產(chǎn)品和技術(shù)一統(tǒng)天下,特別是當(dāng)某種技術(shù)在國外研究多年而國內(nèi)才開始的情況下.例如操作系統(tǒng)、字處理軟件、瀏覽器等等,但搜索引擎卻是個例外.雖然在國外搜索引擎技術(shù)早就開始研究,但在國內(nèi)還是陸續(xù)涌現(xiàn)出優(yōu)秀的搜索引擎,像百度、中搜等.隨著搜索引擎技術(shù)的成熟,它將成為獲取信息、掌握知識的利器.但是現(xiàn)有的搜索引擎對于用戶所提出的查詢要求僅限于關(guān)鍵詞的簡單邏輯組合,搜索結(jié)果重視的是返回的數(shù)量而不是質(zhì)量,在結(jié)果文檔的組織和分類上也有所欠缺.國外的一次調(diào)查結(jié)果顯示,約有71%的人對搜索的結(jié)果感到不同程度的失望.因此,如何提高搜索引擎的智能化程度,如何按照知識應(yīng)用的需要來組織信息,使互聯(lián)網(wǎng)不僅提供信息服務(wù),而且能為用戶提供知識服務(wù),將成為計算機工業(yè)界和學(xué)術(shù)界有待研究的方向。1.3網(wǎng)絡(luò)爬蟲的工作原理網(wǎng)絡(luò)爬蟲是搜索引擎的核心部分,其名稱出自Spider的意譯,具有相同詞義的詞語還有Crawler,robots,bots,wanderer等等.網(wǎng)絡(luò)爬蟲定義有廣義和狹義之分,狹義上的定義為利用標準的http協(xié)議根據(jù)超級鏈接和Web文檔檢索的方法遍歷萬維網(wǎng)信息空間的軟件程序;而廣義則是所有能利用http協(xié)議檢索Web文檔的軟件都稱之為網(wǎng)絡(luò)爬蟲.網(wǎng)絡(luò)爬蟲是一個功能很強的自動提取網(wǎng)頁的程序,它為搜索引擎從萬維網(wǎng)上下載網(wǎng)頁,是搜索引擎的重要組成.它通過請求站點上的HTML文檔訪問某一站點.它遍歷Web空間,不斷從一個站點移動到另一個站點,自動建立索引,并加入到網(wǎng)頁數(shù)據(jù)庫中.網(wǎng)絡(luò)爬蟲進入某個超級文本時,它利用HTML語言的標記結(jié)構(gòu)來搜索信息及獲取指向其他超級文本的URL地址,可以完全不依賴用戶干預(yù)實現(xiàn)網(wǎng)絡(luò)上的自動“爬行”和搜索。二、系統(tǒng)開發(fā)工具和平臺2.1關(guān)于java語言Java語言是由Sun公司于1995年推出的一種新的編程語言,它是一種跨平臺、適合于分布式計算環(huán)境的純面向?qū)ο笳Z言。Java語言及其擴展正在逐步成為互聯(lián)網(wǎng)應(yīng)用的規(guī)范,掀起了自PC機以來的又一次技術(shù)革命。一般認為,B語言導(dǎo)致了C語言的誕生、C語言演變出C++語言,而Java語言則明顯帶有C++語言的特征。Java總是和C++聯(lián)系在一起,而C++則是從C語言派生而來的,所以Java語言繼承了這兩種語言的大部分特性。Java的語法是從C繼承的,Java許多面向?qū)ο筇匦远际艿紺++的影響。事實上,Java中幾個自定義的特性都來自于或可以追溯到它的這些前驅(qū)語言。略有不同的是,Java語言完全面向?qū)ο螅瑥亩饤壛硕叩牟蛔阒?。Java語言的誕生與過去約30年中計算機語言的不斷改進和發(fā)展密切相關(guān)。Java是由JamesGosling、PatrickNaughton、ChrisWarth、EdFrank以及MikeSheridan等人于1991年在SunMicrosystems公司設(shè)計出來的,開發(fā)第一個版本花了18個月時間。該語言最初名叫“Oak”,后來發(fā)現(xiàn)“Oak”已經(jīng)是Sun公司另外一種語言的注冊商標,于1995年更名為“Java”,即太平洋上一個盛產(chǎn)咖啡的島嶼的名字。從1992的秋天Oak問世,到1995春天公開發(fā)布Java語言,許多人都對Java的設(shè)計和改進做出了貢獻。自從于1995年被正式推出之后,Java語言就以其獨特的優(yōu)勢迅猛發(fā)展,經(jīng)過短短8、9年時間,成為迄今為止最為優(yōu)秀的面向?qū)ο笳Z言。Java也從當(dāng)初的一種語言而逐漸形成一種產(chǎn)業(yè),基于Java語言的J2EE架構(gòu)已成為微軟.NET平臺的強大競爭對手。當(dāng)初,Java語言最初的發(fā)布不亞于一場革命,但是它并不標志著Java快速革新時代的結(jié)束。在Java1.0發(fā)布后不久,Java的設(shè)計者就已經(jīng)制定出了Java1.1、Java1.2、Java1.3、Java1.4、Java2、Java2.1.4版。作為當(dāng)前一種被廣泛使用的面向?qū)ο缶幊陶Z言,Java具有多方面的特點。如果與其他眾多的編程語言作一下比較,會發(fā)現(xiàn)這些特點正是Java語言之所以如此風(fēng)靡的原因所在。雖然Java在某些方面(例如資源耗費)也存在一些不足,但這絲毫不影響Java作為目前最優(yōu)秀面向?qū)ο缶幊陶Z言的地位。Java是一種被廣泛使用的網(wǎng)絡(luò)編程語言,這是一種新的計算概念。網(wǎng)絡(luò)環(huán)境下的編程語言最需要解決的是可移植性和安全性問題。以字節(jié)方式進行編碼,使得程序不受運行平臺和環(huán)境的限制成為可能。Java語言還提供了豐富的類庫,使程序設(shè)計人員可以很方便地調(diào)用相關(guān)類建立起自己的系統(tǒng)。Java作為一種高級程序設(shè)計語言,它除具有面向?qū)ο?、編寫簡單、脫離機器結(jié)構(gòu)、具有分布性、魯棒性、可移植性、安全性特點外,并且提供了并發(fā)機制,解釋執(zhí)行具有很高的性能。2.2Jbuilder介紹Java的開發(fā)工具中,最出名的莫過于Borland公司的JBuiIder了。對于一些沒有弄清楚開發(fā)工具與JDK的區(qū)別的Java入門者來說。JBuiIder就如同Visualc++之于c++,以為JBuiIder就是Java的全部。比起捆綁在服務(wù)器上銷售的JDeveloper,JBuiIder應(yīng)該是唯一的僅靠自身的實力而占領(lǐng)了大部分市場的Java商用開發(fā)工具了。Jbuilder的特點::1)Jbuilder支持最新的Java技術(shù),包括Applets、JSP/Servlets、JavaBean以及EJB(EnterpriseJavaBeans)的應(yīng)用。2)用戶可以自動地生成基于后端數(shù)據(jù)庫表的EJBJava類,Jbuilder同時還簡化了EJB的自動部署功能.此外它還支持CORBA,相應(yīng)的向?qū)С绦蛴兄谟脩羧娴毓芾鞩DL(分布應(yīng)用程序所必需的接口定義語言InterfaceDefinitionLanguage)和控制遠程對象。3)Jbuilder支持各種應(yīng)用服務(wù)器。Jbuilder與InpriseApplicationServer緊密集成,同時支持WebLogicServer,支持EJB1.1和EJB2.0,可以快速開發(fā)J2EE的電子商務(wù)應(yīng)用。4)Jbuilder能用Servlet和JSP開發(fā)和調(diào)試動態(tài)Web應(yīng)用。5)利用Jbuilder可創(chuàng)建(沒有專有代碼和標記)純Java2應(yīng)用。由于Jbuilder是用純Java語言編寫的,其代碼不含任何專屬代碼和標記,它支持最新的Java標準。6)Jbuilder擁有專業(yè)化的圖形調(diào)試介面,支持遠程調(diào)試和多線程調(diào)試,調(diào)試器支持各種JDK版本,包括J2ME/J2SE/J2EE。JBuilder環(huán)境開發(fā)程序方便,它是純的Java開發(fā)環(huán)境,適合企業(yè)的J2EE開發(fā)。因此本次開發(fā)使用Jbuilder2006.2.3servlet的原理Servlet是指運行在服務(wù)器端的Java小程序。用于響應(yīng)客戶端的請求。在默認情況下,Servlet采用一種無狀態(tài)的請求-響應(yīng)處理方式。Servlet代碼的主要作用是為了增強Java服務(wù)器端的功能,它運行在服務(wù)器端,用于接收并且處理瀏覽器客戶端發(fā)出的請求,該請求是通過配置文件web.xml的相關(guān)配置進行轉(zhuǎn)發(fā)。也就是說Servlet是一個標準的Java類,它符合Java類的一般規(guī)則。和一般的Java類不同之處只是在于Servlet可以處理Http請求。1.servlet是持久的。servlet只需Web服務(wù)器加載一次,后續(xù)又用到這個servlet,就不需要再加載。(所謂加載是指servlet加載進JVM運行)2.servlet是與平臺無關(guān)的。3.servlet是可擴展的。ActionServlet繼承自javax.servlet.http.HttpServlet類,其在Strutsframework中扮演的角色是中心控制器。它提供一個中心位置來處理全部的終端請求??刂破鰽ctionServlet主要負責(zé)將HTTP的客戶請求信息組裝后,根據(jù)配置文件的指定描述,轉(zhuǎn)發(fā)到適當(dāng)?shù)奶幚砥鰽ction。Servlet的原理圖描述如下:使用servlet有幾個優(yōu)點:一是有效性,servlet的初始化代碼僅在web服務(wù)器第一次加載時候執(zhí)行一次,一旦加載了servlet,在處理一個新的請求的時候,只須調(diào)用一個新的服務(wù)方法。與處理每個請求都要全部加載一個完整的可執(zhí)行程序相比,效率得以提高。二是穩(wěn)定性,servlet能夠維護每個請求的狀態(tài),一旦加載了servlet,她就駐留在內(nèi)存中,對收到的請求提供服務(wù)。三是可移植性,servlet是用java開發(fā)的,因此它是可移植的,這種可移植性使servlet能夠移植到新的操作系統(tǒng)中而不必改變代碼。四是安全性,servlet在服務(wù)器端運行,因此,安全性由web服務(wù)器提供能保障,servlet也能夠利用javaSecurityManager提供的安全性功能。三、系統(tǒng)總體設(shè)計3.1系統(tǒng)總體結(jié)構(gòu)3.2系統(tǒng)類圖1)servlet結(jié)構(gòu)2)網(wǎng)絡(luò)爬蟲結(jié)構(gòu)3)頁面解析結(jié)構(gòu)3.3搜索策略網(wǎng)絡(luò)爬蟲在搜索時往往采用一定的搜索策略。一是寬度或深度優(yōu)先搜索策略:搜索引擎所用的第一代網(wǎng)絡(luò)爬蟲主要是基于傳統(tǒng)的圖算法,如寬度優(yōu)先或深度優(yōu)先算法來索引整個Web,一個核心的URL集被用來作為一個種子集合,這種算法遞歸的跟蹤超鏈接到其它頁面,而通常不管頁面的內(nèi)容,因為最終的目標是這種跟蹤能覆蓋整個Web.這種策略通常用在通用搜索引擎中,因為通用搜索引擎獲得的網(wǎng)頁越多越好,沒有特定的要求.二是寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型.單源最短路徑算法和Prim最小生成樹算法都采用了和寬度優(yōu)先搜索類似的思想.寬度優(yōu)先搜索算法是沿著樹的寬度遍歷樹的節(jié)點,如果發(fā)現(xiàn)目標,則算法中止.該算法的設(shè)計和實現(xiàn)相對簡單,屬于盲目搜索.在目前為覆蓋盡可能多的網(wǎng)頁,一般使用寬度優(yōu)先搜索方法.也有很多研究將寬度優(yōu)先搜索策略應(yīng)用于聚焦爬蟲中.其基本思想是認為與初始URL在一定鏈接距離內(nèi)的網(wǎng)頁具有主題相關(guān)性的概率很大.另外一種方法是將寬度優(yōu)先搜索與網(wǎng)頁過濾技術(shù)結(jié)合使用,先用廣度優(yōu)先策略抓取網(wǎng)頁,再將其中無關(guān)的網(wǎng)頁過濾掉.這些方法的缺點在于,隨著抓取網(wǎng)頁的增多,大量的無關(guān)網(wǎng)頁將被下載并過濾,算法的效率將變低。三是深度優(yōu)先搜索所遵循的搜索策略是盡可能“深”地搜索圖.在深度優(yōu)先搜索中,對于最新發(fā)現(xiàn)的頂點,如果它還有以此為起點而未探測到的邊,就沿此邊繼續(xù)漢下去.當(dāng)結(jié)點v的所有邊都己被探尋過,搜索將回溯到發(fā)現(xiàn)結(jié)點v有那條邊的始結(jié)點.這一過程一直進行到已發(fā)現(xiàn)從源結(jié)點可達的所有結(jié)點為止.如果還存在未被發(fā)現(xiàn)的結(jié)點,則選擇其中一個作為源結(jié)點并重復(fù)以上過程,整個進程反復(fù)進行直到所有結(jié)點都被發(fā)現(xiàn)為止.深度優(yōu)先在很多情況下會導(dǎo)致爬蟲的陷入(trapped)問題,所以它既不是完備的,也不是最優(yōu)的。四、系統(tǒng)詳細設(shè)計4.1搜索引擎界面設(shè)計4.1.1界面設(shè)計實現(xiàn)設(shè)計界面如下:4.1.2設(shè)計代碼分析<html><head><title>簡易搜索引擎</title><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"></head><bodybgcolor="#FFFFFF"leftmargin="0"topmargin="0"marginwidth="0"marginheight="0"><formaction="/WebModule1/myservlet"method="get"><!--ImageReadySlices(未標題-1)--><tableid="Table_01"width="1025"height="768"border="0"cellpadding="0"cellspacing="0"> <tr> <tdcolspan="4"> <imgsrc="images/myservlet_01.gif"width="1024"height="171"alt=""></td> <td> <imgsrc="images/spacer.gif"width="1"height="171"alt=""></td> </tr> <tr> <tdstyle="background-color:#ffccff"> 搜索內(nèi)容<td> <tdstyle="background-color:#ffccff"> <inputtype="text"name="param0"style="width:335px"></td> <tdstyle="background-color:#ffccff"> <inputtype="submit"name="Submit"value="搜索"><inputtype="reset"value="重設(shè)"></td> <tdbackground="images/myservlet_06.gif"width="162"height="71"> </td> <td> <imgsrc="images/spacer.gif"width="1"height="71"alt=""></td> </tr> <tr> <tdcolspan="4"rowspan="2"> </td> <td> <imgsrc="images/spacer.gif"width="1"height="31"alt=""></td> </tr> <tr> <td> <imgsrc="images/spacer.gif"width="1"height="495"alt=""></td> </tr></table><!--EndImageReadySlices--></form></body></html>4.2servlet的實現(xiàn)用Servlet來響應(yīng)用戶的請求,實現(xiàn)搜索參數(shù)的傳入。具體代碼設(shè)計為:packagecrawer;importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;importjava.util.*;import.*;publicclassMyServletextendsHttpServlet{privatestaticfinalStringCONTENT_TYPE="text/html;charset=GBK";publicTimertimer;myspidercrawler;ArrayList<String>myresult;//搜索到的結(jié)果//Initializeglobalvariablespublicvoidinit()throwsServletException{}//ProcesstheHTTPGetrequestpublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringvar0=request.getParameter("param0");if(var0==null){var0="";}response.setContentType(CONTENT_TYPE);PrintWriterout=response.getWriter();byte[]bytes=var0.getBytes("ISO-8859-1");Stringsearch=newString(bytes,"GB2312");crawler=newmyspider("",10,search);//Threadsearch=newThread(crawler);//search.start();//此處開始爬行crawler.run();//啟動定時器,在時間內(nèi)檢查是否有結(jié)果,并顯示myresult=newArrayList<String>();//搜索到的結(jié)果myresult=crawler.getResult();out.println("<html>");out.println("<head><title>爬蟲演示</title></head>");out.println("<p>注意默認起始站點為:,層數(shù)為10</p>");out.println("<p>搜索"+search+"結(jié)果:</p>");out.println("<bodybgcolor=\"#c0c0c0\">");Stringte;for(inti=0;i<myresult.size();i++){te=String.valueOf(i+1);out.println("<p>"+te+"、"+myresult.get(i)+"</p>");//輸出結(jié)果}if(myresult.size()==0){out.println("<p>對不起,沒有找到結(jié)果</p>");}out.println("</body>");out.println("</html>");out.close();}//Cleanupresourcespublicvoiddestroy(){}}4.3網(wǎng)頁的解析實現(xiàn)4.3.1網(wǎng)頁的分析網(wǎng)頁文檔作為一種半結(jié)構(gòu)化文本是一種界于自由文本和結(jié)構(gòu)化文本之間的數(shù)據(jù),它通常沒有嚴格的格式。對于這類文本一般是通過分析文本中特有的標志性字符進行爬行處理,具體而言就是分析HTML語言中的各種標記之間的關(guān)系。網(wǎng)頁信息的載體是網(wǎng)頁文本,用超文本標記語言編寫。由HTML標準定義了一組元素類型,不同類型的元素分別描述文本、圖像和超文本鏈接等。一個元素的描述一般由開始標記(StartTag)、內(nèi)容(Content)、結(jié)束標記(EndTag)所組成。元素名稱出現(xiàn)在開始標記中,在HTML語言中標記為<元素名稱>,對應(yīng)的結(jié)束標記為</元素名稱>,內(nèi)容出現(xiàn)在開始標記和結(jié)束標記之間。通過構(gòu)造網(wǎng)頁標記樹的方法可反映網(wǎng)頁的結(jié)構(gòu)特點,下圖是一個簡單的動態(tài)網(wǎng)頁標記樹4.3.2網(wǎng)頁的處理隊列頁面處理隊列中保存的是頁面的URL,它實際上是由等待隊列、處理隊列、錯誤隊列、完成隊列組成。正是通過它們,某個具體的移動Spider得以完成對該Spider所對應(yīng)web的全部搜索任務(wù)。頁面隊列中保存的頁面的URL都是屬于內(nèi)鏈接。(1)等待隊列(WaitURL)。在這個隊列中,URL等待被移動Spider程序處理。新發(fā)現(xiàn)的URL被加入到這個隊列中。(2)處理隊列(Proces—sUI)。當(dāng)移動Spider程序開始處理URL時,它們被傳送到這一隊列,但同一個URL不能被多次處理,因為這樣是浪費資源。當(dāng)一個URL被處理過后,它將被移送到錯誤隊列或者是完成隊列。(3)錯誤隊列(ErrorURL)。如果在處理某一頁面時發(fā)生錯誤,它的URL將被加入到錯誤隊列,該URL到達這一隊列后將不再移人其他隊列。一旦網(wǎng)頁移入錯誤隊列,移動Spider程序?qū)⒉粫賹λ鬟M一步處理。(4)完成隊列(LaunchURL)。如果在處理網(wǎng)頁時沒有發(fā)生錯誤,處理完畢時,該URL將被加入到完成隊列,該URL到達這一隊列后將不再移人其他隊列。同一時間一個URL只能在一個隊列中,這也叫做URL的狀態(tài),這是因為人們常常使用狀態(tài)圖描述計算機程序,程序按照狀態(tài)圖從一個狀態(tài)變換到下一個狀態(tài)實際上,當(dāng)發(fā)現(xiàn)URL(內(nèi)鏈接)時,移動Spider會檢查該URL是否已經(jīng)存在于完成隊列或錯誤隊列中,如果已經(jīng)存在于上述兩種隊列的任何一個隊列中,那么移動Spider將不會對此URL進行任何處理。由此,可避免某個頁面被重復(fù)處理,防止陷入死循環(huán)。4.3.3搜索字符串的匹配對于要搜索的字符串,必須在抓取的網(wǎng)頁中進行匹配檢查,如果存在于該網(wǎng)頁中,則把地址添加到輸出隊列中。4.3.4網(wǎng)頁分析類的實現(xiàn)packagecrawer;//html文件解析類importjava.io.ByteArrayOutputStream;importjava.util.Hashtable;importjava.util.Enumeration;importjava.util.Vector;importjava.util.Stack;import.URL;import.MalformedURLException;importjava.util.StringTokenizer;importjava.io.InputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.util.ArrayList;//類實體publicclassHtmlParser{ArrayList<String>fafa=newArrayList<String>();URLbase=null;//基本URLpublicHtmlParser(StringPageContent){intstate=0;StringBuffersb=newStringBuffer();inti=PageContent.length();//System.out.println("循環(huán)讀取解析");for(intj=0;j<i;j++){//循環(huán)讀取解析/switch(state){case0:if(PageContent.charAt(j)=='<')state='<';break;case'<':if(PageContent.charAt(j)=='>'){state=0;analyze(sb.toString());sb.setLength(0);}else{sb.append((char)PageContent.charAt(j));}}}}publicvoidanalyze(Stringparam){StringTokenizerst=newStringTokenizer(param);if(st.countTokens()<2)return;Stringfirst_word=st.nextToken().toLowerCase();if(first_word.equals("a")){analyzeAnchor(st.nextToken(""));}elseif(first_word.equals("frame")){analyzeFrame(st.nextToken(""));}elseif(first_word.equals("base")){extractBase(st.nextToken(""));}}/**分析<a>分析.*/voidanalyzeAnchor(Stringanchor){Stringhref=extract(anchor,"href");if(href==null)return;addURL(href);}/**分析<frame>分析.*/voidanalyzeFrame(Stringframe){Stringsrc=extract(frame,"src");if(src==null)return;addURL(src);}/**由<base>標記中分離url.*/voidextractBase(Stringb){Stringb2=extract(b,"href");if(b2!=null){try{base=newURL(b2);}catch(MalformedURLExceptione){e.printStackTrace();}}}Stringextract(Stringline,Stringkey){try{key=key.toLowerCase();Stringlower_case=line.toLowerCase();inti=lower_case.indexOf(key);if(i<0)returnnull;i+=key.length();if(line.charAt(i)!='=')returnnull;i++;inti2;if(line.charAt(i)=='"'){i++;i2=line.indexOf('"',i);if(i2<0){returnline.substring(i);}else{returnline.substring(i,i2);}}else{inttarg=line.length();for(i2=i;i<targ;i++){if(Character.isSpace(line.charAt(i)))break;}returnline.substring(i,i2);}}catch(StringIndexOutOfBoundsExceptione){}returnnull;}/**添加"url"到URL列表.*/publicvoidaddURL(Stringurl){//System.out.println(url);fafa.add(url);}publicArrayList<String>getResult(){returnfafa;}}4.4網(wǎng)絡(luò)爬蟲的實現(xiàn)4.4.1爬蟲結(jié)構(gòu)分析網(wǎng)絡(luò)爬蟲沿著WWW文件間的鏈接在網(wǎng)上漫游,記錄URL、文件的簡明概要、關(guān)鍵字或索引。其漫游結(jié)果是形成一個很大的本地數(shù)據(jù)庫,你可以通過WWW瀏覽器訪問與該網(wǎng)絡(luò)爬蟲相配合的檢索服務(wù)器對其結(jié)果進行查詢。但并不是所有的檢索服務(wù)器都采用robot只有那些自動在網(wǎng)上漫游并形成自己的數(shù)據(jù)庫的那些才是。每個robot完成的功能都不一樣所以它們的本地索引結(jié)果也就不同。Robot的運行方式是這樣的:從一個或一組URL開始,訪問該URL并進行本地索引同時記錄該URL所指HTML文件中所有新的URL錨鏈(anchor);然后再以這些新的URL為起始點,繼續(xù)進行本地索引,直到再沒有滿足條件的新URL為止。在記錄新URL時,可以進行分析和判斷,從中去掉不需要或不想要的URL,這不但提高了本地索引的速度,也減少了索引文件在本地所占用的磁盤空間。雖然robot和spider功能很強,但如果有一組URL地址沒有被組~bURL所鏈接到,那么robot和spider就找不到它們。同時由于robot和spider不能更新太快(因為網(wǎng)絡(luò)帶寬有限,如果更新太快,那么其他用戶就會受到影響),難免有不能及時加入的新WWW地址,所以很多擁有robot和spider的WWW索引和檢索服務(wù)站點同時提供一項由用戶加入新WWW地址的功能。如果僅僅是從遠程獲得數(shù)據(jù),實現(xiàn)一個robot并不很難。但由于每個robot都是與一定的索引和檢索技術(shù)相聯(lián)系的,所以它必須要能與其它模塊相配合工作。因而其實現(xiàn)時要考慮很多相關(guān)技術(shù)。一般來說,一個索引和檢索服務(wù)器在實現(xiàn)時要涉及的主要技術(shù)有如下幾方面:(1)HTTP(HyperTextTransferProtoco1)協(xié)議。它是WWW上數(shù)據(jù)傳輸?shù)臉藴蕝f(xié)議。通過它,我們可以跟WWW服務(wù)器進行信息交換:從服務(wù)器獲得我們所要的各種信息,并將我們的要求發(fā)給服務(wù)器。(2)HTML(HyperTextMarkupLanguage)語言。它是WWW服務(wù)器所發(fā)回各種數(shù)據(jù)的主要描述語言,因為搜索引擎的主要搜索目標是文本,所以必須對HTML進行解析,提取出相應(yīng)的數(shù)據(jù)。(3)分詞技術(shù)。為了提取關(guān)鍵字或者知識,必須分隔出單個的詞和句子。(4)公共網(wǎng)關(guān)接口CGI(ConlmonGatewayInterface)。通過它,我們可以執(zhí)行WWW服務(wù)器上的程序:我們把查詢要求傳遞給HTTP服務(wù)器,HTTP~務(wù)器根據(jù)客戶的請求執(zhí)行CGI程序CGI程序根據(jù)通過HTTP服務(wù)器傳遞的查詢要求對數(shù)據(jù)庫進行操作,并把查詢結(jié)果以HTML的形式傳遞回HTTP客戶。4.4.2爬蟲的設(shè)計實現(xiàn)packagecrawer;importjava.util.*;import.*;importjava.io.*;importjava.util.regex.*;importjavax.servlet.http.HttpServletResponse;publicclassmyspiderimplementsRunnable{privateHashMap<String,ArrayList<String>>disallowListCache=newHashMap<String,ArrayList<String>>();ArrayList<String>errorList=newArrayList<String>();//錯誤信息ArrayList<String>result=newArrayList<String>();//搜索到的結(jié)果StringstartUrl;//開始搜索的起點intmaxUrl;//最大處理的url數(shù)StringsearchString;//要搜索的字符串(英文)booleancaseSensitive=false;//是否區(qū)分大小寫booleanlimitHost=false;//是否在限制的主機內(nèi)搜索//PrintWriterout;publicmyspider(StringstartUrl,intmaxUrl,StringsearchString){this.startUrl=startUrl;this.maxUrl=maxUrl;this.searchString=searchString;//輸出設(shè)定}publicArrayList<String>getResult(){returnresult;}publicvoidrun(){//啟動搜索線程crawl(startUrl,maxUrl,searchString,limitHost,caseSensitive);}//檢測URL格式privateURLverifyUrl(Stringurl){//只處理HTTPURLs.if(!url.toLowerCase().startsWith("http://"))returnnull;URLverifiedUrl=null;try{verifiedUrl=newURL(url);}catch(Exceptione){returnnull;}returnverifiedUrl;}//檢測robot是否允許訪問給出的URL.privatebooleanisRobotAllowed(URLurlToCheck){Stringhost=urlToCheck.getHost().toLowerCase();//獲取給出RUL的主機//System.out.println("主機="+host);//獲取主機不允許搜索的URL緩存ArrayList<String>disallowList=disallowListCache.get(host);//如果還沒有緩存,下載并緩存。if(disallowList==null){disallowList=newArrayList<String>();try{URLrobotsFileUrl=newURL("http://"+host+"/robots.txt");BufferedReaderreader=newBufferedReader(newInputStreamReader(robotsFileUrl.openStream()));//讀robot文件,創(chuàng)建不允許訪問的路徑列表。Stringline;while((line=reader.readLine())!=null){if(line.indexOf("Disallow:")==0){//是否包含"Disallow:"StringdisallowPath=line.substring("Disallow:".length());//獲取不允許訪問路徑//檢查是否有注釋。intcommentIndex=disallowPath.indexOf("#");if(commentIndex!=-1){disallowPath=disallowPath.substring(0,commentIndex);//去掉注釋}disallowPath=disallowPath.trim();disallowList.add(disallowPath);}}//緩存此主機不允許訪問的路徑。disallowListCache.put(host,disallowList);}catch(Exceptione){returntrue;//web站點根目錄下沒有robots.txt文件,返回真}}Stringfile=urlToCheck.getFile();//System.out.println("文件getFile()="+file);for(inti=0;i<disallowList.size();i++){Stringdisallow=disallowList.get(i);if(file.startsWith(disallow)){returnfalse;}}returntrue;}privateStringdownloadPage(URLpageUrl){try{//OpenconnectiontoURLforreading.BufferedReaderreader=newBufferedReader(newInputStreamReader(pageUrl.openStream()));//Readpageintobuffer.Stringline;StringBufferpageBuffer=newStringBuffer();while((line=reader.readLine())!=null){pageBuffer.append(line);//System.out.println(line);//輸出網(wǎng)頁測試,結(jié)果可以顯示}returnpageBuffer.toString();//返回整個網(wǎng)頁字符}catch(Exceptione){}returnnull;}//從URL中去掉"www"privateStringremoveWwwFromUrl(Stringurl){intindex=url.indexOf("://www.");if(index!=-1){returnurl.substring(0,index+3)+url.substring(index+7);}return(url);}//解析頁面并找出鏈接privateArrayList<String>retrieveLinks(URLpageUrl,StringpageContents,HashSetcrawledList,booleanlimitHost){ArrayList<String>linkList=newArrayList<String>();HtmlParserparser=newHtmlParser(pageContents);linkList=parser.getResult();return(linkList);}//搜索下載Web頁面的內(nèi)容,判斷在該頁面內(nèi)有沒有指定的搜索字符串privatebooleansearchStringMatches(Stringurl,StringpageContents,StringsearchString,booleancaseSensitive){StringsearchContents=pageContents;if(!caseSensitive){//如果不區(qū)分大小寫searchContents=pageContents.toLowerCase();}//Patternp=Ppile("[\\s]+");//Stringterms=p.split(searchString).toString();Stringterms=searchString;//for(inti=0;i<terms.length();i++){if(caseSensitive){if(searchContents.indexOf(terms)==-1){returnfalse;}else{intaa=searchContents.indexOf(terms);Stringbb=searchContents.substring(aa,aa+terms.length()+10);//System.out.println(bb);result.add("<ahref="+url+">"+bb+"</a>");}}else{if(searchContents.indexOf(terms.toLowerCase())==-1){returnfalse;}else{//存在相同字符串intaa=searchContents.indexOf(terms.toLowerCase());Stringbb=searchContents.substring(aa,aa+terms.length()+10);//System.out.println(bb);result.add("<ahref="+url+">"+bb+"</a>");}}}returntrue;}//執(zhí)行實際的搜索操作publicArrayList<String>crawl(StringstartUrl,intmaxUrls,StringsearchString,booleanlimithost,booleancaseSensitive){System.out.println("searchString="+searchString);//搜索字符串HashSet<String>crawledList=newHashSet<String>();LinkedHashSet<String>toCrawlList=newLinkedHashSet<String>();if(maxUrls<1){errorList.add("InvalidMaxURLsvalue.");System.out.println("InvalidMaxURLsvalue.");}if(searchString.length()<1){errorList.add("MissingSearchString.");System.out.println("MissingsearchString");}if(errorList.size()>0){System.out.println("err!!!");returnerrorList;}//從開始URL中移出wwwstartUrl=removeWwwFromUrl(startUrl);toCrawlList.add(startUrl);while(toCrawlList.size()>0){if(maxUrls!=-1){if(crawledList.size()==maxUrls){break;}}//GetURLatbottomofthelist.Stringurl=toCrawlList.iterator().next();//RemoveURLfromthetocrawllist.to

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論