




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、本科畢業(yè)設(shè)計(jì)題目:基于網(wǎng)絡(luò)爬蟲的搜索引擎設(shè)計(jì)與實(shí)現(xiàn)系 別: 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 班 級: 學(xué) 號: 姓 名: 同組人: 指 導(dǎo) 教 師: 教師職稱: 協(xié) 助 指 導(dǎo) 教 師: 教師職稱: 摘要本文從搜索引擎的應(yīng)用出發(fā),探討了網(wǎng)絡(luò)蜘蛛在搜索引擎中的作用和地住,提出了網(wǎng)絡(luò)蜘蛛的功能和設(shè)計(jì)要求。在對網(wǎng)絡(luò)蜘蛛系統(tǒng)結(jié)構(gòu)和工作原理所作分析的基礎(chǔ)上,研究了頁面爬取、解析等策略和算法,并使用Java實(shí)現(xiàn)了一個網(wǎng)絡(luò)蜘蛛的程序,對其運(yùn)行結(jié)果做了分析。關(guān)鍵字:爬蟲、搜索引擎AbstractThe paper,discussing from the application of the search engin
2、e,searches the importance and function of Web spider in the search engineand puts forward its demand of function and designOn the base of analyzing Web Spiders system strtucture and working elementsthis paper also researches the method and strategy of multithreading scheduler,Web page crawling and H
3、TML parsingAnd thena program of web page crawling based on Java is applied and analyzedKeyword: spider, search engine目錄摘要2Abstract3一、項(xiàng)目背景51.1搜索引擎現(xiàn)狀分析51.2課題開發(fā)背景61.3網(wǎng)絡(luò)爬蟲的工作原理8二、系統(tǒng)開發(fā)工具和平臺92.1關(guān)于java語言92.2 Jbuilder介紹102.3 servlet的原理12三、系統(tǒng)總體設(shè)計(jì)143.1系統(tǒng)總體結(jié)構(gòu)143.2系統(tǒng)類圖14四、系統(tǒng)詳細(xì)設(shè)計(jì)174.1搜索引擎界面設(shè)計(jì)174.2 servlet的實(shí)現(xiàn)194.
4、3網(wǎng)頁的解析實(shí)現(xiàn)204.3.1網(wǎng)頁的分析204.3.2網(wǎng)頁的處理隊(duì)列214.3.3 搜索字符串的匹配224.3.4網(wǎng)頁分析類的實(shí)現(xiàn)224.4網(wǎng)絡(luò)爬蟲的實(shí)現(xiàn)25五、系統(tǒng)測試33六、結(jié)論35致謝35參考文獻(xiàn)36一、項(xiàng)目背景1.1搜索引擎現(xiàn)狀分析互聯(lián)網(wǎng)被普及前,人們查閱資料首先想到的便是擁有大量書籍的圖書館,而在當(dāng)今很多人都會選擇一種更方便、快捷、全面、準(zhǔn)確的方式互聯(lián)網(wǎng)如果說互聯(lián)網(wǎng)是一個知識寶庫,那么搜索引擎就是打開知識寶庫的一把鑰匙搜索引擎是隨著WEB信息的迅速增加,從1995年開始逐漸發(fā)展起來的技術(shù),用于幫助互聯(lián)網(wǎng)用戶查詢信息的搜索工具搜索引擎以一定的策略在互聯(lián)網(wǎng)中搜集、發(fā)現(xiàn)信息,對信息進(jìn)行理解
5、、提取、組織和處理,并為用戶提供檢索服務(wù),從而起到信息導(dǎo)航的目的目前搜索引擎已經(jīng)成為倍受網(wǎng)絡(luò)用戶關(guān)注的焦點(diǎn),也成為計(jì)算機(jī)工業(yè)界和學(xué)術(shù)界爭相研究、開發(fā)的對象目前較流行的搜索引擎已有Google, Yahoo, Info seek, baidu等. 出于商業(yè)機(jī)密的考慮, 目前各個搜索引擎使用的Crawler 系統(tǒng)的技術(shù)內(nèi)幕一般都不公開, 現(xiàn)有的文獻(xiàn)也僅限于概要性介紹. 隨著W eb 信息資源呈指數(shù)級增長及Web 信息資源動態(tài)變化, 傳統(tǒng)的搜索引擎提供的信息檢索服務(wù)已不能滿足人們?nèi)找嬖鲩L的對個性化服務(wù)的需要, 它們正面臨著巨大的挑戰(zhàn). 以何種策略訪問Web, 提高搜索效率, 成為近年來專業(yè)搜索引擎網(wǎng)
6、絡(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ò)蜘蛛”實(shí)際上是一些基于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)對采集到的信息進(jìn)行索引并建立索引庫的索引處理系統(tǒng):索引處理系統(tǒng)對收集回來的網(wǎng)頁進(jìn)行分析,提取相關(guān)網(wǎng)頁信息(包括網(wǎng)頁所在URL、編碼類型、頁面內(nèi)容包含的關(guān)
7、鍵詞、關(guān)鍵詞位置、生成時間、大小、與其它網(wǎng)頁的鏈接關(guān)系等),根據(jù)一定的相關(guān)度算法進(jìn)行大量復(fù)雜計(jì)算,得到每一個網(wǎng)頁針對頁面內(nèi)容中及超鏈中每一個關(guān)鍵詞的相關(guān)度(或重要性),然后建立索引并存人到網(wǎng)頁索引數(shù)據(jù)庫中索引數(shù)據(jù)庫可以采用通用的大型數(shù)據(jù)庫,如Oracle,Sybase等,也可以自己定義文件格式進(jìn)行存放為了保證索引數(shù)據(jù)庫中的信息與Web內(nèi)容的同步,索引數(shù)據(jù)庫必須定時更新,更新頻率決定了搜索結(jié)果的及時性索引數(shù)據(jù)庫的更新是通過啟動“網(wǎng)絡(luò)蜘蛛”對Web空間重新搜索來實(shí)現(xiàn)的(3)完成用戶提交查詢請求的網(wǎng)頁檢索器:網(wǎng)頁檢索器一般是一個在Web服務(wù)器上運(yùn)行的服務(wù)器程序,它首先接收用戶提交的查詢條件,根據(jù)查詢
8、條件對索引庫進(jìn)行查找并將查詢到的結(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ù)值,然后進(jìn)行排序,相關(guān)度越高,排名越靠前最后由頁面生成系統(tǒng)將搜索結(jié)果的鏈接地址和頁面內(nèi)容摘要等內(nèi)容組織起來返回給用戶典型的搜索引擎系統(tǒng)如Google就是采用這種策略信息的飛速增長,使搜索引擎成為人們查找信息的首選工具,Google、百度、中國搜索等大型搜索引擎一直是人們討論的話題搜索引擎技術(shù)的研究,國外比中國要早近十年,從最早的Archie,到后來的Excite,以及ahvis
9、ta、overture、google等搜索引擎面世,搜索引擎發(fā)展至今,已經(jīng)有十幾年的歷史,而國內(nèi)開始研究搜索引擎是在上世紀(jì)末本世紀(jì)初在許多領(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
10、的人對搜索的結(jié)果感到不同程度的失望因此,如何提高搜索引擎的智能化程度,如何按照知識應(yīng)用的需要來組織信息,使互聯(lián)網(wǎng)不僅提供信息服務(wù),而且能為用戶提供知識服務(wù),將成為計(jì)算機(jī)工業(yè)界和學(xué)術(shù)界有待研究的方向。1.3網(wǎng)絡(luò)爬蟲的工作原理網(wǎng)絡(luò)爬蟲是搜索引擎的核心部分,其名稱出自Spider 的意譯, 具有相同詞義的詞語還有Crawler, robo ts, bot s, wanderer 等等.網(wǎng)絡(luò)爬蟲定義有廣義和狹義之分, 狹義上的定義為利用標(biāo)準(zhǔn)的http 協(xié)議根據(jù)超級鏈接和Web 文檔檢索的方法遍歷萬維網(wǎng)信息空間的軟件程序; 而廣義則是所有能利用http 協(xié)議檢索Web 文檔的軟件都稱之為網(wǎng)絡(luò)爬蟲.網(wǎng)絡(luò)爬
11、蟲是一個功能很強(qiáng)的自動提取網(wǎng)頁的程序, 它為搜索引擎從萬維網(wǎng)上下載網(wǎng)頁, 是搜索引擎的重要組成. 它通過請求站點(diǎn)上的HTML 文檔訪問某一站點(diǎn). 它遍歷W eb 空間, 不斷從一個站點(diǎn)移動到另一個站點(diǎn), 自動建立索引, 并加入到網(wǎng)頁數(shù)據(jù)庫中. 網(wǎng)絡(luò)爬蟲進(jìn)入某個超級文本時, 它利用HTML語言的標(biāo)記結(jié)構(gòu)來搜索信息及獲取指向其他超級文本的U RL 地址, 可以完全不依賴用戶干預(yù)實(shí)現(xiàn)網(wǎng)絡(luò)上的自動“爬行”和搜索。二、系統(tǒng)開發(fā)工具和平臺 2.1關(guān)于java語言Java語言是由Sun公司于1995年推出的一種新的編程語言,它是一種跨平臺、適合于分布式計(jì)算環(huán)境的純面向?qū)ο笳Z言。Java語言及其擴(kuò)展正在逐步成
12、為互聯(lián)網(wǎng)應(yīng)用的規(guī)范,掀起了自PC機(jī)以來的又一次技術(shù)革命。一般認(rèn)為,B語言導(dǎo)致了C語言的誕生、C語言演變出C+語言,而Java語言則明顯帶有C+語言的特征。Java總是和C+聯(lián)系在一起,而C+則是從C語言派生而來的,所以Java語言繼承了這兩種語言的大部分特性。Java的語法是從C繼承的,Java許多面向?qū)ο筇匦远际艿紺+的影響。事實(shí)上,Java中幾個自定義的特性都來自于或可以追溯到它的這些前驅(qū)語言。略有不同的是,Java語言完全面向?qū)ο螅瑥亩饤壛硕叩牟蛔阒?。Java語言的誕生與過去約30年中計(jì)算機(jī)語言的不斷改進(jìn)和發(fā)展密切相關(guān)。Java是由James Gosling、Patrick Nau
13、ghton、Chris Warth、Ed Frank以及Mike Sheridan等人于1991年在Sun Microsystems公司設(shè)計(jì)出來的,開發(fā)第一個版本花了18個月時間。該語言最初名叫“Oak”,后來發(fā)現(xiàn)“Oak”已經(jīng)是Sun公司另外一種語言的注冊商標(biāo),于1995年更名為“Java”,即太平洋上一個盛產(chǎn)咖啡的島嶼的名字。從1992 的秋天Oak問世,到1995春天公開發(fā)布Java語言,許多人都對Java的設(shè)計(jì)和改進(jìn)做出了貢獻(xiàn)。 自從于1995年被正式推出之后,Java語言就以其獨(dú)特的優(yōu)勢迅猛發(fā)展,經(jīng)過短短8、9年時間,成為迄今為止最為優(yōu)秀的面向?qū)ο笳Z言。Java也從當(dāng)初的一種語言而逐
14、漸形成一種產(chǎn)業(yè),基于Java語言的J2EE架構(gòu)已成為微軟.NET平臺的強(qiáng)大競爭對手。當(dāng)初,Java語言最初的發(fā)布不亞于一場革命,但是它并不標(biāo)志著Java快速革新時代的結(jié)束。在Java 1.0發(fā)布后不久,Java的設(shè)計(jì)者就已經(jīng)制定出了Java 1.1、 Java 1.2、 Java 1.3、 Java 1.4 、Java 2、Java 2.1.4版。作為當(dāng)前一種被廣泛使用的面向?qū)ο缶幊陶Z言,Java具有多方面的特點(diǎn)。如果與其他眾多的編程語言作一下比較,會發(fā)現(xiàn)這些特點(diǎn)正是Java語言之所以如此風(fēng)靡的原因所在。雖然Java在某些方面(例如資源耗費(fèi))也存在一些不足,但這絲毫不影響Java作為目前最優(yōu)秀
15、面向?qū)ο缶幊陶Z言的地位。 Java是一種被廣泛使用的網(wǎng)絡(luò)編程語言,這是一種新的計(jì)算概念。網(wǎng)絡(luò)環(huán)境下的編程語言最需要解決的是可移植性和安全性問題。以字節(jié)方式進(jìn)行編碼,使得程序不受運(yùn)行平臺和環(huán)境的限制成為可能。Java語言還提供了豐富的類庫,使程序設(shè)計(jì)人員可以很方便地調(diào)用相關(guān)類建立起自己的系統(tǒng)。Java作為一種高級程序設(shè)計(jì)語言,它除具有面向?qū)ο?、編寫簡單、脫離機(jī)器結(jié)構(gòu)、具有分布性、魯棒性、可移植性、安全性特點(diǎn)外,并且提供了并發(fā)機(jī)制,解釋執(zhí)行具有很高的性能。 2.2 Jbuilder介紹Java的開發(fā)工具中,最出名的莫過于Borland公司的JBuiIder了。對于一些沒有弄清楚開發(fā)工具與JDK的區(qū)
16、別的Java入門者來說。JBuiIder就如同Visual c+之于c+,以為JBuiIder就是Java的全部。比起捆綁在服務(wù)器上銷售的JDeveloper,JBuiIder應(yīng)該是唯一的僅靠自身的實(shí)力而占領(lǐng)了大部分市場的Java商用開發(fā)工具了。Jbuilder的特點(diǎn)::1)Jbuilder支持最新的Java技術(shù),包括Applets、JSP/Servlets、JavaBean以及EJB(Enterprise JavaBeans)的應(yīng)用。 2)用戶可以自動地生成基于后端數(shù)據(jù)庫表的EJB Java類,Jbuilder同時還簡化了EJB的自動部署功能.此外它還支持CORBA,相應(yīng)的向?qū)С绦蛴兄谟脩?/p>
17、全面地管理IDL(分布應(yīng)用程序所必需的接口定義語言Interface Definition Language)和控制遠(yuǎn)程對象。 3)Jbuilder支持各種應(yīng)用服務(wù)器。Jbuilder與Inprise Application Server緊密集成,同時支持WebLogic Server,支持EJB 1.1和EJB 2.0,可以快速開發(fā)J2EE的電子商務(wù)應(yīng)用。 4)Jbuilder能用Servlet和JSP開發(fā)和調(diào)試動態(tài)Web 應(yīng)用。 5)利用Jbuilder可創(chuàng)建(沒有專有代碼和標(biāo)記)純Java2應(yīng)用。由于Jbuilder是用純Java語言編寫的,其代碼不含任何專屬代碼和標(biāo)記,它支持最新的Ja
18、va標(biāo)準(zhǔn)。 6)Jbuilder擁有專業(yè)化的圖形調(diào)試介面,支持遠(yuǎn)程調(diào)試和多線程調(diào)試,調(diào)試器支持各種JDK版本,包括J2ME/J2SE/J2EE。 JBuilder環(huán)境開發(fā)程序方便,它是純的Java 開發(fā)環(huán)境,適合企業(yè)的J2EE開發(fā)。因此本次開發(fā)使用Jbuilder 2006. 2.3 servlet的原理Servlet是指運(yùn)行在服務(wù)器端的Java小程序。用于響應(yīng)客戶端的請求。在默認(rèn)情況下,Servlet采用一種無狀態(tài)的請求-響應(yīng)處理方式。Servlet代碼的主要作用是為了增強(qiáng)Java服務(wù)器端的功能,它運(yùn)行在服務(wù)器端,用于接收并且處理瀏覽器客戶端發(fā)出的請求,該請求是通過配置文件web.xml的相
19、關(guān)配置進(jìn)行轉(zhuǎn)發(fā)。也就是說Servlet是一個標(biāo)準(zhǔn)的Java類,它符合Java類的一般規(guī)則。和一般的Java類不同之處只是在于Servlet可以處理Http請求。1.servlet是持久的。servlet只需Web服務(wù)器加載一次,后續(xù)又用到這個servlet,就不需要再加載。(所謂加載是指servlet加載進(jìn)JVM運(yùn)行)2.servlet是與平臺無關(guān)的。3.servlet是可擴(kuò)展的。ActionServlet繼承自javax.servlet.http.HttpServlet類,其在Struts framework中扮演的角色是中心控制器。它提供一個中心位置來處理全部的終端請求??刂破鰽ction
20、Servlet主要負(fù)責(zé)將HTTP的客戶請求信息組裝后,根據(jù)配置文件的指定描述,轉(zhuǎn)發(fā)到適當(dāng)?shù)奶幚砥鰽ction。Servlet的原理圖描述如下:使用servlet有幾個優(yōu)點(diǎn):一是有效性,servlet的初始化代碼僅在web服務(wù)器第一次加載時候執(zhí)行一次,一旦加載了servlet,在處理一個新的請求的時候,只須調(diào)用一個新的服務(wù)方法。與處理每個請求都要全部加載一個完整的可執(zhí)行程序相比,效率得以提高。二是穩(wěn)定性,servlet能夠維護(hù)每個請求的狀態(tài),一旦加載了servlet,她就駐留在內(nèi)存中,對收到的請求提供服務(wù)。三是可移植性,servlet是用java開發(fā)的,因此它是可移植的,這種可移植性使servl
21、et能夠移植到新的操作系統(tǒng)中而不必改變代碼。四是安全性,servlet在服務(wù)器端運(yùn)行,因此,安全性由web服務(wù)器提供能保障,servlet也能夠利用java Security Manager提供的安全性功能。三、系統(tǒng)總體設(shè)計(jì) 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, 一個核心的U RL 集被用來作為一個種子集合, 這種算法遞歸的跟蹤超鏈接到其它頁面, 而通常不管頁面的
22、內(nèi)容, 因?yàn)樽罱K的目標(biāo)是這種跟蹤能覆蓋整個W eb. 這種策略通常用在通用搜索引擎中,因?yàn)橥ㄓ盟阉饕娅@得的網(wǎng)頁越多越好, 沒有特定的要求.二是寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索) 是最簡便的圖的搜索算法之一, 這一算法也是很多重要的圖的算法的原型.單源最短路徑算法和P rim 最小生成樹算法都采用了和寬度優(yōu)先搜索類似的思想.寬度優(yōu)先搜索算法是沿著樹的寬度遍歷樹的節(jié)點(diǎn), 如果發(fā)現(xiàn)目標(biāo), 則算法中止. 該算法的設(shè)計(jì)和實(shí)現(xiàn)相對簡單, 屬于盲目搜索. 在目前為覆蓋盡可能多的網(wǎng)頁, 一般使用寬度優(yōu)先搜索方法. 也有很多研究將寬度優(yōu)先搜索策略應(yīng)用于聚焦爬蟲中. 其基本思想是認(rèn)為與初始U RL 在一定鏈接
23、距離內(nèi)的網(wǎng)頁具有主題相關(guān)性的概率很大. 另外一種方法是將寬度優(yōu)先搜索與網(wǎng)頁過濾技術(shù)結(jié)合使用, 先用廣度優(yōu)先策略抓取網(wǎng)頁, 再將其中無關(guān)的網(wǎng)頁過濾掉. 這些方法的缺點(diǎn)在于, 隨著抓取網(wǎng)頁的增多, 大量的無關(guān)網(wǎng)頁將被下載并過濾, 算法的效率將變低。 三是深度優(yōu)先搜索所遵循的搜索策略是盡可能“深”地搜索圖. 在深度優(yōu)先搜索中, 對于最新發(fā)現(xiàn)的頂點(diǎn), 如果它還有以此為起點(diǎn)而未探測到的邊, 就沿此邊繼續(xù)漢下去. 當(dāng)結(jié)點(diǎn)v 的所有邊都己被探尋過, 搜索將回溯到發(fā)現(xiàn)結(jié)點(diǎn)v 有那條邊的始結(jié)點(diǎn). 這一過程一直進(jìn)行到已發(fā)現(xiàn)從源結(jié)點(diǎn)可達(dá)的所有結(jié)點(diǎn)為止. 如果還存在未被發(fā)現(xiàn)的結(jié)點(diǎn), 則選擇其中一個作為源結(jié)點(diǎn)并重復(fù)以上
24、過程, 整個進(jìn)程反復(fù)進(jìn)行直到所有結(jié)點(diǎn)都被發(fā)現(xiàn)為止. 深度優(yōu)先在很多情況下會導(dǎo)致爬蟲的陷入( t rapped) 問題, 所以它既不是完備的, 也不是最優(yōu)的。四、系統(tǒng)詳細(xì)設(shè)計(jì)4.1搜索引擎界面設(shè)計(jì) 4.1.1界面設(shè)計(jì)實(shí)現(xiàn)設(shè)計(jì)界面如下: 4.1.2設(shè)計(jì)代碼分析簡易搜索引擎搜索內(nèi)容4.2 servlet的實(shí)現(xiàn) 用Servlet來響應(yīng)用戶的請求,實(shí)現(xiàn)搜索參數(shù)的傳入。具體代碼設(shè)計(jì)為:package crawer;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import .*;
25、public class MyServlet extends HttpServlet private static final String CONTENT_TYPE = text/html; charset=GBK; public Timer timer; myspider crawler ; ArrayList myresult;/搜索到的結(jié)果 /Initialize global variables public void init() throws ServletException /Process the HTTP Get request public void doGet(Http
26、ServletRequest request, HttpServletResponse response) throws ServletException, IOException String var0 = request.getParameter(param0); if (var0 = null) var0 = ; response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); byte bytes=var0.getBytes(ISO-8859-1); String search=new Stri
27、ng(bytes,GB2312); crawler = new myspider(,10,search); /Thread search=new Thread(crawler); / search.start(); /此處開始爬行 crawler.run(); /啟動定時器,在時間內(nèi)檢查是否有結(jié)果,并顯示 myresult=new ArrayList(); /搜索到的結(jié)果 myresult=crawler.getResult(); out.println(); out.println(爬蟲演示); out.println(注意默認(rèn)起始站點(diǎn)為:,層數(shù)為10); out.println(搜索+se
28、arch+結(jié)果:); out.println(); String te; for(int i=0;imyresult.size();i+) te=String.valueOf(i+1); out.println(+te+、+myresult.get(i)+);/輸出結(jié)果 if(myresult.size()=0) out.println(對不起,沒有找到結(jié)果); out.println(); out.println(); out.close(); /Clean up resources public void destroy() 4.3網(wǎng)頁的解析實(shí)現(xiàn)4.3.1網(wǎng)頁的分析網(wǎng)頁文檔作為一種半結(jié)構(gòu)化
29、文本是一種界于自由文本和結(jié)構(gòu)化文本之間的數(shù)據(jù),它通常沒有嚴(yán)格的格式。對于這類文本一般是通過分析文本中特有的標(biāo)志性字符進(jìn)行爬行處理,具體而言就是分析HTML語言中的各種標(biāo)記之間的關(guān)系。網(wǎng)頁信息的載體是網(wǎng)頁文本,用超文本標(biāo)記語言編寫。由HTML標(biāo)準(zhǔn)定義了一組元素類型,不同類型的元素分別描述文本、圖像和超文本鏈接等。一個元素的描述一般由開始標(biāo)記(Start Tag)、內(nèi)容(Content)、結(jié)束標(biāo)記(End Tag)所組成。元素名稱出現(xiàn)在開始標(biāo)記中,在HTML語言中標(biāo)記為,對應(yīng)的結(jié)束標(biāo)記為,內(nèi)容出現(xiàn)在開始標(biāo)記和結(jié)束標(biāo)記之間。通過構(gòu)造網(wǎng)頁標(biāo)記樹的方法可反映網(wǎng)頁的結(jié)構(gòu)特點(diǎn),下圖是一個簡單的動態(tài)網(wǎng)頁標(biāo)記樹
30、 4.3.2網(wǎng)頁的處理隊(duì)列頁面處理隊(duì)列中保存的是頁面的URL,它實(shí)際上是由等待隊(duì)列、處理隊(duì)列、錯誤隊(duì)列、完成隊(duì)列組成。正是通過它們,某個具體的移動Spider得以完成對該Spider所對應(yīng)web的全部搜索任務(wù)。頁面隊(duì)列中保存的頁面的URL都是屬于內(nèi)鏈接。(1)等待隊(duì)列(WaitURL)。在這個隊(duì)列中,URL等待被移動Spider程序處理。新發(fā)現(xiàn)的URL被加入到這個隊(duì)列中。(2)處理隊(duì)列(ProcessUI )。當(dāng)移動Spider程序開始處理URL時,它們被傳送到這一隊(duì)列,但同一個URL不能被多次處理,因?yàn)檫@樣是浪費(fèi)資源。當(dāng)一個URL被處理過后,它將被移送到錯誤隊(duì)列或者是完成隊(duì)列。(3)錯誤隊(duì)列
31、(ErrorURL)。如果在處理某一頁面時發(fā)生錯誤,它的URL將被加入到錯誤隊(duì)列,該URL到達(dá)這一隊(duì)列后將不再移人其他隊(duì)列。一旦網(wǎng)頁移入錯誤隊(duì)列,移動Spider程序?qū)⒉粫賹λ鬟M(jìn)一步處理。(4)完成隊(duì)列(LaunchURL)。如果在處理網(wǎng)頁時沒有發(fā)生錯誤,處理完畢時,該URL將被加入到完成隊(duì)列,該URL到達(dá)這一隊(duì)列后將不再移人其他隊(duì)列。同一時間一個URL只能在一個隊(duì)列中,這也叫做URL的狀態(tài),這是因?yàn)槿藗兂3J褂脿顟B(tài)圖描述計(jì)算機(jī)程序,程序按照狀態(tài)圖從一個狀態(tài)變換到下一個狀態(tài)實(shí)際上,當(dāng)發(fā)現(xiàn)URL(內(nèi)鏈接)時,移動Spider會檢查該URL是否已經(jīng)存在于完成隊(duì)列或錯誤隊(duì)列中,如果已經(jīng)存在于上述
32、兩種隊(duì)列的任何一個隊(duì)列中,那么移動Spider將不會對此URL進(jìn)行任何處理。由此,可避免某個頁面被重復(fù)處理,防止陷入死循環(huán)。 4.3.3 搜索字符串的匹配對于要搜索的字符串,必須在抓取的網(wǎng)頁中進(jìn)行匹配檢查,如果存在于該網(wǎng)頁中,則把地址添加到輸出隊(duì)列中。4.3.4網(wǎng)頁分析類的實(shí)現(xiàn)package crawer;/html文件解析類import java.io.ByteArrayOutputStream;import java.util.Hashtable;import java.util.Enumeration;import java.util.Vector;import java.util.St
33、ack;import .URL;import .MalformedURLException;import java.util.StringTokenizer;import java.io.InputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.ArrayList;/類實(shí)體public class HtmlParser ArrayList fafa=new ArrayList(); URL base = null; / 基本URL publ
34、ic HtmlParser (String PageContent) int state = 0; StringBuffer sb = new StringBuffer(); int i = PageContent.length(); /System.out.println(循環(huán)讀取解析); for (int j = 0; j i; j+) /循環(huán)讀取解析/ switch (state) case 0: if (PageContent.charAt(j) = ) state = ; break; case ) state = 0; analyze(sb.toString(); sb.setLe
35、ngth(0); else sb.append(char) PageContent.charAt(j); public void analyze(String param) StringTokenizer st = new StringTokenizer(param); if (st.countTokens() 2) return; String first_word = st.nextToken().toLowerCase(); if (first_word.equals(a) analyzeAnchor(st.nextToken(); else if (first_word.equals(
36、frame) analyzeFrame(st.nextToken(); else if (first_word.equals(base) extractBase(st.nextToken(); /*分析 分析. */ void analyzeAnchor(String anchor) String href = extract(anchor, href); if (href = null) return; addURL( href); /*分析 分析. */ void analyzeFrame(String frame) String src = extract(frame, src); if
37、 (src = null) return; addURL(src); /* 由 標(biāo)記中分離url. */ void extractBase(String b) String b2 = extract(b, href); if (b2 != null) try base = new URL( b2); catch (MalformedURLException e) e.printStackTrace(); String extract(String line, String key) try key = key.toLowerCase(); String lower_case = line.to
38、LowerCase(); int i = lower_case.indexOf(key); if (i 0) return null; i += key.length(); if (line.charAt(i) != =) return null; i+; int i2; if (line.charAt(i) = ) i+; i2 = line.indexOf(, i); if (i2 0) return line.substring(i); else return line.substring(i, i2); else int targ = line.length(); for (i2 =
39、i; i targ; i+) if (Character.isSpace(line.charAt(i) break; return line.substring(i, i2); catch (StringIndexOutOfBoundsException e) return null; /* 添加 url 到URL列表. */public void addURL(String url) /System.out.println(url); fafa.add(url); public ArrayList getResult() return fafa; 4.4網(wǎng)絡(luò)爬蟲的實(shí)現(xiàn) 4.4.1爬蟲結(jié)構(gòu)分析
40、網(wǎng)絡(luò)爬蟲沿著WWW文件間的鏈接在網(wǎng)上漫游,記錄URL、文件的簡明概要、關(guān)鍵字或索引。其漫游結(jié)果是形成一個很大的本地?cái)?shù)據(jù)庫,你可以通過WWW瀏覽器訪問與該網(wǎng)絡(luò)爬蟲相配合的檢索服務(wù)器對其結(jié)果進(jìn)行查詢。但并不是所有的檢索服務(wù)器都采用robot只有那些自動在網(wǎng)上漫游并形成自己的數(shù)據(jù)庫的那些才是。每個robot完成的功能都不一樣所以它們的本地索引結(jié)果也就不同。Robot的運(yùn)行方式是這樣的:從一個或一組URL開始,訪問該URL并進(jìn)行本地索引同時記錄該URL所指HTML文件中所有新的URL錨鏈(anchor);然后再以這些新的URL為起始點(diǎn),繼續(xù)進(jìn)行本地索引,直到再沒有滿足條件的新URL為止。在記錄新URL
41、時,可以進(jìn)行分析和判斷,從中去掉不需要或不想要的URL,這不但提高了本地索引的速度,也減少了索引文件在本地所占用的磁盤空間。雖然robot和spider功能很強(qiáng),但如果有一組URL地址沒有被組bURL所鏈接到,那么robot和spider就找不到它們。同時由于robot和spider不能更新太快(因?yàn)榫W(wǎng)絡(luò)帶寬有限,如果更新太快,那么其他用戶就會受到影響),難免有不能及時加入的新WWW地址,所以很多擁有robot和spider的WWW索引和檢索服務(wù)站點(diǎn)同時提供一項(xiàng)由用戶加入新WWW地址的功能。如果僅僅是從遠(yuǎn)程獲得數(shù)據(jù),實(shí)現(xiàn)一個robot并不很難。但由于每個robot都是與一定的索引和檢索技術(shù)相聯(lián)
42、系的,所以它必須要能與其它模塊相配合工作。因而其實(shí)現(xiàn)時要考慮很多相關(guān)技術(shù)。一般來說,一個索引和檢索服務(wù)器在實(shí)現(xiàn)時要涉及的主要技術(shù)有如下幾方面:(1)HTTP (HyperText Transfer Protoco1)協(xié)議。它是WWW上數(shù)據(jù)傳輸?shù)臉?biāo)準(zhǔn)協(xié)議。通過它,我們可以跟WWW服務(wù)器進(jìn)行信息交換:從服務(wù)器獲得我們所要的各種信息,并將我們的要求發(fā)給服務(wù)器。(2)HTML(HyperText Markup Language)語言。它是WWW服務(wù)器所發(fā)回各種數(shù)據(jù)的主要描述語言, 因?yàn)樗阉饕娴闹饕阉髂繕?biāo)是文本,所以必須對HTML進(jìn)行解析,提取出相應(yīng)的數(shù)據(jù)。(3)分詞技術(shù)。為了提取關(guān)鍵字或者知識,必
43、須分隔出單個的詞和句子。(4)公共網(wǎng)關(guān)接口CGI(Conlmon Gateway Interface)。通過它,我們可以執(zhí)行WWW服務(wù)器上的程序:我們把查詢要求傳遞給HTTP服務(wù)器,HTTP務(wù)器根據(jù)客戶的請求執(zhí)行CGI程序CG I程序根據(jù)通過HTTP服務(wù)器傳遞的查詢要求對數(shù)據(jù)庫進(jìn)行操作,并把查詢結(jié)果以HTML的形式傳遞回HTTP客戶。 4.4.2爬蟲的設(shè)計(jì)實(shí)現(xiàn)package crawer;import java.util.*;import .*;import java.io.*;import java.util.regex.*;import javax.servlet.http.HttpSer
44、vletResponse;public class myspider implements Runnable private HashMap String,ArrayList disallowListCache = new HashMap String,ArrayList(); ArrayList errorList= new ArrayList();/錯誤信息 ArrayList result=new ArrayList(); /搜索到的結(jié)果 String startUrl;/開始搜索的起點(diǎn) int maxUrl;/最大處理的url數(shù) String searchString;/要搜索的字符串
45、(英文) boolean caseSensitive=false;/是否區(qū)分大小寫 boolean limitHost=false;/是否在限制的主機(jī)內(nèi)搜索 /PrintWriter out ; public myspider(String startUrl,int maxUrl,String searchString) this.startUrl=startUrl; this.maxUrl=maxUrl; this.searchString=searchString; /輸出設(shè)定 public ArrayList getResult() return result; public void
46、run()/啟動搜索線程 crawl(startUrl,maxUrl, searchString,limitHost,caseSensitive); /檢測URL格式 private URL verifyUrl(String url) / 只處理HTTP URLs. if (!url.toLowerCase().startsWith(http:/) return null; URL verifiedUrl = null; try verifiedUrl = new URL(url); catch (Exception e) return null; return verifiedUrl; / 檢測robot是否允許訪問給出的URL. private boolean isRobotAllowed(URL urlToCheck) Stri
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文明離校安全離校
- 美業(yè)月度工作總結(jié)
- 腸梗阻導(dǎo)管護(hù)理
- 四年級品德與社會下冊第五單元祖國真大活動主題四海峽兩岸盼統(tǒng)一教案教科版
- 2025年咯血中醫(yī)護(hù)理試題及答案
- 系統(tǒng)操作培訓(xùn)手冊
- 幼兒園吃藥的安全
- 供收協(xié)議合同范例
- 企業(yè)工程管理咨詢合同范例
- 供水設(shè)施維修合同范本
- 貴州省2025年初中學(xué)業(yè)水平考試英語模擬練習(xí)卷(含答案含聽力二維碼無音頻及原文)
- 2025年溫州市圖盛供電服務(wù)有限公司招聘筆試參考題庫含答案解析
- 尼康D3200中文說明書(完整版)
- 文明施工、環(huán)境保護(hù)管理體系與措施
- 應(yīng)急物資倉儲管理與調(diào)度
- 梁寧產(chǎn)品經(jīng)理思維30講知識講稿
- 2024年新疆生產(chǎn)建設(shè)兵團(tuán)興新職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- 西學(xué)中培訓(xùn)基地結(jié)業(yè)考試試題
- 2024年醫(yī)師定考題庫匯編
- 2024 大模型典型示范應(yīng)用案例集-2
- 中央空調(diào)改造項(xiàng)目施工方案
評論
0/150
提交評論