【正文】
if (vis 200)// 已經(jīng)訪問的URL達(dá)到200 ()。前面已經(jīng)介紹了數(shù)據(jù)庫表的設(shè)計(jì),本節(jié)找介紹數(shù)據(jù)庫操作的邏輯。 // 根據(jù)正則表達(dá)式,篩選出符合規(guī)則的有效URL matcher = (var)。 // 設(shè)置 Http 連接超時(shí) 6s ().setParameter( , 6000)。visitedUrl存放已經(jīng)訪問過的URL,用于在解析出來的新的URL進(jìn)行添加時(shí),進(jìn)行判斷是否已經(jīng)訪問過,若已經(jīng)訪問過,舍棄。Jericho Html Parser的核心的類便是Source類,source類代表了html文檔,他可以從URL得到文檔或者從String得到。 什么是網(wǎng)頁標(biāo)題通常瀏覽一個(gè)網(wǎng)頁時(shí),通過瀏覽器頂端的藍(lán)色顯示條出現(xiàn)的信息就是“網(wǎng)頁標(biāo)題”。如果不對爬蟲進(jìn)行設(shè)置,它就像一只無頭蒼蠅一樣,到處亂撞。 URL處理 URL抽取通過觀察研究HTML代碼,我們可以知道。Java平臺(tái)已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。 模型設(shè)計(jì)首先建立URL任務(wù)列表,即開始要爬取的URL。 下載網(wǎng)頁網(wǎng)絡(luò)蜘蛛最基本的功能是能夠從給定的網(wǎng)址下載網(wǎng)頁。存在的一個(gè)問題是,在爬蟲抓取路徑上的很多相關(guān)網(wǎng)頁可能被忽略,因?yàn)樽罴褍?yōu)先策略是一種局部最優(yōu)搜索算法。 下面先來看看圖的寬度優(yōu)先遍歷過程。 正則表達(dá)式特點(diǎn)正則表達(dá)式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。在進(jìn)行網(wǎng)絡(luò)編程時(shí),底層網(wǎng)絡(luò)通訊的細(xì)節(jié)已經(jīng)實(shí)現(xiàn)了比較高的封裝,所以在程序員實(shí)際編程時(shí),只需要指定IP地址和端口號(hào)碼就可以建立連接了。交換數(shù)據(jù)服務(wù)器端通過獲得的連接進(jìn)行數(shù)據(jù)交換。 網(wǎng)絡(luò)編程步驟無論使用TCP方式還是UDP方式進(jìn)行網(wǎng)絡(luò)通訊,網(wǎng)絡(luò)編程都是由客戶端和服務(wù)器端組成。TCP/IP協(xié)議不是TCP和IP這兩個(gè)協(xié)議的合稱,而是指因特網(wǎng)整個(gè)TCP/IP協(xié)議族。JAVA提供了多種機(jī)制以實(shí)現(xiàn)線程同步。調(diào)用start()方法并不一定馬上會(huì)執(zhí)行這個(gè)線程,正如上面所說,它只是進(jìn)入Runnble而不是Running。每個(gè)JAVA應(yīng)用程序都至少有一個(gè)線程,這就是所謂的主線程。線程和進(jìn)程的區(qū)別在于,子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個(gè)線程則共享數(shù)據(jù)空間,發(fā)揮利用,根據(jù)具體情況而定. 線程的運(yùn)行中需要使用計(jì)算機(jī)的內(nèi)存資源和CPU。它們有著以下的區(qū)別:1. GET提交的數(shù)據(jù)會(huì)放在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以amp。 GET 向特定的資源發(fā)出請求。正在傳輸?shù)念愋陀蒀ontentType加以標(biāo)記。統(tǒng)一資源定位符 URL 是對可以從因特網(wǎng)上得到的資源的位置和訪問方法的一種簡潔的表示。 無休止的跳轉(zhuǎn)。現(xiàn)今,網(wǎng)絡(luò)爬蟲主要分為通用爬蟲和聚焦爬蟲兩類。與Wanderer相對應(yīng),Martin Kosher于1993年10月創(chuàng)建了ALIWEB,它是Archie的HTTP版本。作為搜索引擎的資源采集部分,網(wǎng)絡(luò)爬蟲的性能將直接影響到整個(gè)搜索引擎索引網(wǎng)頁的數(shù)量、質(zhì)量和更新周期。如果把整個(gè)互聯(lián)網(wǎng)當(dāng)成一個(gè)網(wǎng)站,那么網(wǎng)絡(luò)蜘蛛就可以用這個(gè)原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁都抓取下來。系統(tǒng)可以進(jìn)行面向主題的抓取。作者簽名: 日 期: 基于多線程的網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)摘要:網(wǎng)絡(luò)爬蟲(Web Crawler),又叫網(wǎng)絡(luò)蜘蛛(Web Spider),是搜索引擎的重要組成部分。用戶通過輸入自己感興趣的關(guān)鍵字就能獲得與之相關(guān)的網(wǎng)頁。高效,優(yōu)秀的自動(dòng)獲取資源程序可以使人們在互聯(lián)網(wǎng)上尋找到更及時(shí),更準(zhǔn)確的信息。Jug head是后來另一個(gè)Gopher搜索工具。從此搜索引擎進(jìn)入了高速發(fā)展時(shí)期。登陸要求。 URL結(jié)構(gòu)一般分為兩個(gè)部分,一個(gè)是物理結(jié)構(gòu),一個(gè)是邏輯結(jié)構(gòu)。是萬維網(wǎng)(world wide web)交換信息的基礎(chǔ)。 同樣也分為三部分,第一部分叫request line, 第二部分叫request header,第三部分是body. header和body之間也有個(gè)空行,結(jié)構(gòu)如圖22:圖22 Response消息結(jié)構(gòu)HTTP/versionnumber表示HTTP協(xié)議的版本號(hào),statuscode 和message 請看下節(jié)[HTTP狀態(tài)代碼]的詳細(xì)解釋. 請求方法 HTTP/(有時(shí)也叫“動(dòng)作”)來表明RequestURI指定的資源的不同操作方式:本系統(tǒng)主要研究Get請求的特點(diǎn)。CONNECT HTTP/。每個(gè)進(jìn)程包含一到多個(gè)線程。“Bug”,因此要小心使用。 Thread(String name)。當(dāng)線程的run方法運(yùn)行完畢,線程將被拋棄,進(jìn)入死亡狀態(tài)。 Java 網(wǎng)絡(luò)編程 網(wǎng)絡(luò)編程就是兩個(gè)或多個(gè)設(shè)備之間的數(shù)據(jù)交換,其實(shí)更具體的說,網(wǎng)絡(luò)編程就是兩個(gè)或多個(gè)程序之間的數(shù)據(jù)交換,和普通的單機(jī)程序相比,網(wǎng)絡(luò)程序最大的不同就是需要交換數(shù)據(jù)的程序運(yùn)行在不同的計(jì)算機(jī)上,這樣就造成了數(shù)據(jù)交換的復(fù)雜。TCP是一個(gè)面向連接的協(xié)議,為用戶進(jìn)程提供可靠的全雙工字節(jié)流。關(guān)閉網(wǎng)絡(luò)連接在數(shù)據(jù)交換完成以后,關(guān)閉網(wǎng)絡(luò)連接,釋放程序占用的端口、內(nèi)存等系統(tǒng)資源,結(jié)束網(wǎng)絡(luò)編程。該包中既包含基礎(chǔ)的網(wǎng)絡(luò)編程類,也包含封裝后的專門處理WEB相關(guān)的處理類。示例代碼如下: OutputStream os = ()。 寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索) 是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。(6) 繼續(xù)查找V 的其他鄰接頂點(diǎn)col,轉(zhuǎn)到步驟(5),若V 的所有鄰接頂點(diǎn)都已經(jīng)被訪問過,則轉(zhuǎn)到步驟(2)。(摘自百度百科[5])網(wǎng)絡(luò)爬蟲種類繁多,如果按照部署在哪里分,可以分成::一般是一個(gè)多線程程序,同時(shí)下載多個(gè)目標(biāo)HTML,可以用Java,Python,一般綜合搜索引擎的爬蟲這樣做。網(wǎng)頁的內(nèi)容并不是簡單地指網(wǎng)頁的HTML代碼,因?yàn)榇蟛糠值腍TML標(biāo)簽以及JavaScript代碼對我們的后期要進(jìn)行的查詢工作等都是冗余的,所以應(yīng)該將它們剔除。圖32 表示的表用于保存未訪問的URL的信息(URL表)。由于 Eclipse 中的每樣?xùn)|西都是插件,對于給 Eclipse 提供插件,以及給用戶提供一致和統(tǒng)的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的發(fā)揮場所。相對地址需要先轉(zhuǎn)化為絕對地址,再進(jìn)行過濾。 網(wǎng)頁抓取 為了使系統(tǒng)更快速,更穩(wěn)定,對于網(wǎng)頁的抓取使用第三方類庫HttpClient實(shí)現(xiàn)。 HttpClient 類庫與Jericho HTML Parser類庫 為了簡化系統(tǒng)實(shí)現(xiàn)難度和提高系統(tǒng)穩(wěn)定性,本系統(tǒng)主要使用了這兩個(gè)第三方類庫,前文已經(jīng)多次提到這兩個(gè)類庫。由于可以針對任意代碼塊,且可任意指定上鎖的對象,故靈活性較高。amp。// 讀取為字節(jié)數(shù)組 // 根據(jù)網(wǎng)頁 url 生成保存時(shí)的文件名 fileType = (ContentType).getValue() .toLowerCase()。 if (visitUrl == null) { continue。其中的參數(shù)為要獲取字段的字段名5。圖63是運(yùn)行一段時(shí)間過后的情況,我們可以看到,所有工作線程都已經(jīng)開始工作圖63 程序運(yùn)行截圖(二)通過截圖我們可以觀察到線程的運(yùn)行順序是不可預(yù)測的,這也增大了我們編程的難度。 //把查詢的結(jié)果放在一個(gè)記錄集中()。 (100)。 filePath = null。amp。當(dāng)然我們可以通過將訪問類成員變量的代碼放到專門的方法中,將其聲明為 synchronized ,并在主方法中調(diào)用來解決這一問題,但是 Java 為我們提供了更好的解決辦法,那就是 synchronized 塊通過 synchronized關(guān)鍵字來聲明synchronized 塊。:A=4B+C。當(dāng)這個(gè)List中的數(shù)目過多時(shí),則將List中的內(nèi)容加入到數(shù)據(jù)庫,并清空該List,以便加入新的URLs;第二段為數(shù)據(jù)庫,當(dāng)?shù)谝欢螖?shù)據(jù)過多時(shí),將第一段內(nèi)的數(shù)據(jù)存入數(shù)據(jù)庫;第三段也為一個(gè)List,從這里面分配任務(wù)URL,當(dāng)該List內(nèi)URL不足時(shí),將數(shù)據(jù)庫里的數(shù)據(jù)再轉(zhuǎn)存入。 URL解析 截取出來的字符串,可能為相對地址或者絕對地址。雖然大多數(shù)用戶很樂于將 Eclipse 當(dāng)作 Java 集成開發(fā)環(huán)境(IDE)來使用,但 Eclipse 的目標(biāo)卻不僅限于此。這是一個(gè)單線程的框架,采用多線程技術(shù)是我們可看成是多個(gè)這個(gè)樣的爬蟲并發(fā)的的執(zhí)行。第三,網(wǎng)絡(luò)蜘蛛只下載網(wǎng)站中的文本信息(如:HTML頁面、ASP、PHP、JSP等等),并不下載圖片、軟件、視音頻文件等等。定義4:如果超鏈接l指向網(wǎng)頁t,則網(wǎng)頁t稱為子網(wǎng)頁,又稱為目標(biāo)網(wǎng)頁。(4) 查找頂點(diǎn)V 的第一個(gè)鄰接頂點(diǎn)col。 網(wǎng)頁搜索策略 在抓取網(wǎng)頁的時(shí)候,網(wǎng)頁的抓取策略可以分為深度優(yōu)先、廣度優(yōu)先和最佳優(yōu)先三種。如果建立連接時(shí),本機(jī)網(wǎng)絡(luò)不通,或服務(wù)器端程序未開啟,則會(huì)拋出異常。 Java網(wǎng)絡(luò)編程技術(shù)Java語言是在網(wǎng)絡(luò)環(huán)境下誕生的,所以Java語言雖然不能說是對于網(wǎng)絡(luò)編程的支持最好的語言,但是必須說是一種對于網(wǎng)絡(luò)編程提供良好支持的語言,使用Java語言進(jìn)行網(wǎng)絡(luò)編程將是一件比較輕松的工作。交換數(shù)據(jù)嚴(yán)格按照請求響應(yīng)模型進(jìn)行,由客戶端發(fā)送一個(gè)請求數(shù)據(jù)到服務(wù)器,服務(wù)器反饋一個(gè)響應(yīng)數(shù)據(jù)給客戶端,如果客戶端不發(fā)送請求則服務(wù)器端就不響應(yīng)。其中主要使用的基于TCP和UDP的網(wǎng)絡(luò)編程。JAVA使用synchronized關(guān)鍵字來定義程序中要求線程同步的部分。然后,調(diào)用線程的start()方法,來向線程調(diào)度程序(通常是JVM或操作系統(tǒng))注冊一個(gè)線程,這個(gè)時(shí)候,這個(gè)線程一切就緒,就等待CPU時(shí)間了。 Thread(Runnable target,String name)。 不足,會(huì)影響性能,因?yàn)椴僮飨到y(tǒng)需要在它們之間切換。本系統(tǒng)主要處理該狀態(tài)碼的消息; Java多線程在一個(gè)程序中,一些獨(dú)立運(yùn)行的程序片斷叫做“線程”(Thread),利用它編程的概念就叫作“多線程處理”。DELETE 請求服務(wù)器刪除RequestURI所標(biāo)識(shí)的資源。 HTTP消息的結(jié)構(gòu)Request 消息的結(jié)構(gòu),Request 消息分為3部分,第一部分叫請求行, 第二部分叫 header, 第三部分是body. header和body之間有個(gè)空行,結(jié)構(gòu)如圖21:圖21 Request 消息結(jié)構(gòu)第一行中的Method表示請求方法,比如POST,GET,Pathtoresource表示請求的資源,Http/versionnumber 表示HTTP協(xié)議的版本號(hào)。 HTTP協(xié)議簡介協(xié)議是指計(jì)算機(jī)通信網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間進(jìn)行通信所必須共同遵守的規(guī)定或規(guī)則,超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議,它允許將超文本標(biāo)記語言(HTML)文檔從Web服務(wù)器傳送到客戶端的瀏覽器。Internet上的每一個(gè)網(wǎng)頁都具有一個(gè)唯一的名稱標(biāo)識(shí),通常稱之為URL地址,這種地址可以是本地磁盤,也可以是局域網(wǎng)上的某一臺(tái)計(jì)算機(jī),更多的是Internet上的站點(diǎn)。部分站長為了讓用戶記住登陸信息,強(qiáng)迫用戶使用Cookies。當(dāng)時(shí)Michael Mauldin將John Leavitt的蜘蛛程序接入到其索引程序中,創(chuàng)建了大家現(xiàn)在熟知的Lycos(2000年被西班牙網(wǎng)絡(luò)集團(tuán)Terra Lycos Network收購)。Archie是一個(gè)可搜索的FTP文件名列表,用戶必須輸入精確的文件名搜索,然后Archie會(huì)告訴用戶哪一個(gè)FTP地址可以下載該文件。自動(dòng)獲取資源技術(shù)程序的實(shí)現(xiàn)策略,運(yùn)行效率直接影響搜索引擎的搜索結(jié)果。據(jù)統(tǒng)計(jì)搜索引擎已經(jīng)成為僅次于電子郵件服務(wù),是人們使用最多的網(wǎng)路服務(wù)。對本研究提供過幫助和做出過貢獻(xiàn)的個(gè)人或集體,均已在文中作了明確的說明并表示了謝意。關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;廣度優(yōu)先;Java; 多線程;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 Internet, 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 network programming. Implementation of the key technology of web crawler