【正文】
的結(jié)構(gòu), Request 消息分為 3 部分,第一部分叫請求行, 第二部分叫 header, 第三部分是 body. header 和 body 之間有個 空行, 結(jié)構(gòu)如圖 21: 圖 21 Request 消息結(jié)構(gòu) 第一行中的 Method 表示請求方法,比如 POST, GET, Pathtoresource 表示請求的資源,Http/versionnumber 表示 HTTP 協(xié)議的版本號。 靈活: HTTP 允許傳輸任意類型的數(shù)據(jù)對象。 HTTP 協(xié)議簡介 協(xié)議是指計算機(jī)通信網(wǎng)絡(luò)中兩臺計算機(jī)之間進(jìn)行通信所必須共同遵守的規(guī)定或規(guī)則,超文本傳輸協(xié)議 (HTTP)是一種通信協(xié)議,它允許將超文本標(biāo)記語言 (HTML)文檔從 Web 服務(wù)器傳送到客戶端的瀏覽器。比 較好的情況是邏輯結(jié)構(gòu)與前面的樹型物理結(jié)構(gòu)相吻合。 Inter 上的每一個網(wǎng)頁都具有一個唯一的名稱標(biāo)識,通常稱之為 URL 地址,這種地址可以是本地磁盤,也可以是局域網(wǎng)上的某一臺計算機(jī),更多的是 Inter 上的站點(diǎn)。雖然大的 Flash 效果看上去很好,外觀看著也很漂亮,但可惜搜索引擎看不到,無法讀取任何內(nèi)容。部分站長為了讓用戶記住登陸信息,強(qiáng)迫用戶使用 Cookies。網(wǎng)絡(luò)爬蟲是搜索引擎的重要組成部分。當(dāng)時 Michael Mauldin 將 John Leavitt 的蜘蛛程序接入到其索引程序中,創(chuàng)建了大家現(xiàn)在熟知的 Lycos( 20xx 年被西班牙網(wǎng)絡(luò)集團(tuán) Terra Lycos Network 收購)。剛開始 它只用來統(tǒng)計互聯(lián)網(wǎng)上的服務(wù)器數(shù)量,后來則發(fā)展為能夠檢索網(wǎng)站域名。 Archie 是一個可搜索的 FTP 文件名列表,用戶必 須輸入精確的文件名搜索,然后 Archie 會告訴用戶哪一個 FTP 地址可以下載該文件。它為搜索引擎從 Inter 上下載網(wǎng)頁。自動獲取資源技術(shù)程序的實現(xiàn)策略,運(yùn)行效率直接影響搜索引擎的搜索結(jié)果。網(wǎng)絡(luò)蜘蛛是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁,從網(wǎng)站的一個頁面(通常是首頁)開始,讀取網(wǎng)頁的內(nèi)容,找到在網(wǎng)頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網(wǎng)頁,這樣一直循環(huán)下去,直到把這個網(wǎng)站所有的網(wǎng)頁都抓取完為止。 據(jù)統(tǒng)計搜索引擎已經(jīng)成為僅次于電子郵件服務(wù),是人們使用最多的網(wǎng)路服務(wù)。 本課題的目標(biāo)是研究并實現(xiàn)一個 實現(xiàn)簡單的可在后臺自動運(yùn)行的爬蟲程序。對本研究提供過幫助和做出過貢獻(xiàn)的個人或集體,均已在文中作了明確的說明并表示了謝意。 隨著網(wǎng)絡(luò)的迅速發(fā)展,萬維網(wǎng)成為大量信息的載體,如何有效地提取并利用這些信息成為一個巨大的挑戰(zhàn) , 作為搜索引擎不可或缺的一部分網(wǎng)絡(luò)爬蟲,一直是個熱門的研究課題,它的效能,直接決定了搜索引擎的未來。 關(guān)鍵詞: 網(wǎng)絡(luò)爬蟲;廣度優(yōu)先 ; Java; 多線程; 成都學(xué)院學(xué)士學(xué)位論文(設(shè)計) Design and implementation of a web crawler based on multithreading Specialty: Software Engineering Student Number: Student: Supervisor: ABSTRACT: Web Crawler, also called Web Spider, is an important part of search engine. With the rapid development of Inter, the World Wide Web bees the carrier of a large amount of information. And How to effectively extract and use this information to bee a great challenge. The quality of a search engine is mostly depended on the quality of a Web Crawler that as an indispensable part of web crawler search engine. So Web Crawler is a hot research topic those years. The project which was studied in this paper using the breadthfirst search algorithm, and based on the Java language for work programming. Implementation of the key technology of web crawler is to analyze and to URL. In order to make the web crawler has more efficient grasping ability, so the use of multithreading technology. At the same time in order to avoid waiting without limit, should be on the web crawler connecting work and read the time of maximum value. The goal of this project is to research and realize an implementation can be run automatically in the background simple crawler program. System can be a subject oriented grab. From the point of view, it is more similar to the topic web craw ler. Key words: Web Crawler。從搜索引擎出發(fā)就能很快的到達(dá)互聯(lián)網(wǎng)的任何一個地方。以何種策略遍歷互聯(lián)網(wǎng)上的網(wǎng)頁,也成了該程序主要的研究方向。 本課題旨在根據(jù)上述原理設(shè)計與實現(xiàn)一個網(wǎng)絡(luò)爬蟲系統(tǒng)。 網(wǎng)絡(luò)爬蟲的歷史 在互聯(lián)網(wǎng)發(fā)展的早期,網(wǎng)站數(shù)量相對較少,信息數(shù)據(jù)量不大,查找也比較容易。雖然當(dāng)時萬維網(wǎng)還未出現(xiàn),但網(wǎng)絡(luò)中文件傳輸還是相當(dāng)頻繁的,而且由于大量的文件散布在各個分散的 FTP 主機(jī)中,查詢起來非常不便,因此 Alan Archie 工作原理與現(xiàn)在的 搜索引擎已經(jīng)很接近,它依靠腳本程序自動搜索網(wǎng)上的文件,然后對有關(guān)信息進(jìn)行索引,供使用者以一定的表達(dá)式查詢。 隨著互聯(lián)網(wǎng)的迅速發(fā)展,使得檢索所有新出現(xiàn)的網(wǎng)頁變得越來越困難,因此,在 Matthew Gray的 Wanderer 基礎(chǔ)上,一些編程者將傳統(tǒng)的“蜘蛛”程序工作原理作了些改進(jìn)。目前,互聯(lián)網(wǎng)上有名有姓的搜索引擎已達(dá)數(shù)百家,其檢索的信息量也與從前不可同日而語。聚焦爬蟲是一個自動下載網(wǎng)頁的程序,它根據(jù)既定的抓取目標(biāo),有選擇的訪問萬維網(wǎng)上的網(wǎng)頁與相關(guān)的鏈接,獲 取所需要的信息。有些企業(yè)站和個人站的設(shè)置一定要注冊登陸后才能看到相關(guān)的文章內(nèi)容,這種對蜘蛛不是很友好,蜘蛛不會注冊、也不會登陸。 成都學(xué)院學(xué)士學(xué)位論文(設(shè)計) 5 2 網(wǎng)絡(luò)爬蟲 相關(guān) 技術(shù) 本章將會 對于網(wǎng)絡(luò)爬蟲緊密相關(guān)的一些技術(shù)進(jìn)行說明。在物理結(jié)構(gòu)包括扁平結(jié)構(gòu)和樹型結(jié)構(gòu)。只要能夠?qū)Y源定位,系統(tǒng)就可以對資源進(jìn)行各種操作,如存取、更新、替換和查找其屬性。 HTTP 協(xié)議的主要特點(diǎn)可概括如下: 成都學(xué)院學(xué)士學(xué)位論文(設(shè)計) 6 支持客戶 /服務(wù)器模式。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。 OPTIONS 返回服務(wù)器針對特定資源所支持的 HTTP 請求方法。其中一個原因是 GET 可能會被網(wǎng)絡(luò)蜘蛛等隨意訪問。 方法名稱是區(qū)分大小寫的。id=XXX. POST 方法是把提交的數(shù)據(jù)放在 HTTP 包的 Body 中 . 2. GET 提交的數(shù)據(jù)大小有限制(因為瀏覽器對 URL 的長度有限制),而 POST 方法提交的數(shù)據(jù)沒 有限制 . 3. GET 方式需要使用 來取得變量的值,而 POST 方式通過 來獲取變量的值。進(jìn)程也可能是整個程序或者是部分程序的動態(tài)執(zhí)行。用戶界面可以更加吸引人,這樣比如用戶點(diǎn)擊了一個按鈕去觸發(fā)某些事件的處理,可以彈出一個進(jìn)度條來顯示處理的進(jìn)度 。 成都學(xué)院學(xué)士學(xué)位論文(設(shè)計) 9 。 在 JAVA 中創(chuàng)建線程的一種方式是通過 Thread 來實現(xiàn)的。創(chuàng)建一個名為 name 的線程。在使用 Runnable 接口時,不能直接創(chuàng)建所需類 的對象并運(yùn)行它,而是必須從 Thread 類的一個實例內(nèi)部運(yùn)行它。你不能調(diào)用 restart 方法來重新開始一個處于死亡狀態(tài)的線程,但是,你可以調(diào)用處于死亡狀態(tài)的線程對象的各個方法。 JAVA 中從 Object 對象繼承來的每個對象都有一個單獨(dú)的鎖。雖然通過 IP 地址和端口可以找到網(wǎng)絡(luò)上運(yùn)行的一個程序,但是如果需要進(jìn)行網(wǎng)絡(luò)編程,則還需要了解網(wǎng)絡(luò)通訊的過程。 (摘自百度百科 [5]) 本課題 將采用 IPv4 協(xié)議 作為 開發(fā) 基礎(chǔ)。 TCP 套接字是一種流套接字( stream socket)。所以,下面介紹網(wǎng)絡(luò)編程的步驟時,均以 C/S 結(jié)構(gòu)為基礎(chǔ)進(jìn)行介紹。 最基本的步驟一般都是這三個步驟,在實際實現(xiàn)時,步驟 2 會出現(xiàn)重復(fù),在進(jìn)行代碼組織時,由于網(wǎng)絡(luò)編程是比較耗時的操作,所以一般開啟專門的現(xiàn)場進(jìn)行網(wǎng)絡(luò)通訊。簡單來說,就是先接收再發(fā)送,這個和客戶端的數(shù)據(jù)交換數(shù)序不同。在本章中,將只介紹基礎(chǔ)的網(wǎng)絡(luò)編程類。但是由于 Java 語言的網(wǎng)絡(luò)編程比較簡單,所以還是獲得了廣泛的使用。 //獲得輸出流 InputStream is = ()。 正則表達(dá)式的特點(diǎn)是: 、邏輯性和功能性非常的強(qiáng); 成都學(xué)院學(xué)士學(xué)位論文(設(shè)計) 15 。 Dijkstra 單源最短路徑算法和 Prim 最小生成樹算法都采用了和寬度優(yōu)先搜索類似的思想。在圖中選中一個節(jié)點(diǎn),作為起始節(jié)點(diǎn),然后按照層次遍歷的方式,一層一層地進(jìn)行訪問。 這個方法有個優(yōu)點(diǎn)是 網(wǎng)絡(luò)蜘蛛在設(shè)計的時候比較容易。 成都學(xué)院學(xué)士學(xué)位論文(設(shè)計) 17 3 需求分析和模型 設(shè)計 網(wǎng)絡(luò)爬蟲的定義 定義 1:網(wǎng)絡(luò)爬蟲是一個自動提取網(wǎng)頁的程序,它為搜索引擎從 Web 上下載網(wǎng)頁,是搜索引擎的重要組成部分。 最佳 優(yōu)先搜索 最佳優(yōu)先搜索策略按照一定的網(wǎng)頁分析算法,預(yù)測候選 URL 與目標(biāo)網(wǎng)頁的相似度,或與主題的相關(guān)性,并選取評價最好的一個或幾個 URL 進(jìn)行抓 取。 (3) 出隊列,獲得隊頭節(jié)點(diǎn) V,訪問頂點(diǎn) V 并標(biāo)記 V 已經(jīng)被訪問。一般使用 寬度優(yōu)先搜索方法 。而 Java 中通過了 Pattern 類,對正則表達(dá)式的使用提供了支持。 正則表達(dá)式 由于要根據(jù) 用戶所提供的 對 爬蟲獲取到的 URL 和網(wǎng)頁內(nèi)容進(jìn)行分析 。 上面的代碼中, socket1 實現(xiàn)的是連接到 IP 地址是 的計算機(jī)的 10000 號端口,而socket2 實現(xiàn)的是連接到域名是 的計算機(jī)的 80 號端口,至于底層網(wǎng)絡(luò)如何實現(xiàn)建立連接,對于程序員來說是完全透明的。這樣方式在實際的網(wǎng)絡(luò)編程中,由于傳輸可靠,類 似于打電話,如果甲給乙打電話,乙說沒有聽清楚讓甲重復(fù)一遍,直到 聽清楚為止,實際的網(wǎng)絡(luò)傳輸也是這樣,如果發(fā)送的一方發(fā)送的數(shù)據(jù)接收方覺得有問題,則網(wǎng)絡(luò)底層會自動要求發(fā)送方重發(fā),直到接收方收到為止。 關(guān)閉連接 當(dāng)服務(wù)器程序關(guān)閉時,需要關(guān)閉服務(wù)器端,通過關(guān)閉服務(wù)器端使得服務(wù)器監(jiān)聽的端口以及占用的內(nèi)存可以釋放出來,實現(xiàn)了連接的關(guān)閉。 獲得連接 當(dāng)客戶端連接到服務(wù)器端時,服務(wù)器端就可以獲得一個連接,這個連接包含客戶端的信息,例如客戶端 IP 地址等等,服務(wù)器端和客戶端也通過該連接進(jìn)行數(shù)據(jù)交換。 交換數(shù)據(jù) 連接建立以后,就可以通過這個連接交換數(shù)據(jù)了。 TCP協(xié)議真 是 通過 “三次握手 ”的 方式保證了 傳輸 的可靠性。 IPv4給 TCP、 UDP、 SCTP、 ICMP 和 IGMP 提供分組遞送服務(wù)。通俗而言: TCP 負(fù)責(zé)發(fā)現(xiàn)傳輸?shù)膯栴}, 有問題就發(fā)出信號,要求重新傳輸,直到所有數(shù)據(jù)安全正確地傳輸?shù)侥康牡?。?JAVA 中實現(xiàn)線程同步的另一個方法是通過使用 synchronized 關(guān)鍵字。注意,因為這個方法會引起線程的安全問題,已經(jīng)被不推薦使用了,所以,不要再程序調(diào)用這個方法。 當(dāng)使用 new 來新建一個線程時,它處于 New 狀態(tài),這個時候,線程并未進(jìn)行任何操作。 每個線程都是通過某個特定 Thread 對象所對應(yīng)的方法 run()來完成其操作的,方法 run()稱為線程體。創(chuàng)建一個線程,并指定一個目標(biāo)。可以形象的理解為 ,在一個 JAVA 程序內(nèi)部虛擬了多臺計 算機(jī),每臺計算機(jī)對應(yīng)一個線程,有自己的 CPU,可以獲取所需的代碼和數(shù)據(jù),因此能獨(dú)立執(zhí)行任務(wù),相互間還可以共用代碼和數(shù)據(jù)。 還有其他很多使用多線程的好處,這里 就不在累述。通常由操作系統(tǒng)負(fù)責(zé)多個線程的調(diào)度和執(zhí)行。 主要包括 5 大類消息狀態(tài):