Web資源自動獲取技術(shù)研究與應(yīng)用_第1頁
Web資源自動獲取技術(shù)研究與應(yīng)用_第2頁
Web資源自動獲取技術(shù)研究與應(yīng)用_第3頁
Web資源自動獲取技術(shù)研究與應(yīng)用_第4頁
Web資源自動獲取技術(shù)研究與應(yīng)用_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、本本 科科 生生 畢畢 業(yè)業(yè) 論論 文文 題題目目: Web 資源自動獲取技術(shù)研究與應(yīng)用 目目 錄錄 1 1 緒論緒論 .1 1 1.1 研究的背景與意義研究的背景與意義 .1 1 1.2 本文研究的內(nèi)容本文研究的內(nèi)容 .2 2 2 2 網(wǎng)絡(luò)爬蟲的基本介紹網(wǎng)絡(luò)爬蟲的基本介紹 .2 2 2.1 網(wǎng)絡(luò)爬蟲的概述網(wǎng)絡(luò)爬蟲的概述 .2 2 2.2 網(wǎng)絡(luò)爬蟲的搜索策略網(wǎng)絡(luò)爬蟲的搜索策略 .2 2 2.3 分布式網(wǎng)絡(luò)爬蟲使用的關(guān)鍵技術(shù)分布式網(wǎng)絡(luò)爬蟲使用的關(guān)鍵技術(shù) .3 3 2.3.1 多線程與線程同步多線程與線程同步 .3 3 2.3.2 Socket 套接字協(xié)議套接字協(xié)議 .4 4 3 3 系統(tǒng)功能需求

2、分析系統(tǒng)功能需求分析 .5 5 3.1 HTTP/HTTPS 頁面下載器頁面下載器.5 5 3.2 頁面鏈接的提取和頁面鏈接的提取和 URL 的過濾的過濾 .5 5 3.3 URL 管理器管理器 .5 5 3.4 URL 轉(zhuǎn)發(fā)器轉(zhuǎn)發(fā)器.6 6 3.5 多線程網(wǎng)絡(luò)爬蟲多線程網(wǎng)絡(luò)爬蟲 .6 6 3.6 服務(wù)器端與客戶端的通信與協(xié)調(diào)服務(wù)器端與客戶端的通信與協(xié)調(diào) .6 6 4 4 系統(tǒng)的設(shè)計與實現(xiàn)過程系統(tǒng)的設(shè)計與實現(xiàn)過程 .7 7 4.1 開發(fā)環(huán)境與工具開發(fā)環(huán)境與工具 .7 7 4.2 爬蟲中服務(wù)器端的設(shè)計與實現(xiàn)爬蟲中服務(wù)器端的設(shè)計與實現(xiàn) .7 7 4.2.1 功能流程圖和代碼段及其界面圖功能流程圖和

3、代碼段及其界面圖.7 7 4.2.2 URL 分發(fā)器的實現(xiàn)分發(fā)器的實現(xiàn) .1010 4.2.3 ID 生成器的實現(xiàn)生成器的實現(xiàn).1111 4.3 爬蟲客戶端的設(shè)計與實現(xiàn)爬蟲客戶端的設(shè)計與實現(xiàn) .1111 4.3.1 功能流程圖和代碼段及其界面圖功能流程圖和代碼段及其界面圖 .1111 4.3.2 URL 轉(zhuǎn)發(fā)器的實現(xiàn)轉(zhuǎn)發(fā)器的實現(xiàn) .1313 4.3.3 URL 接收器及其消重的實現(xiàn)接收器及其消重的實現(xiàn) .1414 4.3.4 恢復(fù)采集斷點功能的實現(xiàn)恢復(fù)采集斷點功能的實現(xiàn) .1515 4.4 數(shù)據(jù)庫的設(shè)計與連接數(shù)據(jù)庫的設(shè)計與連接 .1616 4.5 系統(tǒng)的運行結(jié)果和測試分析系統(tǒng)的運行結(jié)果和測試分

4、析 .1717 4.6 下載網(wǎng)頁的查看下載網(wǎng)頁的查看 .2020 5 5 總結(jié)總結(jié) .2121 參考文獻參考文獻 .2222 致謝致謝 .2222 WebWeb 資源自動獲取技術(shù)研究與應(yīng)用資源自動獲取技術(shù)研究與應(yīng)用 作者:XXX 指導(dǎo)教師:XXX 摘摘 要:要:Web 資源自動獲取技術(shù)是一種自動提取,分析并過濾網(wǎng)頁的程序,也叫網(wǎng)絡(luò)爬蟲。 本文通過 JAVA 實現(xiàn)了一個分布式爬蟲程序。論文闡述了分布式網(wǎng)絡(luò)爬蟲實現(xiàn)中采用的關(guān)鍵 技術(shù):HTTP/HTTPS 頁面下載器,頁面鏈接的提取和 URL 的過濾,URL 管理器 URL 轉(zhuǎn)發(fā)器, 多線程網(wǎng)絡(luò)爬蟲,服務(wù)器端與客戶端的通信與協(xié)調(diào)。通過實現(xiàn)這一爬蟲程

5、序,可以搜集某 一站點的 URLs,并將搜集到的 URLs 存入數(shù)據(jù)庫。最后創(chuàng)建一個網(wǎng)頁讀取數(shù)據(jù)庫的下載的 URL,列表顯示出來并有超鏈接,點擊就可以打開下載的指定網(wǎng)頁,并在該頁面創(chuàng)建一個檢 索的功能,方便查找。 關(guān)鍵詞:關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;JAVA;分布式;多線程;URL Research and application on Web resources automatic acquisition technology Author: XXX Tutor:XXX Abstract:Automatic web resource acquisition technology is a progra

6、m used to automaticly extract , analyse and filter web page ,namely the Web crawler. In this paper ,JAVA is used to implement a distributed crawler program. The paper describes key technologies applied in implementing the distributed Web crawler: HTTP/HTTPS page downloader, extract of page links and

