【正文】
摘要Ⅰ摘要網(wǎng)絡(luò)爬蟲是一種自動(dòng)搜集互聯(lián)網(wǎng)信息的程序。通過網(wǎng)絡(luò)爬蟲不僅能夠?yàn)樗阉饕娌杉W(wǎng)絡(luò)信息,而且可以作為定向信息采集器,定向采集某些網(wǎng)站下的特定信息,如招聘信息,租房信息等。本文通過 JAVA 實(shí)現(xiàn)了一個(gè)基于廣度優(yōu)先算法的多線程爬蟲程序。本論文闡述了網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)中一些主要問題:為何使用廣度優(yōu)先的爬行策略,以及如何實(shí)現(xiàn)廣度優(yōu)先爬行;為何要使用多線程,以及如何實(shí)現(xiàn)多線程;系統(tǒng)實(shí)現(xiàn)過程中的數(shù)據(jù)存儲(chǔ);網(wǎng)頁信息解析等。通過實(shí)現(xiàn)這一爬蟲程序,可以搜集某一站點(diǎn)的 URLs,并將搜集到的 URLs存入數(shù)據(jù)庫。 【關(guān)鍵字】網(wǎng)絡(luò)爬蟲;JAVA;廣度優(yōu)先;多線程。ABSTRACTIIABSTRACT SPIDER is a program which can auto collect informations from inter. SPIDER can collect data for search engines, also can be a Directional information collector, collects specifically informations from some web sites, such as HR informations, house rent informations.In this paper, use JAVA implements a breadthfirst algorithm multithread SPDIER. This paper expatiates some major problems of SPIDER: why to use breadthfirst crawling strategy, and how to implement breadthfirst crawling。 why to use multithreading, and how to implement multithread。 data structure。 HTML code parse. etc. This SPIDER can collect URLs from one web site, and store URLs into database. 【KEY WORD】SPIDER。 JAVA。 Breadth First Search。 multithreads.目錄第一章 引言 .........................................................1第二章 相關(guān)技術(shù)介紹 .................................................2 JAVA 線程 ......................................................2 線程概述 ..................................................2 JAVA 線程模型 .............................................2 創(chuàng)建線程 ..................................................3 JAVA 中的線程的生命周期 ....................................4 JAVA 線程的結(jié)束方式 ........................................4 多線程同步 ................................................5 URL 消重 .......................................................5 URL 消重的意義 .............................................5 網(wǎng)絡(luò)爬蟲 URL 去重儲(chǔ)存庫設(shè)計(jì) ................................5 LRU 算法實(shí)現(xiàn) URL 消重 .......................................7 URL 類訪問網(wǎng)絡(luò) .................................................8 爬行策略淺析 .................................................8 寬度或深度優(yōu)先搜索策略 .....................................8 聚焦搜索策略 ..............................................9 基于內(nèi)容評(píng)價(jià)的搜索策略 .....................................9 基于鏈接結(jié)構(gòu)評(píng)價(jià)的搜索策略 ...............................10 基于鞏固學(xué)習(xí)的聚焦搜索 ...................................11 基于語境圖的聚焦搜索 .....................................11第三章 系統(tǒng)需求分析及模塊設(shè)計(jì) ......................................13 系統(tǒng)需求分析 .................................................13 SPIDER 體系結(jié)構(gòu) ...............................................13 各主要功能模塊(類)設(shè)計(jì) .....................................14 SPIDER 工作過程 ...............................................14第四章 系統(tǒng)分析與設(shè)計(jì) ..............................................16 SPIDER 構(gòu)造分析 ...............................................16 爬行策略分析 .................................................17 URL 抽取,解析和保存 ..........................................18 URL 抽取 ..................................................18 URL 解析 ..................................................19 URL 保存 ..................................................19第五章 系統(tǒng)實(shí)現(xiàn) ....................................................21 實(shí)現(xiàn)工具 .....................................................21 爬蟲工作 .....................................................21 URL 解析 ......................................................22 URL 隊(duì)列管理 ..................................................24 URL 消重處理 ..............................................24 URL 等待隊(duì)列維護(hù) ..........................................26 數(shù)據(jù)庫設(shè)計(jì) ...............................................27第六章 系統(tǒng)測(cè)試 ....................................................29第七章 結(jié)論 ........................................................32參考文獻(xiàn) ...........................................................33致謝 ...............................................................34外文資料原文 .......................................................35譯文 ...............................................................51第一章 引言1第一章 引言隨著互聯(lián)網(wǎng)的飛速發(fā)展,網(wǎng)絡(luò)上的信息呈爆炸式增長(zhǎng)。這使得人們?cè)诰W(wǎng)上找到所需的信息越來越困難,這種情況下搜索引擎應(yīng)運(yùn)而生。搜索引擎搜集互聯(lián)網(wǎng)上數(shù)以億計(jì)的網(wǎng)頁,并為每個(gè)詞建立索引。在建立搜索引擎的過程中,搜集網(wǎng)頁是非常重要的一個(gè)環(huán)節(jié)。爬蟲程序就是用來搜集網(wǎng)頁的程序。以何種策略偏歷互聯(lián)網(wǎng)上的網(wǎng)頁,也成了爬蟲程序主要的研究方向。現(xiàn)在比較流行的搜索引擎,比如 google,百度,它們爬蟲程序的技術(shù)內(nèi)幕一般都不公開。目前幾種比較常用的爬蟲實(shí)現(xiàn)策略:廣度優(yōu)先的爬蟲程序,Repetitive 爬蟲程序,定義爬行爬蟲程序,深層次爬行爬蟲程序。此外, 還有根據(jù)概率論進(jìn)行可用 Web 頁的數(shù)量估算, 用于評(píng)估互聯(lián)網(wǎng) Web 規(guī)模的抽樣爬蟲程序 。 采用爬行深度、頁面導(dǎo)入鏈接量分析等方法, 限制從程序下載不相關(guān)的 Web 頁的選擇性爬行程序等等。爬蟲程序是一個(gè)自動(dòng)獲取網(wǎng)頁的程序。它為搜索引擎從互聯(lián)網(wǎng)上下載網(wǎng)頁,是搜索引擎的重要組成部分。爬蟲程序的實(shí)現(xiàn)策略,運(yùn)行效率直接影響搜索引擎的搜索結(jié)果。不同的搜索引擎,會(huì)根據(jù)對(duì)搜索結(jié)果的不同需求,選擇最合適的爬行策略來搜集互聯(lián)網(wǎng)上的信息。高效,優(yōu)秀的爬蟲程序可以使人們?cè)诨ヂ?lián)網(wǎng)上尋找到更及時(shí),更準(zhǔn)確的信息。實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲的重點(diǎn)和難點(diǎn)有:多線程的實(shí)現(xiàn);對(duì)臨界資源的分配;遍歷 web圖的遍歷策略選擇和實(shí)現(xiàn);存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)的選擇和實(shí)現(xiàn)。本文通過 JAVA 語言實(shí)現(xiàn)一個(gè)基于廣度優(yōu)先偏歷算法的多線程爬蟲程序。通過實(shí)現(xiàn)此爬蟲程序可以定點(diǎn)搜集某一站點(diǎn)的 URLs,如果需要搜集其他信息,可以在解析 URLs 的同時(shí),解析獲取相應(yīng)信息。電子科技大學(xué)成都學(xué)院本科畢業(yè)設(shè)計(jì)論文2第二章 相關(guān)技術(shù)介紹 JAVA 線程 線程概述幾乎每種操作系統(tǒng)都支持線程的概念—進(jìn)程就是在某種程度上相互隔離的,獨(dú)立運(yùn)行的程序。一般來說,這些操作系統(tǒng)都支持多進(jìn)程操作。所謂多進(jìn)程,就是讓系統(tǒng)(好像)同時(shí)運(yùn)行多個(gè)程序。比如,我在 Microsoft Word 編寫本論文的時(shí)候,我還打開了一個(gè) mp3 播放器來播放音樂,偶爾的,我還會(huì)再編輯Word 的同時(shí)讓我的機(jī)器執(zhí)行一個(gè)打印任務(wù),而且我還喜歡通過 IE 從網(wǎng)上下載一個(gè) Flash 動(dòng)畫。對(duì)于我來說,這些操作都是同步進(jìn)行的,我不需要等一首歌曲放完了再來編輯我的論文??雌饋恚鼈兌纪瑫r(shí)在我的機(jī)器上給我工作。事實(shí)的真相是,對(duì)于一個(gè) CPU 而言,它在某一個(gè)時(shí)間點(diǎn)上,只能執(zhí)行一個(gè)程序。CPU 不斷的在這些程序之間“跳躍”執(zhí)行。那么,為什么我們看不出任何的中斷現(xiàn)象呢?這是因?yàn)?,相?duì)于我們的感覺,它的速度實(shí)在太快了。我們?nèi)说母兄獣r(shí)間可能以秒來計(jì)算。而對(duì)于 CPU 而言,它的時(shí)間是以毫秒來計(jì)算的,從我們?nèi)庋劭磥恚鼈兙褪且粋€(gè)連續(xù)的動(dòng)作。因此,雖然我們看到的都是一些同步的操作,但實(shí)際上,對(duì)于計(jì)算機(jī)而言,它在某個(gè)時(shí)間點(diǎn)上只能執(zhí)行一個(gè)程序,除非你的計(jì)算機(jī)是多 CPU 的。多線程(MultiThread)擴(kuò)展了多進(jìn)程(multiProcess)操作的概念,將任務(wù)的劃分下降到了程序級(jí)別,使得各個(gè)程序似乎可以在同一個(gè)時(shí)間內(nèi)執(zhí)行多個(gè)任務(wù)。每個(gè)任務(wù)稱為一個(gè)線程,能夠同時(shí)運(yùn)行多個(gè)線程的程序稱為多線程程序。多線程和多進(jìn)程有什么區(qū)別呢?對(duì)于進(jìn)程來說,每個(gè)進(jìn)程都有自己的一組完整的變量,而線程則共享相同的數(shù)據(jù)。 JAVA 線程模型我們知道,計(jì)算機(jī)程序得以執(zhí)行的三個(gè)要素是:CPU,程序代碼,可存取的數(shù)據(jù)。在 JAVA 語言中,多線程的機(jī)制是通過虛擬 CPU 來實(shí)現(xiàn)的??梢孕蜗蟮睦斫鉃?在一個(gè) JAVA 程序內(nèi)部虛擬了多臺(tái)計(jì)算機(jī),每臺(tái)計(jì)算機(jī)對(duì)應(yīng)一個(gè)線程,有自己的 CPU,可以獲取所需的代碼和數(shù)據(jù),因此能獨(dú)立執(zhí)行任務(wù),相互間還可以共用代碼和數(shù)據(jù)。JAVA 的線程是通過 類來實(shí)現(xiàn)的,它內(nèi)第二章 相關(guān)技術(shù)介紹3部實(shí)現(xiàn)了虛擬 CPU 的功能,能夠接收和處理傳遞給它的代碼和數(shù)據(jù),并提供了獨(dú)立的運(yùn)行控制功能。我們知道,每個(gè) JAVA 應(yīng)用程序都至少有一個(gè)線程,這就是所謂的主線程。它由 JVM 創(chuàng)建并調(diào)用 JAVA 應(yīng)用程序的 main()方法。JVM 還通常會(huì)創(chuàng)建一些其他的線程,不過,這些線程對(duì)我們而言通常都是不可見的。比如,用于自動(dòng)垃圾收集的線程,對(duì)象終止或者其他的 JVM 處理任務(wù)相關(guān)的線程。 創(chuàng)建線程 創(chuàng)建線程方式一在 JAVA 中創(chuàng)建線程的一種方式是通過 Thread 來實(shí)現(xiàn)的。Thread 有很多個(gè)構(gòu)造器來創(chuàng)建一個(gè)線程(Thread)實(shí)例:Thread()。創(chuàng)建一個(gè)線程。Thread(Runnable target)。創(chuàng)建一個(gè)