7、 filter of URLs, URL manager, URL repeater, multi-thread web crawler, communication and negotiation between server and client. The crawler program could collect a websites URLs, and save those URLs to the database. Finally establish a web page to read URL which stored in database,show them in list a

8、nd create a hypelink ,through clicking open the pages downloaded ,and create a searching function ,which can conveniently search. . Key phrase: Web crawler; JAVA; distribute ; multi-threads;URL 1 1 緒論緒論 1.11.1 研究的背景與意義研究的背景與意義 隨著互聯(lián)網(wǎng)的飛速發(fā)展,網(wǎng)絡(luò)上的信息呈爆炸式增長。這使得人們在網(wǎng)上 找到所需的信息越來越困難,這種情況下搜索引擎應(yīng)運而生。搜索引擎搜集互 聯(lián)網(wǎng)上數(shù)以

9、億計的網(wǎng)頁,并為每個詞建立索引。在建立搜索引擎的過程中,搜 集網(wǎng)頁是非常重要的一個環(huán)節(jié)。Web資源自動獲取技術(shù)程序就是用來搜集網(wǎng)頁的 程序,也叫爬蟲程序。目前已有的一些爬蟲是在單機上運行的,信息搜索速度 比較有限,由于Web資源的海量性,已無法在一個有限的時間范圍內(nèi)完成一次 爬行互聯(lián)網(wǎng)的任務(wù)。分布式的爬蟲系統(tǒng)采用多級并行工作,能提高系統(tǒng)的工作 效率,縮短爬行時間,具有良好的可擴展性。 1.21.2 本文研究的內(nèi)容本文研究的內(nèi)容 本文著眼于中等規(guī)模,力求一個健壯性,可擴展性,效率各方面都很完善 的一個高質(zhì)量的網(wǎng)絡(luò)爬蟲。從 “多機”爬蟲這方面詳細探討了分布式網(wǎng)絡(luò)爬蟲 的設(shè)計與實現(xiàn),在“多機”爬蟲設(shè)

10、計中重點討論了服務(wù)器端與客戶端爬蟲的設(shè) 計及實現(xiàn),首先借助功能流程圖從總體上對系統(tǒng)進行剖析,然后再對具體細節(jié) 一一突破:URL 分發(fā)器,ID 生成器,URL 轉(zhuǎn)發(fā)器,URL 接收器及界面動態(tài)顯示器 等。最后創(chuàng)建一個網(wǎng)頁讀取數(shù)據(jù)庫的下載的 URL,列表顯示出來并有超鏈接, 點擊就可以打開下載的指定網(wǎng)頁,并在該頁面創(chuàng)建一個檢索的功能,方便查找。 2 2 網(wǎng)絡(luò)爬蟲的基本介紹網(wǎng)絡(luò)爬蟲的基本介紹 2.12.1 網(wǎng)絡(luò)爬蟲的概述網(wǎng)絡(luò)爬蟲的概述 網(wǎng)絡(luò)爬蟲 ,其定義有廣義和狹義之分。狹義上指遵循標(biāo)準(zhǔn)的 http 協(xié)議利 用超鏈接和 Web 文檔檢索的方法遍歷萬維網(wǎng)信息空間的軟件程序 ,而廣義的定 義則是所有能遵

11、循 http 協(xié)議檢索 Web 文檔的軟件都稱之為網(wǎng)絡(luò)爬蟲。1 網(wǎng)絡(luò)爬蟲是一個功能很強的自動提取網(wǎng)頁的程序 ,它為搜索引擎從萬維網(wǎng) 上下載網(wǎng)頁 ,是搜索引擎的重要組成。它通過請求站點上的 HTML 文檔訪問某 一站點。它遍歷 Web 空間,不斷從一個站點移動到另一個站點 ,自動建立索引 ,并 加入到網(wǎng)頁數(shù)據(jù)庫中。網(wǎng)絡(luò)爬蟲進入某個超級文本時 ,它利用 HTML 語言的標(biāo) 記結(jié)構(gòu)來搜索信息及獲取指向其他超級文本的 URL 地址 ,可以完全不依賴用戶 干預(yù)實現(xiàn)網(wǎng)絡(luò)上的自動爬行和搜索。2 2.2.2 2 網(wǎng)絡(luò)爬蟲的搜索策略網(wǎng)絡(luò)爬蟲的搜索策略 在抓取網(wǎng)頁的時候 ,目前網(wǎng)絡(luò)爬蟲一般有兩種策略:無主題搜索與

12、基于某特 定主體的專業(yè)智能搜索。其中前者主要包括 :廣度優(yōu)先和深度優(yōu)先。而本系統(tǒng) 采用廣度優(yōu)先。 廣度優(yōu)先是指網(wǎng)絡(luò)爬蟲會先抓取起始網(wǎng)頁中鏈接的所有網(wǎng)頁 ,然后再選擇 其中的一個鏈接網(wǎng)頁,繼續(xù)抓取在此網(wǎng)頁中鏈接的所有網(wǎng)頁。這是最常用的方 式,因為這個方法可以讓網(wǎng)絡(luò)爬蟲并行處理 ,提高其抓取速度。2 因為本論文實現(xiàn)的爬蟲程序的初衷是盡可能遍歷某一站點所有的頁面。廣 度優(yōu)先算法的實行理論是覆蓋更多的節(jié)點,所以此爬蟲程序選擇了廣度優(yōu)先算 法。實現(xiàn)的策略是:先獲取初始 URL 對應(yīng) HTML 代碼里所有的 URLs。然后依 次獲取這些 URLs 對應(yīng)的 HTML 里的 URLs,當(dāng)這一層所有的 URLs

13、 都下載解 析完后,在獲取下一層的信息。通過這種循環(huán)的獲取方式實現(xiàn)廣度優(yōu)先爬行。 如下圖 1 假如 a 代表初始 URL,bcd 為以 a 獲取的 3 個 URLs,efg 為以 b 獲 取的 URLs,以此類推。那么這些 URLs 獲取的順序就是 abcdefghijklmnop 這樣 一個順序。當(dāng)獲取到 b 的 URLs 之后,并不會馬上去解析這些 URLs,而是先解 析同 b 在同一層中的 cd 對應(yīng)的 URLs。當(dāng)這一層 URLs 全部解析完后,再開始下 一層 URLs。 圖圖 1 1 廣度優(yōu)先爬行策略圖廣度優(yōu)先爬行策略圖 廣度優(yōu)先算法的等待隊列設(shè)計如圖 2 所示: 圖圖 2 2 廣度

14、優(yōu)先算法的等待隊列設(shè)計圖廣度優(yōu)先算法的等待隊列設(shè)計圖 2.2.3 3 分布式網(wǎng)絡(luò)爬蟲使用的關(guān)鍵技術(shù)分布式網(wǎng)絡(luò)爬蟲使用的關(guān)鍵技術(shù) .1 多線程與線程同步多線程與線程同步 所謂多進程,就是讓系統(tǒng)(好像)同時運行多個程序。比如,我在 Microsoft Word 編寫本論文的時候,我還打開了一酷狗來播放音樂,偶爾我還 會再編輯 Word 的同時讓我的機器執(zhí)行一個打印任務(wù),而且我還喜歡通過 IE 從 網(wǎng)上下載一個 Flash 動畫。對于我來說,這些操作都是同步進行的,我不需要 等一首歌曲放完了再來編輯我的論文??雌饋恚鼈兌纪瑫r在我的機器上給我 工作。 事實的真相是,對于一個 CPU

15、而言,它在某一個時間點上,只能執(zhí)行一個 程序。CPU 不斷的在這些程序之間“跳躍”執(zhí)行。那么,為什么我們看不出任 何的中斷現(xiàn)象呢?這是因為,相對于我們的感覺,它的速度實在太快了。我們 人的感知時間可能以秒來計算。而對于 CPU 而言,它的時間是以毫秒來計算的, 從我們?nèi)庋劭磥?,它們就是一個連續(xù)的動作。 因此,雖然我們看到的都是一些同步的操作,但實際上,對于計算機而言, 它在某個時間點上只能執(zhí)行一個程序,除非你的計算機是多 CPU 的。 而多線程(Multi-Thread)擴展了多進程(multi-Process)操作的概念, 將任務(wù)的劃分下降到了程序級別,使得各個程序似乎可以在同一個時間內(nèi)執(zhí)行

16、 多個任務(wù)。每個任務(wù)稱為一個線程,能夠同時運行多個線程的程序稱為多線程 程序。 當(dāng)同時運行的相互獨立的線程要共享數(shù)據(jù)并且要考慮其他線程的狀態(tài)時, 就需要使用一套機制使得這些線程同步,避免在爭用資源時發(fā)生沖突,甚至發(fā) 生死鎖。JAVA 提供了多種機制以實現(xiàn)線程同步。多數(shù) JAVA 同步是以對象鎖定 為中心的。JAVA 中從 Object 對象繼承來的每個對象都有一個單獨的鎖。由于 JAVA 中的每個對象都是從 Object 繼承來的。所以 JAVA 中的每個對象都有自己 的鎖。這樣使它在共享的線程之間可以相互協(xié)調(diào)。在 JAVA 中實現(xiàn)線程同步的另 一個方法是通過使用 synchronized 關(guān)

17、鍵字。JAVA 使用 synchronized 關(guān)鍵字來 定義程序中要求線程同步的部分。synchronized 關(guān)鍵字實現(xiàn)的基本操作是把每 個需要線程同步的部分定義為一個臨界區(qū),在臨界區(qū)中同一時刻只有一個線程 被執(zhí)行。3 .2 2 SocketSocket 套接字協(xié)議套接字協(xié)議 “套接字” (Socket)是一種軟件形式的抽象,用于表達兩臺機器間一個連 接的“終端” 。針對一個特定的連接,每臺機器上都有一個“套接字” ,可以想 象它們之間有一條虛擬的“線纜” 。套接字不關(guān)心數(shù)據(jù)的格式,它和底層的 TCP/IP 協(xié)議都只需確保數(shù)據(jù)到達正確的目的地。套接字的工作很像郵政服務(wù), 它們

18、所做的就是將信息分遣到世界各地的計算機系統(tǒng)。 Java 有非常簡單的套接字編程,其中定義有兩個類:Socket 和 ServerSocket,在套接字程序設(shè)計中特別重要。如果編寫的程序是扮演服務(wù)器 的角色,它就應(yīng)該使用 ServerSocket;如果程序是連接到服務(wù)器的,那么它扮 演客戶端的角色,就應(yīng)該使用 Socket 類。 無論是通過子類 ServerSocket 完成的服務(wù)器還是客戶端,Socket 類只用 于最初的開始連接,一旦連接建立,就使用輸入和輸出流來促進客戶端和服務(wù) 器之間的通信。連接成功后,客戶端和服務(wù)器之間的區(qū)別就完全沒意義了。任 意一端都可以往套接字讀寫數(shù)據(jù)。 從套接字得

19、到的結(jié)果是一個 InputStream 以及 OutputStream(若使用恰當(dāng) 的轉(zhuǎn)換器,則分別是 Reader 和 Writer) ,以便將連接作為一個 IO 流對象對待。 一旦客戶(程序)申請建立一個套接字連接,ServerSocket 就會返回(通過 accept()方法)一個對應(yīng)的服務(wù)器端套接字,以便進行直接通信。從此時起, 我們就得到了真正的“套接字套接字”連接,可以用同樣的方式對待連接的 兩端,因為它們本來就是相同的。此時可以利用 getInputStream()以及 getOutputStream()從每個套接字產(chǎn)生對應(yīng)的 InputStream 和 OutputStream

20、 對 象,這些數(shù)據(jù)流必須封裝到緩沖區(qū)內(nèi)。 3 3 系統(tǒng)功能需求分析系統(tǒng)功能需求分析 3.13.1 HTTP/HTTPSHTTP/HTTPS 頁面下載器頁面下載器 該頁面下載器借助 HTTP/HTTPS 協(xié)議從給定的 URL 地址下載網(wǎng)頁內(nèi)容,并將 其存入指定路徑的文件中。在下載某個鏈接的網(wǎng)頁之前,該下載器應(yīng)先判斷出 待下載文件的類型,用以屏蔽掉圖片,音頻,可執(zhí)行文件等容量大的文件下載, 因為那些文件的下載十分耗時,直接影響到整個系統(tǒng)的運行與性能。 除了下載頁面內(nèi)容外,下載器還應(yīng)記錄下載的頁面總數(shù),用以最后結(jié)果的 統(tǒng)計及性能的分析。 3.23.2 頁面鏈接的提取和頁面鏈接的提取和 URLURL

21、的過濾的過濾 很明顯,要使爬蟲得以運行,就應(yīng)該具有維持爬蟲爬行的 URL 地址。也就 是說,除了下載某個 URL 指定頁面的內(nèi)容外,還應(yīng)分析頁面的 HTML 代碼,從中 提取出所有符合條件的相關(guān)鏈接,然后存入 URL 隊列中等待爬蟲的獲取。 然而,并非所有的 URL 都是待爬行的對象,在存入隊列之前應(yīng)對其進行過 濾處理,只保留“內(nèi)部鏈接” ,即與初始 URL 主機名相同的鏈接,而舍棄外部 鏈接及其他類型的鏈接。因為如果對 URL 不加控制,最終將可能造成爬蟲陷入 不可終止的無限爬行之中,這一點是我們不愿發(fā)生的。 3.33.3 URLURL 管理器管理器 爬蟲的主要工作之一是組織所訪問過的和將要

22、訪問的站點的列表,這些列 表成為作業(yè)。URL 管理器又稱作業(yè)管理器,用于管理已爬行過的、等待被爬行 的、正在爬行的和因下載出錯而停止爬行的作業(yè)或 URL,即負責(zé) URL 的提取和 裝載工作。 URL 管理器應(yīng)保證每一個即將裝載的 URL 在作業(yè)列表中不含有該 URL,即 URL 去重。除了存儲每個 URL 之外,管理器還應(yīng)記錄及動態(tài)地改變它們當(dāng)前所 處的狀態(tài),以便爬蟲程序能取出合理的 URL 而得以正常運轉(zhuǎn)。 3.43.4 URLURL 轉(zhuǎn)發(fā)器轉(zhuǎn)發(fā)器 可以說 URL 轉(zhuǎn)發(fā)器是實現(xiàn)可擴展 Spider 的關(guān)鍵之處,其主要任務(wù)是實現(xiàn)對 URL 的分配和轉(zhuǎn)發(fā)。 服務(wù)器端的主要工作就是實現(xiàn)對 URL

23、的特定轉(zhuǎn)發(fā),將 URL 根據(jù)指定的原則 分配給不同的客戶端進行爬行;而各個爬蟲在每爬取一個網(wǎng)頁之前,都要由該 轉(zhuǎn)發(fā)器做出判斷,若屬于自己的爬行范圍并且該 URL 未曾爬行過,則由 URL 管 理器將該 URL 追加到等待作業(yè)中,否則進行轉(zhuǎn)發(fā)工作,即把該 URL 發(fā)給服務(wù)器, 由服務(wù)器端做出進一步分析來決定轉(zhuǎn)發(fā)給哪臺爬蟲。 3.53.5 多線程網(wǎng)絡(luò)爬蟲多線程網(wǎng)絡(luò)爬蟲 該系統(tǒng)實現(xiàn)的爬蟲,不僅是分布式的,即多臺爬蟲并行開啟爬行任務(wù),而 且應(yīng)該是多線程的。 也就相當(dāng)于把抓取網(wǎng)頁這件事情由以前的一個 worker 來完成變成現(xiàn)在的許 許多多的 worker 來實現(xiàn),這些 worker 之間相互協(xié)調(diào),共同

24、維持同一個 URL 隊 列,從而可以大大提高抓取的速度及系統(tǒng)的性能。 worker 變多了,秩序管理就應(yīng)相應(yīng)增強,否則將造成對共享數(shù)據(jù)的破壞, 以及 worker 間混亂的局面。這里的秩序管理也就是線程間的同步,這一點也是 實現(xiàn)多線程的關(guān)鍵。 3.63.6 服務(wù)器端與客戶端的通信與協(xié)調(diào)服務(wù)器端與客戶端的通信與協(xié)調(diào) 要實現(xiàn)可擴展的網(wǎng)絡(luò)爬蟲,首先應(yīng)該解決的問題就是爬蟲與主控端暢通的 會話以及在此基礎(chǔ)上提供一個融洽、協(xié)調(diào)的通信環(huán)境。當(dāng)啟動會話后,對于客 戶端提出的每一個請求,服務(wù)器都應(yīng)給出相應(yīng)的回復(fù)以避免客戶端長時間的等 待。當(dāng)會話完成時,雙方應(yīng)各自發(fā)出指令來正常結(jié)束本次通話。 首先,打開服務(wù)器用以

25、隨時響應(yīng)客戶端發(fā)出的請求,接著當(dāng)某臺爬蟲客戶 端準(zhǔn)備好就緒工作后便發(fā)出指令向服務(wù)器注冊自己的 ID 號,注冊成功后,服務(wù) 器上記錄并顯示出該臺爬蟲的信息并向該客戶端返回所分配的 ID 號及當(dāng)前就緒 態(tài)的爬蟲總數(shù)。 其次,當(dāng)各爬蟲均處于就緒態(tài)時,由服務(wù)器發(fā)出開始爬行的命令,從而將 初始 URL 經(jīng)分發(fā)器處理后啟動其中某臺爬蟲首先工作,經(jīng)過一系列的轉(zhuǎn)發(fā)和分 發(fā)使整個系統(tǒng)處于有序的運行之中。 在運行過程中,各客戶端可以動態(tài)地顯示下載頁面數(shù)、爬行過的 URL 列表、 當(dāng)前活動的線程數(shù)及與服務(wù)器間的會話情況,而服務(wù)器也可以隨時發(fā)出爬行中 斷命令來中斷各爬蟲的運行以結(jié)束本次會話,或者動態(tài)地增加爬蟲客戶端的

26、數(shù) 目,新增的爬蟲能讓服務(wù)器覺察到并立即予以分配 ID 和 URL、更新爬蟲列表并 把該消息通知其他爬蟲,使整個系統(tǒng)處于新的運轉(zhuǎn)之中。 最后,當(dāng)各爬蟲正常結(jié)束爬行任務(wù)或被中斷爬行時,將各自向服務(wù)器通報 自己的爬行結(jié)果包括下載頁面總數(shù),下載經(jīng)歷的時間及 URL 下載速度等。之后, 本次會話結(jié)束,系統(tǒng)正常退出。 4 4 系統(tǒng)的設(shè)計與實現(xiàn)過程系統(tǒng)的設(shè)計與實現(xiàn)過程 4.14.1 開發(fā)環(huán)境與工具開發(fā)環(huán)境與工具 本次開發(fā)環(huán)境與工具為:操作系統(tǒng):Microsoft Windows XP Professional Service Pack 2;開發(fā)工具:EClipse JDK1.6.0 SQL server

27、2005;Tomcat6.0 開發(fā)語言:Java; PC 機: HP Pavilion(AMD CPU 2.01GHz,256M 內(nèi)存,80G 硬盤 )。 4.24.2 爬蟲中服務(wù)器端的設(shè)計與實現(xiàn)爬蟲中服務(wù)器端的設(shè)計與實現(xiàn) .1 功能流程圖和代碼段及其界面圖功能流程圖和代碼段及其界面圖 首先,給出服務(wù)器端總體功能流程圖圖 3 及相應(yīng)代碼: 圖圖 3 3 服務(wù)器端總體功能流程圖服務(wù)器端總體功能流程圖 相應(yīng)代碼如下: /- public void receive() /等待并處理客戶端的連接 try server=new ServerSocket(port); /初始化服務(wù)器套接字

28、 while(true) socket=server.accept(); /等待連接 System.err.println(socket.getInetAddress()+連接n); /得到客戶機地址 Client client=new Client(socket,id); /實例化一個客戶線程 clients.addElement(client); /增加客戶線程到向量中 addInfor(client); / 顯示客戶信息 btStart.setEnabled(true); client.start(); /啟動線程,處理本次會話 notifyChatRoom(); /通知更新后的爬蟲數(shù)目

29、 id=produceID(id);/為下一個客戶分配新的 ID catch(Exception ex) ex.printStackTrace(); /輸出出錯信息 /- 接著,再給出服務(wù)器中處理每個客戶端的會話線程的相應(yīng)代碼及工作流程圖圖 7 相關(guān)部分代碼如下: /- line=reader.readLine(); /讀取數(shù)據(jù)流 if(keyword.equals(URL)/若客戶端發(fā)送來的是 URL 請求 String msg=st.nextToken(0); msg=msg.substring(1); CrawlerServer.addItemToDialog(From +this.id

30、+:+msg); CrawlerServer.sendToWhom(msg);/服務(wù)器實行轉(zhuǎn)發(fā)處理 else if(keyword.equals(Completed)| keyword.equals(Interrupted) /客戶端發(fā)送“完成”或“被中斷” String pageNum=st.nextToken(); String crawlingTime=st.nextToken(); String element=this.id+:+爬行頁面總數(shù) +pageNum+ 爬行所需時間 +crawlingTime; CrawlerServer.result.add(element); Craw

31、lerServer.result.add( ); CrawlerSpletedNum+; if(completedNum=CrawlerServer.clients.size() /若所有爬蟲都完成或中斷爬行任務(wù)則顯示完成或中斷爬行 if(keyword.equals(Completed) CrawlerServer.btStop.setLabel(完成爬行); else CrawlerServer.btStop.setLabel(中斷爬行); CrawlerServer.btStop.setEnabled(false); CrawlerServer.closeAll(); else if(k

32、eyword.equals(QUIT) /退出命令 CrawlerServer.disconnect(this); /斷開連接 CrawlerServer.notifyChatRoom(); /刷新信息 /- 工作流程圖如圖 4 所示: 圖圖 4 4 服務(wù)端會話線程功能流程圖服務(wù)端會話線程功能流程圖 服務(wù)器端界面圖如下圖 5: 圖圖 5 5 服務(wù)器端界面圖服務(wù)器端界面圖 當(dāng)各爬蟲都已就緒好并點擊“發(fā)送”按鈕后,服務(wù)器端的“各爬蟲信息欄” 將顯示每個爬蟲的信息,包括 IP 和 ID 號,同時“開始爬行”按鈕由灰變亮。 點擊該按鈕后,整個系統(tǒng)便開始運行,此時“停止爬行”按鈕由灰變亮, 接著便可在“

33、服務(wù)器與爬蟲對話欄”對話框中顯示 URL 轉(zhuǎn)發(fā)情況。操作人員也 可點擊“停止爬行”按鈕來中斷所有爬蟲的運行,同時在“各爬蟲狀態(tài)監(jiān)控欄” 中可動態(tài)顯示各個爬蟲當(dāng)前的采集信息,包括已下載網(wǎng)頁數(shù)、活動線程數(shù)和爬 蟲所處的狀態(tài)。當(dāng)爬蟲運行終止時,還進一步顯示其耗時及 URL 抓取率。 .2 URLURL 分發(fā)器的實現(xiàn)分發(fā)器的實現(xiàn) 當(dāng)服務(wù)器接受到來自客戶端的 URL 請求時,便要實現(xiàn)對 URL 的轉(zhuǎn)發(fā)的工作。 將 URL 轉(zhuǎn)發(fā)給正在運行的客戶端中的某一個。 轉(zhuǎn)發(fā)的第一步是實現(xiàn) URL 字符串與具體數(shù)字間的轉(zhuǎn)換,借用 MD5 算法中的 getMD5ofStr(String)方法可以首先完成

34、從 URL 字符串到 32 位 16 進制數(shù)字字符 串之間的變換。 String str_url=md5.getMD5ofStr(_url); 接著進行 url 的散列,針對 32 位的 16 進制數(shù),我們的散列策略是拆分法, 即,把 32 位長的 16 進制數(shù)字每 4 位分為一組,再這 8 組數(shù)轉(zhuǎn)換成 10 進制整數(shù), 然后累加,將累加和對爬蟲總數(shù)取余,其結(jié)果加 1 后便是轉(zhuǎn)發(fā)目標(biāo)的 ID 號。 double int_url=md5.getDNum(str_url);/得到累加和 int totalCrawler=clients.size();/獲取爬蟲總數(shù) int index=(int)i

35、nt_url%totalCrawler;/取余得出轉(zhuǎn)發(fā)目標(biāo) ID 主控端轉(zhuǎn)發(fā)器完整代碼如下: /- public static void sendToWhom(String _url) String str_url=md5.getMD5ofStr(_url); double int_url=md5.getDNum(str_url); /得到累加和 int totalCrawler=clients.size();/獲取爬蟲總數(shù) int index=(int)int_url%totalCrawler; /取余得出轉(zhuǎn)發(fā)目標(biāo) ID Client c; StringBuffer url=new Stri

36、ngBuffer(URL:); url.append(_url); c=(Client)clients.elementAt(index);/取出待轉(zhuǎn)發(fā)的爬蟲對象 c.send(url);/向該爬蟲發(fā)送 URL addItemToDialog(To +c.id+: +_url); btStart.setEnabled(false); /- .3 IDID 生成器的實現(xiàn)生成器的實現(xiàn) ID 生成器是用于給每臺爬蟲分配一個唯一的 ID 號,實現(xiàn)唯一標(biāo)識和統(tǒng)一 管理。它由兩部分構(gòu)成,第一部分都相同:“ID_”,第二部分為一個兩位的數(shù) 字。例如 ID_01,ID_02,ID_10 等。因此

37、當(dāng)要新生一個 ID 號時只需將第二 部分的數(shù)字增一即可。以下是生成器代碼: /- public static String produceID(String id) int index=id.indexOf(_); int num; String numPart=id.substring(index+1); if(numPart.startsWith(0) num=Integer.parseInt(numPart.substring(1); else num=Integer.parseInt(numPart); num+;/ID 號的整數(shù)部分增一 return (num9)?(ID_+num)

38、:(ID_0+num); /- 4.34.3 爬蟲客戶端的設(shè)計與實現(xiàn)爬蟲客戶端的設(shè)計與實現(xiàn) .1 功能流程圖和代碼段及其界面圖功能流程圖和代碼段及其界面圖 爬蟲客戶端流程圖如圖 6 所示: 圖圖 6 6 爬蟲客戶端功能流程圖爬蟲客戶端功能流程圖 客戶端套接字及會話線程的創(chuàng)建相關(guān)代碼: /- socket=new Socket(InetAddress.getLocalHost(),5656); /實例化一個套接字 ps=new PrintStream(socket.getOutputStream(); /獲取輸出流 StringBuffer info=new StringBuff

39、er(INFO:); String userinfo=InetAddress.getLocalHost().toString(); ps.println(info.append(userinfo); /向服務(wù)器端注冊 ID 號 ps.flush(); /確保數(shù)據(jù)流正確寫入 listen=new Listen(this,socket); /實例化監(jiān)聽線程 listen.start(); /啟動線程 /- 客戶端的界面圖如下圖 7 所示: 圖圖 7 7 客戶端的界面客戶端的界面 首先,用戶在“頁面存儲路徑”文本框中輸入存儲已下載頁面的路徑以及 “服務(wù)器 IP”文本框中輸入服務(wù)器 IP 地址,確保服

40、務(wù)器已運行時點擊“發(fā)送” 按鈕。 如果連接成功,則“當(dāng)前狀態(tài)”文本框?qū)⒂伞皵嚅_連接”變?yōu)椤耙堰B接” 狀態(tài),同時在“分配的 ID 號”文本框中顯示服務(wù)器為其返回的 ID 號。接著爬 蟲開啟采集與轉(zhuǎn)發(fā)頁面的任務(wù),并將采集結(jié)果在右邊的“已抓取的 URL 頁面欄” 列表框中動態(tài)顯示,將與服務(wù)器間轉(zhuǎn)發(fā)情況在左邊的“服務(wù)器與客戶端對話欄” 的對話框中動態(tài)顯示。 在爬蟲運行過程中,可在界面最底端的幾個文本框中監(jiān)視其爬行狀況:其 中右邊的第一個文本框中動態(tài)顯示已下載的頁面數(shù),第二個文本框動態(tài)顯示系 統(tǒng)活動的線程數(shù)目,通過點擊最右邊的“刷新時間”按鈕,可在“爬行總耗時” 文本框中靜態(tài)顯示爬蟲已運行的時間。 4.

41、 URLURL 轉(zhuǎn)發(fā)器的實現(xiàn)轉(zhuǎn)發(fā)器的實現(xiàn) Spider 在抓取每一個網(wǎng)頁前,都要從 URL 管理器那申請一個處于等待狀態(tài) 的 URL,接著由該轉(zhuǎn)發(fā)器決定此 URL 是否屬于自己的爬行范圍,若屬于則 SpiderWorker 啟動線程開始爬行,否則將繼續(xù)申請直到分配到符合條件的 URL 為止。 下面的代碼取自 SpiderWorker 類中的 run()方法,主要代碼: /- target = this.owner.getWorkload();/獲取等待狀態(tài)的 URL while(target!=null) if(!isRightUrl(target)/轉(zhuǎn)發(fā) client.tfD

42、ialog.append(To Server: +target+n); client.send(URL:+target); else break; target = this.owner.getWorkload(); /- 其中 isRightUrl()方法原型為:public boolean isRightUrl(String url) 它的功能類似于 ClientServer 類中的 sendToWhom()方法,其代碼這里不再重 復(fù)。程序流程圖如圖 8 所示: 圖圖 8 8 URLURL 轉(zhuǎn)發(fā)器功能流程圖轉(zhuǎn)發(fā)器功能流程圖 .3 URLURL 接收器及其消重的實現(xiàn)接收器及其

43、消重的實現(xiàn) 當(dāng)服務(wù)器向客戶端轉(zhuǎn)發(fā) URL 時,爬蟲客戶端應(yīng)準(zhǔn)備接收此 URL。并不是每 次都把收到的 URL 簡單地交給 URL 管理器處理,而應(yīng)首先作出判斷,因為每個 爬蟲在運行前需要被構(gòu)造即初始化,以及傳遞初始 URL 作為爬行的起點。所以 如果接收的是第一個 URL 則應(yīng)構(gòu)造并初始化爬蟲,否則加入 URL 隊列等待爬行。 其流程圖如圖 9 所示: 圖圖 9 9 URLURL 接收器功能流程圖接收器功能流程圖 至于 URL 去重,只需創(chuàng)建一個 url 列表存放已訪問過的 url。每次在接收新 的 url 之前查看此表,如果含有該 url,則將其拋棄,否則轉(zhuǎn)交 URL 管理器。下 面是主要代

44、碼: /- if(this.client.startURL)/若第一次接收到 URL this.client.getSite=new GetSite(this.client,url,client.tfPath.getText();/構(gòu)造爬蟲 this.client.startURL=false; this.client.startingTime=System.currentTimeMillis();/記錄起始爬 行時間 else /否則,轉(zhuǎn)交 URL 管理器 if(!urlList.contains(url) this.client.getSite._spider.addWorkload(ur

45、l); /- .4 恢復(fù)采集斷點功能的實現(xiàn)恢復(fù)采集斷點功能的實現(xiàn) 所謂采集斷點的恢復(fù),是指對于給定的每一個站點,在某一次采集中斷后 系統(tǒng)將記住采集的斷點并在下一次運行時從該斷點處接著爬行而并不是從第一 個鏈接開始采集。斷點的恢復(fù)功能不僅可以避免不必要的重復(fù)采集工作而極大 提高系統(tǒng)的采集效率,而且也屬于本系統(tǒng)設(shè)計中主要考慮的問題之一。 Bot 包中的單機上的頁面采集系統(tǒng)(Spider 類)不具備斷點恢復(fù)的功能,因 為它在每次運行的開始與結(jié)束時都將做數(shù)據(jù)庫清理工作。為實現(xiàn)該功能,本人 對其做如下更改: 首先刪去在 Spider 類的構(gòu)造方法及 halt()方法中對數(shù)據(jù)庫清理的語句

46、workload.clear(); 由于只有那些在數(shù)據(jù)庫中處于 Waiting 狀態(tài)的 URL 才有被 SpiderWorker 采 集的機會,故在啟動爬蟲線程之前應(yīng)將上一次被中斷的且處于 Running 狀態(tài)的 URL 的狀態(tài)恢復(fù)為 Waiting 狀態(tài)而等待再次被采集,一方面可以恢復(fù)斷點繼續(xù) 運行,另一方面還可以防止因數(shù)據(jù)庫中沒有處于 Waiting 狀態(tài)的 URL 而使整個 系統(tǒng)無法推進。這里改變 URL 狀態(tài)的是新增的方法 changeStatus(); public void changeStatus() workload.setStatus(); 另外,由于爬行的站點不止一個,故數(shù)

47、據(jù)庫中會保存不同站點的 URL 信息。 如果不做處理最終將導(dǎo)致采集混亂的局面,因為數(shù)據(jù)庫中不同站點的 URL 都有 處于等待狀態(tài)的可能,如果在選取被采集 URL 時只看其所處狀態(tài)就會出現(xiàn)采集 其他網(wǎng)頁的錯誤。處理方法是增加判斷條件,將 Waiting 態(tài)下的 URL 與種子 URL 做比較然后再做取舍,關(guān)鍵代碼如下示: /- rs = prepAssign.executeQuery();/獲取處于等待狀態(tài)的 URL while( rs.next() ) String url = rs.getString(URL); if(url.startsWith(startURL) /將其與起始 URL

48、比較 setStatus(url,RUNNING); return url; /- 4.44.4 數(shù)據(jù)庫的設(shè)計與連接數(shù)據(jù)庫的設(shè)計與連接 本系統(tǒng)采用 SQL server 2005 數(shù)據(jù)庫來存儲 URL 作業(yè),下面首先給出數(shù)據(jù) 表的設(shè)計: 根據(jù) URL 作業(yè)的特點,我們創(chuàng)建 URL 及 Status 兩個字段來為其建立一個名 為 tblWorkload 的數(shù)據(jù)用以存儲 Spider 運行過程中抓取的 URL 鏈接。下表 1 是 對字段的描述 表表 1 1 tblWorkloadtblWorkload 其中字段“URL”是存儲所有抓取的鏈接, “Status”記錄對應(yīng) URL 的當(dāng)前 狀態(tài)。 然后

49、再介紹數(shù)據(jù)庫的連接步驟: 首先,創(chuàng)建 SpiderSQLWorkload 對象,提供 JDBC 驅(qū)動程序及使用的數(shù)據(jù)源, 下面是數(shù)據(jù)庫連接的主要代碼: /- public Connection getConnection() try String url = jdbc:sqlserver:/localhost:1433;DatabaseName=netbug; String user = sa; String pwd = 123; Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver); con = DriverManager.g

50、etConnection(url, user, pwd); con.setAutoCommit(autoCommit); /- 4.54.5 系統(tǒng)的運行結(jié)果和測試分析系統(tǒng)的運行結(jié)果和測試分析 系統(tǒng)運行后客戶端顯示的結(jié)果如圖 10,圖 11 所示: 圖圖 1010 客戶端顯示的結(jié)果客戶端顯示的結(jié)果 圖圖 1111 客戶端顯示的結(jié)果客戶端顯示的結(jié)果 系統(tǒng)運行后服務(wù)器端顯示的結(jié)果如下圖 12 所示: 圖圖 1212 服務(wù)器端顯示的結(jié)果服務(wù)器端顯示的結(jié)果 系統(tǒng)的測試說明: 本系統(tǒng)正常的測試環(huán)境是在網(wǎng)速穩(wěn)定的同一個局域網(wǎng)內(nèi),用一臺電腦做主控端, 即服務(wù)器,三臺電腦當(dāng)爬蟲客戶端。但受到硬件資源及網(wǎng)絡(luò)的條件

51、限制,本系 統(tǒng)只能進行簡單粗略的測試。其中設(shè)置了兩組測試環(huán)境,分別為一臺爬蟲機器 (單機)和兩臺爬蟲機器用以做對比參照,另外在同一組測試環(huán)境下給定兩種 不同的起始 URL 用以做同組間的對比。 硬件的配置: 爬行主機 1:組裝機(奔騰 CPU 2.01GHz, 1G 內(nèi)存,80G 硬盤) 爬蟲主機 2:組裝機(奔騰 CPU 2.01GHz, 1G 內(nèi)存,160G 硬盤) 服務(wù)器主機:組裝機(奔騰 CPU 2.01GHz, 1G 內(nèi)存,80G 硬盤) 說明:受硬件條件的限制,爬蟲 1 和服務(wù)器主機屬同臺機器,爬蟲 1 和爬蟲 2 相隔大概 20m 左右. 測試結(jié)果分析: 表表 2 2 測試的結(jié)果

52、測試的結(jié)果 1 1 起始 URLhttp:/ (小型站點) 爬行線程數(shù)100 個 環(huán)境一環(huán)境二 測試環(huán)境 參數(shù)爬蟲 1爬蟲 1爬蟲 2 下載頁面總數(shù)1450 個872 個1056 個 平均頁面大小 8.23KB11.25KB10.23KB 全部頁面總量 11.65MB9.58MB10.55MB 采集時間10 分 35 秒7 分 12 秒9 分 32 秒 URL 抓取率2.31 個/秒2.02 個/秒1.85 個/秒 頁面下載速度 18.79KB/s22.71KB/s18.89KB/s 表表 3 3 測試的結(jié)果測試的結(jié)果 2 2 起始 URLhttp:/ (大型站點) 爬行線程數(shù)100 個 環(huán)境

53、一環(huán)境二測試環(huán)境 參數(shù)爬蟲 1爬蟲 1爬蟲 2 下載頁面總數(shù)1298 個914 個1020 個 平均頁面大小 35.9KB38.09KB37.04KB 全部頁面總量 45.6MB34.0MB36.9MB 采集時間30 分 27 秒29 分 5 秒39 分 32 秒 URL 抓取率0.71 個/秒0.52 個/秒0.43 個/秒 頁面下載速度 25.56KB/s19.95KB/s17.22KB/s 結(jié)果表明:分布式爬蟲系統(tǒng)確實能在相同的時間內(nèi)獲取比單機上更多的網(wǎng) 頁,同時網(wǎng)速的大小及其穩(wěn)定性、待采集頁面的平均大小及機器的配置都是影 響分布式爬蟲性能的重要因素。 4.64.6 下載網(wǎng)頁的查看下載網(wǎng)

54、頁的查看 發(fā)布端的部分顯示結(jié)果如下圖 13 所示: 圖圖 1313 發(fā)布端的部分運行結(jié)果發(fā)布端的部分運行結(jié)果 發(fā)布端從數(shù)據(jù)庫讀取下載過來的 URL,列表顯示出來并有超連接,點擊任 一 URL 就可以打開 URL 對應(yīng)的網(wǎng)頁進行查看,為了防止頁面過多不好查找,在 此頁面增加一個檢索的功能方面查找。 5 5 總結(jié)總結(jié) 本系統(tǒng)的設(shè)計分為兩大部分,客戶端爬蟲以及服務(wù)端監(jiān)控器。客戶端爬蟲 負責(zé)頁面采集工作,它從服務(wù)器接收待爬行網(wǎng)頁的 URL 并將不屬于自己爬行范 圍的 URL 實行轉(zhuǎn)發(fā)。其中頁面的采集借用了多線程技術(shù),可以減少等待響應(yīng)時 間而提高系統(tǒng)性能,URL 的轉(zhuǎn)發(fā)利用了 MD5 算法的“字符轉(zhuǎn)換”

55、功能以及散列 函數(shù)的“分拆”構(gòu)造法。服務(wù)器端監(jiān)視器主要負責(zé)對活動的爬蟲的管理以及完 成 URL 的分發(fā)任務(wù)即對于每臺爬蟲系統(tǒng)都為其分配唯一的 ID 號來實行統(tǒng)一管理, 此外,它還會對每一個來自客戶端的 URL 進行判斷,然后將該 URL 分發(fā)給除了 該客戶端外的其中某個活動的爬蟲。系統(tǒng)中,由服務(wù)器端統(tǒng)一控制爬蟲的運行, 包括啟動和中斷,服務(wù)端還可以動態(tài)地監(jiān)視各個爬蟲當(dāng)前采集狀態(tài)。并在此基 礎(chǔ)上建立一個網(wǎng)頁,顯示下載的 URLs 并超鏈接點擊打開,為了防止頁面過多不 好查找,在此頁面增加一個檢索的功能方便查找。 由于能力和時間有限,本系統(tǒng)功能細節(jié)上還有很多不足,比如客戶端不夠 優(yōu)化,功能不夠強大,只能解析.htm,.html,.aspx 格式的網(wǎng)頁信息,對于網(wǎng)頁 發(fā)布端功能的設(shè)計業(yè)不完善,比如應(yīng)該對下載后的網(wǎng)頁進行標(biāo)題和關(guān)鍵字的提 取后再顯示出來,類似于百度快照那樣但是最終還是未能實現(xiàn)。 參考文獻參考文獻 1 尹江,尹治本,黃洪.網(wǎng)絡(luò)爬蟲效率瓶頸的分析與解決方案 J. 計算機的應(yīng)用, 2008,第 28 卷 70-75. 2 徐遠超,劉江華,

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論