董日壯 郭曙超
摘要:隨著社會(huì)的飛速發(fā)展,互聯(lián)網(wǎng)上信息容量急劇增加,人們對(duì)搜索引擎的依賴愈發(fā)強(qiáng)烈。網(wǎng)絡(luò)爬蟲是搜索引擎的關(guān)鍵技術(shù)之一,同時(shí)也是快速獲取網(wǎng)絡(luò)上可用資源的有效工具。為了能夠?qū)W(wǎng)絡(luò)爬蟲更深入的了解并熟練合理的應(yīng)用于各種的應(yīng)用和系統(tǒng)中,經(jīng)過對(duì)網(wǎng)絡(luò)爬蟲的框架、基本工作流程、抓取策略的分析和了解,使用Java與HTML解析工具jsoup以及MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)爬蟲,簡(jiǎn)單爬取京東的圖書數(shù)據(jù),用于用戶喜好的分析及購(gòu)買傾向的判斷,為用戶提供個(gè)性化的服務(wù)。
關(guān)鍵詞:搜索引擎;網(wǎng)絡(luò)爬蟲;抓取策略;Java;jsoup;MySQL
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)17-3986-03
Design and Implementation of Web Crawler
DONG Ri-zhuang1, GUO Shu-chao2
(1.School of Computer Engineering, Qingdao Technological University, Qingdao 266033, China; 2.Shandong Entry-Exit Inspection and Quarantine Bureau, Qingdao 266000, China)
Abstract: With the rapid development of society, a sharp increase in information capacity on the Internet, people rely on search engines is growing. As one of the key technologies of Web crawler search engines, but also an effective tool for quick access to the available resources on the network. In order to understand web crawler better and apply it into various applications and systems more skillful and reasonably. After analyze and understand the framework, basic workflow, grab strategy of web crawler, use programming language of Java and HTML parsing tools jsoup and MySQL database implements a web crawler, crawling Jingdong book data simply in order to analysis users preferences and purchase predisposition, so that to provide users with personalized service.
Key words: search engine; Web crawler; grab analyze; Java; jsoup; MySQL
1 概述
隨著社會(huì)發(fā)展與時(shí)代進(jìn)步,信息社會(huì)的發(fā)展速度超出了絕大多數(shù)人的想象,與此同時(shí),互聯(lián)網(wǎng)容量已經(jīng)達(dá)到了一個(gè)空前的規(guī)模。據(jù)搜索引擎巨頭Google透露,在2012年時(shí)候,Google的網(wǎng)頁(yè)爬蟲Googlebot每天都會(huì)經(jīng)過大約200億個(gè)網(wǎng)頁(yè)[1],并且追蹤著約300億個(gè)獨(dú)立的URL鏈接。此外,Google每個(gè)月的搜索請(qǐng)求接近1000億次。由此可以看出,互聯(lián)網(wǎng)信息量龐大,搜索引擎應(yīng)用廣泛。但是海量的信息要求搜索引擎給出更快的反饋。
網(wǎng)絡(luò)爬蟲[2,3,4](Web Crawler)作為搜索引擎的重要組成部分,同樣也需要更快的發(fā)展,以應(yīng)對(duì)迅速增長(zhǎng)的互聯(lián)網(wǎng)容量。網(wǎng)絡(luò)爬蟲通常又被稱作網(wǎng)絡(luò)蜘蛛[5](Web Spider),是一個(gè)可以自動(dòng)在互聯(lián)網(wǎng)上漫游并可以自動(dòng)下載網(wǎng)頁(yè)的程序或腳本。由于其功能多樣,網(wǎng)絡(luò)爬蟲可以被用于多種場(chǎng)合中,比如微博上有眾多的用戶與其他用戶之間的聯(lián)系的信息;淘寶和京東上有大量用戶的購(gòu)買信息及對(duì)商品的評(píng)論。這些信息對(duì)于分析用戶的購(gòu)物行為和偏好及其社會(huì)關(guān)系有著重要的作用,蘊(yùn)藏著巨大的價(jià)值。
為了能夠更好的理解與使用網(wǎng)絡(luò)爬蟲,文中對(duì)爬蟲的基本結(jié)構(gòu)、工作流程、以及爬取策略等進(jìn)行了一定的分析與介紹,并使用現(xiàn)有技術(shù)設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)網(wǎng)絡(luò)爬蟲,爬取了京東圖書的數(shù)據(jù),用于用戶的興趣偏好和潛在購(gòu)買行為等數(shù)據(jù)挖掘工作。
2 爬蟲的結(jié)構(gòu)
2.1 網(wǎng)絡(luò)爬蟲的基本結(jié)構(gòu)
通用的網(wǎng)絡(luò)爬蟲框架圖[6]如圖1所示。
2.2 網(wǎng)絡(luò)爬蟲的基本工作流程
網(wǎng)絡(luò)爬蟲的基本工作流程[7]如下:
1)首先選取一些高質(zhì)量的URL作為種子URL;
2)將選取的種子URL放入到待抓取URL中;
3)依次從待抓取URL隊(duì)列中取出URL,對(duì)URL的DNS進(jìn)行解析,獲得主服務(wù)器IP,并將網(wǎng)頁(yè)下載下來,保存到數(shù)據(jù)庫(kù)中。然后將該URL放入已抓取URL隊(duì)列中;
4)分析已抓取URL隊(duì)列中的URL,得到另一些URL,再次放入待抓取URL隊(duì)列,從而繼續(xù)循環(huán)下去。
2.3 爬蟲對(duì)互聯(lián)網(wǎng)的劃分
對(duì)應(yīng)網(wǎng)絡(luò)爬蟲的工作流程,可以從爬蟲的角度,將互聯(lián)網(wǎng)頁(yè)面分為如圖2的五部分[8]:
1)已下載但未過期網(wǎng)頁(yè);
2)已下載但已過期網(wǎng)頁(yè):抓取時(shí)頁(yè)面與當(dāng)前頁(yè)面不再相同,此時(shí),該部分部分抓取到的網(wǎng)頁(yè)就變?yōu)橐堰^期的網(wǎng)頁(yè);endprint
3)待下載網(wǎng)頁(yè):表示存在于待抓取隊(duì)列中的URL;
4)可知網(wǎng)頁(yè):還未進(jìn)行抓取,也未存在于待抓取URL隊(duì)列中,但是可以通過分析已抓取頁(yè)面或者待抓取URL對(duì)應(yīng)頁(yè)面得到,即可知網(wǎng)頁(yè);
5)不可知網(wǎng)頁(yè):有一部分網(wǎng)頁(yè)無法被爬蟲直接抓取,稱為不可知網(wǎng)頁(yè)。
2.4 爬蟲抓取策略
在整個(gè)爬蟲系統(tǒng)里,最重要的部分是怎樣得到待抓取URL隊(duì)列。同時(shí)待抓取URL隊(duì)列中的URL如何排列同樣是爬蟲的關(guān)鍵問題,因?yàn)檫@涉及到頁(yè)面抓取的先后順序問題,直接決定爬蟲爬取頁(yè)面的質(zhì)量。而決定URL排列和抓取順序的方法,稱為抓取策略[9]。主要的抓取策略有:深度優(yōu)先遍歷策略、寬度優(yōu)先遍歷策略、反向鏈接數(shù)策略、Partial PageRank策略、OPIC策略、大站優(yōu)先策略等。
深度優(yōu)先遍歷策略即圖的深度優(yōu)先遍歷。網(wǎng)絡(luò)爬蟲會(huì)從起始URL開始,跟蹤每個(gè)URL,直到該URL處理結(jié)束,轉(zhuǎn)到下一個(gè)URL繼續(xù)跟蹤。
寬度優(yōu)先遍歷策略的則是將網(wǎng)頁(yè)中發(fā)現(xiàn)的URL直接加入待抓取URL隊(duì)列中。
反向鏈接數(shù)是指一個(gè)網(wǎng)頁(yè)被其他URL指向的數(shù)量,通常用來評(píng)價(jià)網(wǎng)頁(yè)的重要程度。
Partial PageRank策略,即最佳優(yōu)先搜索策略,分析當(dāng)前URL與目標(biāo)網(wǎng)頁(yè)主題的相關(guān)性,優(yōu)先選擇評(píng)價(jià)好的URL進(jìn)行抓取。
OPIC策略也是對(duì)頁(yè)面進(jìn)行重要性進(jìn)行評(píng)估,確定重要性。
大站優(yōu)先策略是根據(jù)網(wǎng)站的分類,優(yōu)先下載頁(yè)面數(shù)多的網(wǎng)站。
不管網(wǎng)絡(luò)爬蟲采用何種爬取策略,其基本目標(biāo)是一致的:優(yōu)先爬取重要的網(wǎng)頁(yè)。
3 實(shí)現(xiàn)
經(jīng)過對(duì)網(wǎng)絡(luò)爬蟲的框架、基本工作流程、抓取策略的分析,對(duì)網(wǎng)絡(luò)爬蟲有了一定的認(rèn)識(shí)和了解,接下來我們簡(jiǎn)單實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)爬蟲。
3.1 技術(shù)儲(chǔ)備
開發(fā)語(yǔ)言采用Java,原因是可移植性良好,同時(shí)有較多的開源工具可供使用。
數(shù)據(jù)庫(kù)采用MySQL,以上兩個(gè)工具作為開源工具的代表,被廣泛的用于很多項(xiàng)目。
數(shù)據(jù)源采用京東的圖書數(shù)據(jù),包括圖書的信息、用戶對(duì)該書的評(píng)價(jià)、打分情況,有實(shí)際的使用價(jià)值。
HTML解析工具采用jsoup[10],原因如下:
jsoup 是一個(gè)較為著名的使用Java 開發(fā)的 HTML解析器,能夠?qū)RL地址或HTML文本直接解析出需要的數(shù)據(jù)。同時(shí)為開發(fā)人員提供了極其方便的API,能夠通過DOM、CSS甚至可以用類似 jQuery的方法來解析和操作HTML。同時(shí)由于jsoup 是基于 MIT 協(xié)議發(fā)布的,可用于商業(yè)項(xiàng)目。
3.2 數(shù)據(jù)頁(yè)面分析
首先對(duì)京東圖書的頁(yè)面圖書數(shù)據(jù)進(jìn)行分析,主要是分析其網(wǎng)頁(yè)和URL的結(jié)構(gòu),我們可以得到,所有圖書的分類在一個(gè)頁(yè)面中全部列出(http://book.jd.com/booksort.html),所以我們可以寬度優(yōu)先遍歷策略取出所有的圖書分類的URL,將其加入待爬取URL隊(duì)列,然后根據(jù)URL的結(jié)構(gòu)依次對(duì)待爬取隊(duì)列中的URL使用寬度優(yōu)先遍歷策略進(jìn)行爬取,取出其中的所有圖書URL加入到待爬取URL隊(duì)列中,最后從待爬取URL取出圖書的URL,下載圖書頁(yè)面,分析獲取到其中的圖書相關(guān)的信息以及打分和評(píng)論。
3.3 代碼實(shí)現(xiàn)要點(diǎn)
由于涉及的代碼眾多,在此只給出難點(diǎn)的解決方案。
1)獲取圖書URL
在整個(gè)頁(yè)面中包含的標(biāo)簽和內(nèi)容非常多,我們需要從大量的信息中取出圖書的URL,此處我們使用正則表達(dá)式[11]的方式。正則表達(dá)式是一種可以用于模式匹配和替換的規(guī)范,通常由普通字符和有特殊意義的元字符組成。作為一個(gè)模板,正則表達(dá)式可以將某個(gè)模式與所需查詢的字符串進(jìn)行匹配。使用正則表達(dá)式的方法可以輕松高效的獲取到頁(yè)面所有的圖書URL,并將其存儲(chǔ)于數(shù)據(jù)庫(kù)中。
比如正則表達(dá)式(Java語(yǔ)言規(guī)范,轉(zhuǎn)義字符需\\):
http\\://item.jd.com\\/[0-9]{8,9}\\.html
是匹配京東的商品鏈接的正則表達(dá)式,可以匹配類似http://item.jd.com/10057446.html的商品鏈接。
2)防止異常中斷問題
每個(gè)頁(yè)面的爬取都可能遇到錯(cuò)誤。在爬取了部分網(wǎng)頁(yè)的時(shí)候可能會(huì)出現(xiàn)連接超時(shí)的問題,所以在每個(gè)頁(yè)面的爬取都加入爬取成功的驗(yàn)證:如果該頁(yè)面爬取成功,則繼續(xù)爬取下一個(gè)頁(yè)面;如果失敗,則重新爬取該頁(yè)面,如果達(dá)到設(shè)定閾值還沒有爬取成功,跳過該頁(yè)面的爬取,將該URL加入到待爬取隊(duì)列尾部。
3)評(píng)論內(nèi)容獲取
由于評(píng)論內(nèi)容采用的是AJAX的方式獲取,直接使用jsoup獲取到的HTML中不包括詳細(xì)評(píng)論內(nèi)容,但是包含AJAX請(qǐng)求的URL,請(qǐng)求該URL會(huì)返回以json封裝的數(shù)據(jù),所以我們可以直接獲取到URL然后請(qǐng)求得到j(luò)son,使用json解析工具解析json對(duì)象即可獲取到每個(gè)用戶對(duì)該商品的詳細(xì)評(píng)論內(nèi)容及打分情況,存儲(chǔ)于數(shù)據(jù)庫(kù)即可。分頁(yè)也是與此類似。
4 結(jié)論
文中通過對(duì)網(wǎng)絡(luò)爬蟲的結(jié)構(gòu)、基本工作流程以及對(duì)抓取策略進(jìn)行了分析,并使用Java以及jsoup實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲系統(tǒng),對(duì)京東的圖書數(shù)據(jù)進(jìn)行了爬取,分析了其中可能遇到的問題及解決方法,獲得的圖書信息以及評(píng)論信息,用于用戶興趣的分析和圖書的推薦等。該文提出的爬蟲的實(shí)現(xiàn)方法有一定的通用性,有很多需要進(jìn)行優(yōu)化和改進(jìn)的地方[12],比如使用多線程和分布式以提高爬取效率;使用事務(wù)提高數(shù)據(jù)庫(kù)操作效率等,但是網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)是需要結(jié)合自身需要,同時(shí)也可以采用多種并行的設(shè)計(jì)和實(shí)現(xiàn)方法,以達(dá)到更好的效果。
參考文獻(xiàn):
[1] http://news.mydrivers.com/1/237/237222.htm
[2] Lawrence, Steve; C. Lee Giles (1999). "Accessibility of information on the web". Nature 400 (6740): 107. doi:10.1038/21987.
[3] 劉金紅,陸余良.主題網(wǎng)絡(luò)爬蟲研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2007,24(10):26-29.
[4] Thelwall M.A web crawler design for data mining[J]. Journal of Information Science,2001,27(5): 319-325.
[5] 王嘉杰.面向博客領(lǐng)域的垂直搜索引擎的研究與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2009.
[6] 曾偉輝,李淼.深層網(wǎng)絡(luò)爬蟲研究綜述[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008,17(5):122-125.
[7] 姚琪.垂直搜索引擎系統(tǒng)的研究與設(shè)計(jì)[D].上海:上海交通大學(xué),2008.
[8] 王巖.搜索引擎中網(wǎng)絡(luò)爬蟲技術(shù)的發(fā)展[J].電信快報(bào):網(wǎng)絡(luò)與通信,2008 (10):20-22.
[9] Thelwall M.A web crawler design for data mining[J].Journal of Information Science,2001,27(5): 319-325.
[10] http://jsoup.org/
[11] 胡軍偉,秦奕青,張偉.正則表達(dá)式在 Web 信息抽取中的應(yīng)用[J].北京信息科技大學(xué)學(xué)報(bào):自然科學(xué)版, 2012,26(6): 86-89.
[12] Shkapenyuk V,Suel T.Design and implementation of a high-performance distributed web crawler[C]//Data Engineering, 2002. Proceedings. 18th International Conference on. IEEE,2002:357-368.endprint
3)待下載網(wǎng)頁(yè):表示存在于待抓取隊(duì)列中的URL;
4)可知網(wǎng)頁(yè):還未進(jìn)行抓取,也未存在于待抓取URL隊(duì)列中,但是可以通過分析已抓取頁(yè)面或者待抓取URL對(duì)應(yīng)頁(yè)面得到,即可知網(wǎng)頁(yè);
5)不可知網(wǎng)頁(yè):有一部分網(wǎng)頁(yè)無法被爬蟲直接抓取,稱為不可知網(wǎng)頁(yè)。
2.4 爬蟲抓取策略
在整個(gè)爬蟲系統(tǒng)里,最重要的部分是怎樣得到待抓取URL隊(duì)列。同時(shí)待抓取URL隊(duì)列中的URL如何排列同樣是爬蟲的關(guān)鍵問題,因?yàn)檫@涉及到頁(yè)面抓取的先后順序問題,直接決定爬蟲爬取頁(yè)面的質(zhì)量。而決定URL排列和抓取順序的方法,稱為抓取策略[9]。主要的抓取策略有:深度優(yōu)先遍歷策略、寬度優(yōu)先遍歷策略、反向鏈接數(shù)策略、Partial PageRank策略、OPIC策略、大站優(yōu)先策略等。
深度優(yōu)先遍歷策略即圖的深度優(yōu)先遍歷。網(wǎng)絡(luò)爬蟲會(huì)從起始URL開始,跟蹤每個(gè)URL,直到該URL處理結(jié)束,轉(zhuǎn)到下一個(gè)URL繼續(xù)跟蹤。
寬度優(yōu)先遍歷策略的則是將網(wǎng)頁(yè)中發(fā)現(xiàn)的URL直接加入待抓取URL隊(duì)列中。
反向鏈接數(shù)是指一個(gè)網(wǎng)頁(yè)被其他URL指向的數(shù)量,通常用來評(píng)價(jià)網(wǎng)頁(yè)的重要程度。
Partial PageRank策略,即最佳優(yōu)先搜索策略,分析當(dāng)前URL與目標(biāo)網(wǎng)頁(yè)主題的相關(guān)性,優(yōu)先選擇評(píng)價(jià)好的URL進(jìn)行抓取。
OPIC策略也是對(duì)頁(yè)面進(jìn)行重要性進(jìn)行評(píng)估,確定重要性。
大站優(yōu)先策略是根據(jù)網(wǎng)站的分類,優(yōu)先下載頁(yè)面數(shù)多的網(wǎng)站。
不管網(wǎng)絡(luò)爬蟲采用何種爬取策略,其基本目標(biāo)是一致的:優(yōu)先爬取重要的網(wǎng)頁(yè)。
3 實(shí)現(xiàn)
經(jīng)過對(duì)網(wǎng)絡(luò)爬蟲的框架、基本工作流程、抓取策略的分析,對(duì)網(wǎng)絡(luò)爬蟲有了一定的認(rèn)識(shí)和了解,接下來我們簡(jiǎn)單實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)爬蟲。
3.1 技術(shù)儲(chǔ)備
開發(fā)語(yǔ)言采用Java,原因是可移植性良好,同時(shí)有較多的開源工具可供使用。
數(shù)據(jù)庫(kù)采用MySQL,以上兩個(gè)工具作為開源工具的代表,被廣泛的用于很多項(xiàng)目。
數(shù)據(jù)源采用京東的圖書數(shù)據(jù),包括圖書的信息、用戶對(duì)該書的評(píng)價(jià)、打分情況,有實(shí)際的使用價(jià)值。
HTML解析工具采用jsoup[10],原因如下:
jsoup 是一個(gè)較為著名的使用Java 開發(fā)的 HTML解析器,能夠?qū)RL地址或HTML文本直接解析出需要的數(shù)據(jù)。同時(shí)為開發(fā)人員提供了極其方便的API,能夠通過DOM、CSS甚至可以用類似 jQuery的方法來解析和操作HTML。同時(shí)由于jsoup 是基于 MIT 協(xié)議發(fā)布的,可用于商業(yè)項(xiàng)目。
3.2 數(shù)據(jù)頁(yè)面分析
首先對(duì)京東圖書的頁(yè)面圖書數(shù)據(jù)進(jìn)行分析,主要是分析其網(wǎng)頁(yè)和URL的結(jié)構(gòu),我們可以得到,所有圖書的分類在一個(gè)頁(yè)面中全部列出(http://book.jd.com/booksort.html),所以我們可以寬度優(yōu)先遍歷策略取出所有的圖書分類的URL,將其加入待爬取URL隊(duì)列,然后根據(jù)URL的結(jié)構(gòu)依次對(duì)待爬取隊(duì)列中的URL使用寬度優(yōu)先遍歷策略進(jìn)行爬取,取出其中的所有圖書URL加入到待爬取URL隊(duì)列中,最后從待爬取URL取出圖書的URL,下載圖書頁(yè)面,分析獲取到其中的圖書相關(guān)的信息以及打分和評(píng)論。
3.3 代碼實(shí)現(xiàn)要點(diǎn)
由于涉及的代碼眾多,在此只給出難點(diǎn)的解決方案。
1)獲取圖書URL
在整個(gè)頁(yè)面中包含的標(biāo)簽和內(nèi)容非常多,我們需要從大量的信息中取出圖書的URL,此處我們使用正則表達(dá)式[11]的方式。正則表達(dá)式是一種可以用于模式匹配和替換的規(guī)范,通常由普通字符和有特殊意義的元字符組成。作為一個(gè)模板,正則表達(dá)式可以將某個(gè)模式與所需查詢的字符串進(jìn)行匹配。使用正則表達(dá)式的方法可以輕松高效的獲取到頁(yè)面所有的圖書URL,并將其存儲(chǔ)于數(shù)據(jù)庫(kù)中。
比如正則表達(dá)式(Java語(yǔ)言規(guī)范,轉(zhuǎn)義字符需\\):
http\\://item.jd.com\\/[0-9]{8,9}\\.html
是匹配京東的商品鏈接的正則表達(dá)式,可以匹配類似http://item.jd.com/10057446.html的商品鏈接。
2)防止異常中斷問題
每個(gè)頁(yè)面的爬取都可能遇到錯(cuò)誤。在爬取了部分網(wǎng)頁(yè)的時(shí)候可能會(huì)出現(xiàn)連接超時(shí)的問題,所以在每個(gè)頁(yè)面的爬取都加入爬取成功的驗(yàn)證:如果該頁(yè)面爬取成功,則繼續(xù)爬取下一個(gè)頁(yè)面;如果失敗,則重新爬取該頁(yè)面,如果達(dá)到設(shè)定閾值還沒有爬取成功,跳過該頁(yè)面的爬取,將該URL加入到待爬取隊(duì)列尾部。
3)評(píng)論內(nèi)容獲取
由于評(píng)論內(nèi)容采用的是AJAX的方式獲取,直接使用jsoup獲取到的HTML中不包括詳細(xì)評(píng)論內(nèi)容,但是包含AJAX請(qǐng)求的URL,請(qǐng)求該URL會(huì)返回以json封裝的數(shù)據(jù),所以我們可以直接獲取到URL然后請(qǐng)求得到j(luò)son,使用json解析工具解析json對(duì)象即可獲取到每個(gè)用戶對(duì)該商品的詳細(xì)評(píng)論內(nèi)容及打分情況,存儲(chǔ)于數(shù)據(jù)庫(kù)即可。分頁(yè)也是與此類似。
4 結(jié)論
文中通過對(duì)網(wǎng)絡(luò)爬蟲的結(jié)構(gòu)、基本工作流程以及對(duì)抓取策略進(jìn)行了分析,并使用Java以及jsoup實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲系統(tǒng),對(duì)京東的圖書數(shù)據(jù)進(jìn)行了爬取,分析了其中可能遇到的問題及解決方法,獲得的圖書信息以及評(píng)論信息,用于用戶興趣的分析和圖書的推薦等。該文提出的爬蟲的實(shí)現(xiàn)方法有一定的通用性,有很多需要進(jìn)行優(yōu)化和改進(jìn)的地方[12],比如使用多線程和分布式以提高爬取效率;使用事務(wù)提高數(shù)據(jù)庫(kù)操作效率等,但是網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)是需要結(jié)合自身需要,同時(shí)也可以采用多種并行的設(shè)計(jì)和實(shí)現(xiàn)方法,以達(dá)到更好的效果。
參考文獻(xiàn):
[1] http://news.mydrivers.com/1/237/237222.htm
[2] Lawrence, Steve; C. Lee Giles (1999). "Accessibility of information on the web". Nature 400 (6740): 107. doi:10.1038/21987.
[3] 劉金紅,陸余良.主題網(wǎng)絡(luò)爬蟲研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2007,24(10):26-29.
[4] Thelwall M.A web crawler design for data mining[J]. Journal of Information Science,2001,27(5): 319-325.
[5] 王嘉杰.面向博客領(lǐng)域的垂直搜索引擎的研究與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2009.
[6] 曾偉輝,李淼.深層網(wǎng)絡(luò)爬蟲研究綜述[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008,17(5):122-125.
[7] 姚琪.垂直搜索引擎系統(tǒng)的研究與設(shè)計(jì)[D].上海:上海交通大學(xué),2008.
[8] 王巖.搜索引擎中網(wǎng)絡(luò)爬蟲技術(shù)的發(fā)展[J].電信快報(bào):網(wǎng)絡(luò)與通信,2008 (10):20-22.
[9] Thelwall M.A web crawler design for data mining[J].Journal of Information Science,2001,27(5): 319-325.
[10] http://jsoup.org/
[11] 胡軍偉,秦奕青,張偉.正則表達(dá)式在 Web 信息抽取中的應(yīng)用[J].北京信息科技大學(xué)學(xué)報(bào):自然科學(xué)版, 2012,26(6): 86-89.
[12] Shkapenyuk V,Suel T.Design and implementation of a high-performance distributed web crawler[C]//Data Engineering, 2002. Proceedings. 18th International Conference on. IEEE,2002:357-368.endprint
3)待下載網(wǎng)頁(yè):表示存在于待抓取隊(duì)列中的URL;
4)可知網(wǎng)頁(yè):還未進(jìn)行抓取,也未存在于待抓取URL隊(duì)列中,但是可以通過分析已抓取頁(yè)面或者待抓取URL對(duì)應(yīng)頁(yè)面得到,即可知網(wǎng)頁(yè);
5)不可知網(wǎng)頁(yè):有一部分網(wǎng)頁(yè)無法被爬蟲直接抓取,稱為不可知網(wǎng)頁(yè)。
2.4 爬蟲抓取策略
在整個(gè)爬蟲系統(tǒng)里,最重要的部分是怎樣得到待抓取URL隊(duì)列。同時(shí)待抓取URL隊(duì)列中的URL如何排列同樣是爬蟲的關(guān)鍵問題,因?yàn)檫@涉及到頁(yè)面抓取的先后順序問題,直接決定爬蟲爬取頁(yè)面的質(zhì)量。而決定URL排列和抓取順序的方法,稱為抓取策略[9]。主要的抓取策略有:深度優(yōu)先遍歷策略、寬度優(yōu)先遍歷策略、反向鏈接數(shù)策略、Partial PageRank策略、OPIC策略、大站優(yōu)先策略等。
深度優(yōu)先遍歷策略即圖的深度優(yōu)先遍歷。網(wǎng)絡(luò)爬蟲會(huì)從起始URL開始,跟蹤每個(gè)URL,直到該URL處理結(jié)束,轉(zhuǎn)到下一個(gè)URL繼續(xù)跟蹤。
寬度優(yōu)先遍歷策略的則是將網(wǎng)頁(yè)中發(fā)現(xiàn)的URL直接加入待抓取URL隊(duì)列中。
反向鏈接數(shù)是指一個(gè)網(wǎng)頁(yè)被其他URL指向的數(shù)量,通常用來評(píng)價(jià)網(wǎng)頁(yè)的重要程度。
Partial PageRank策略,即最佳優(yōu)先搜索策略,分析當(dāng)前URL與目標(biāo)網(wǎng)頁(yè)主題的相關(guān)性,優(yōu)先選擇評(píng)價(jià)好的URL進(jìn)行抓取。
OPIC策略也是對(duì)頁(yè)面進(jìn)行重要性進(jìn)行評(píng)估,確定重要性。
大站優(yōu)先策略是根據(jù)網(wǎng)站的分類,優(yōu)先下載頁(yè)面數(shù)多的網(wǎng)站。
不管網(wǎng)絡(luò)爬蟲采用何種爬取策略,其基本目標(biāo)是一致的:優(yōu)先爬取重要的網(wǎng)頁(yè)。
3 實(shí)現(xiàn)
經(jīng)過對(duì)網(wǎng)絡(luò)爬蟲的框架、基本工作流程、抓取策略的分析,對(duì)網(wǎng)絡(luò)爬蟲有了一定的認(rèn)識(shí)和了解,接下來我們簡(jiǎn)單實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)爬蟲。
3.1 技術(shù)儲(chǔ)備
開發(fā)語(yǔ)言采用Java,原因是可移植性良好,同時(shí)有較多的開源工具可供使用。
數(shù)據(jù)庫(kù)采用MySQL,以上兩個(gè)工具作為開源工具的代表,被廣泛的用于很多項(xiàng)目。
數(shù)據(jù)源采用京東的圖書數(shù)據(jù),包括圖書的信息、用戶對(duì)該書的評(píng)價(jià)、打分情況,有實(shí)際的使用價(jià)值。
HTML解析工具采用jsoup[10],原因如下:
jsoup 是一個(gè)較為著名的使用Java 開發(fā)的 HTML解析器,能夠?qū)RL地址或HTML文本直接解析出需要的數(shù)據(jù)。同時(shí)為開發(fā)人員提供了極其方便的API,能夠通過DOM、CSS甚至可以用類似 jQuery的方法來解析和操作HTML。同時(shí)由于jsoup 是基于 MIT 協(xié)議發(fā)布的,可用于商業(yè)項(xiàng)目。
3.2 數(shù)據(jù)頁(yè)面分析
首先對(duì)京東圖書的頁(yè)面圖書數(shù)據(jù)進(jìn)行分析,主要是分析其網(wǎng)頁(yè)和URL的結(jié)構(gòu),我們可以得到,所有圖書的分類在一個(gè)頁(yè)面中全部列出(http://book.jd.com/booksort.html),所以我們可以寬度優(yōu)先遍歷策略取出所有的圖書分類的URL,將其加入待爬取URL隊(duì)列,然后根據(jù)URL的結(jié)構(gòu)依次對(duì)待爬取隊(duì)列中的URL使用寬度優(yōu)先遍歷策略進(jìn)行爬取,取出其中的所有圖書URL加入到待爬取URL隊(duì)列中,最后從待爬取URL取出圖書的URL,下載圖書頁(yè)面,分析獲取到其中的圖書相關(guān)的信息以及打分和評(píng)論。
3.3 代碼實(shí)現(xiàn)要點(diǎn)
由于涉及的代碼眾多,在此只給出難點(diǎn)的解決方案。
1)獲取圖書URL
在整個(gè)頁(yè)面中包含的標(biāo)簽和內(nèi)容非常多,我們需要從大量的信息中取出圖書的URL,此處我們使用正則表達(dá)式[11]的方式。正則表達(dá)式是一種可以用于模式匹配和替換的規(guī)范,通常由普通字符和有特殊意義的元字符組成。作為一個(gè)模板,正則表達(dá)式可以將某個(gè)模式與所需查詢的字符串進(jìn)行匹配。使用正則表達(dá)式的方法可以輕松高效的獲取到頁(yè)面所有的圖書URL,并將其存儲(chǔ)于數(shù)據(jù)庫(kù)中。
比如正則表達(dá)式(Java語(yǔ)言規(guī)范,轉(zhuǎn)義字符需\\):
http\\://item.jd.com\\/[0-9]{8,9}\\.html
是匹配京東的商品鏈接的正則表達(dá)式,可以匹配類似http://item.jd.com/10057446.html的商品鏈接。
2)防止異常中斷問題
每個(gè)頁(yè)面的爬取都可能遇到錯(cuò)誤。在爬取了部分網(wǎng)頁(yè)的時(shí)候可能會(huì)出現(xiàn)連接超時(shí)的問題,所以在每個(gè)頁(yè)面的爬取都加入爬取成功的驗(yàn)證:如果該頁(yè)面爬取成功,則繼續(xù)爬取下一個(gè)頁(yè)面;如果失敗,則重新爬取該頁(yè)面,如果達(dá)到設(shè)定閾值還沒有爬取成功,跳過該頁(yè)面的爬取,將該URL加入到待爬取隊(duì)列尾部。
3)評(píng)論內(nèi)容獲取
由于評(píng)論內(nèi)容采用的是AJAX的方式獲取,直接使用jsoup獲取到的HTML中不包括詳細(xì)評(píng)論內(nèi)容,但是包含AJAX請(qǐng)求的URL,請(qǐng)求該URL會(huì)返回以json封裝的數(shù)據(jù),所以我們可以直接獲取到URL然后請(qǐng)求得到j(luò)son,使用json解析工具解析json對(duì)象即可獲取到每個(gè)用戶對(duì)該商品的詳細(xì)評(píng)論內(nèi)容及打分情況,存儲(chǔ)于數(shù)據(jù)庫(kù)即可。分頁(yè)也是與此類似。
4 結(jié)論
文中通過對(duì)網(wǎng)絡(luò)爬蟲的結(jié)構(gòu)、基本工作流程以及對(duì)抓取策略進(jìn)行了分析,并使用Java以及jsoup實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲系統(tǒng),對(duì)京東的圖書數(shù)據(jù)進(jìn)行了爬取,分析了其中可能遇到的問題及解決方法,獲得的圖書信息以及評(píng)論信息,用于用戶興趣的分析和圖書的推薦等。該文提出的爬蟲的實(shí)現(xiàn)方法有一定的通用性,有很多需要進(jìn)行優(yōu)化和改進(jìn)的地方[12],比如使用多線程和分布式以提高爬取效率;使用事務(wù)提高數(shù)據(jù)庫(kù)操作效率等,但是網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)是需要結(jié)合自身需要,同時(shí)也可以采用多種并行的設(shè)計(jì)和實(shí)現(xiàn)方法,以達(dá)到更好的效果。
參考文獻(xiàn):
[1] http://news.mydrivers.com/1/237/237222.htm
[2] Lawrence, Steve; C. Lee Giles (1999). "Accessibility of information on the web". Nature 400 (6740): 107. doi:10.1038/21987.
[3] 劉金紅,陸余良.主題網(wǎng)絡(luò)爬蟲研究綜述[J].計(jì)算機(jī)應(yīng)用研究,2007,24(10):26-29.
[4] Thelwall M.A web crawler design for data mining[J]. Journal of Information Science,2001,27(5): 319-325.
[5] 王嘉杰.面向博客領(lǐng)域的垂直搜索引擎的研究與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2009.
[6] 曾偉輝,李淼.深層網(wǎng)絡(luò)爬蟲研究綜述[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2008,17(5):122-125.
[7] 姚琪.垂直搜索引擎系統(tǒng)的研究與設(shè)計(jì)[D].上海:上海交通大學(xué),2008.
[8] 王巖.搜索引擎中網(wǎng)絡(luò)爬蟲技術(shù)的發(fā)展[J].電信快報(bào):網(wǎng)絡(luò)與通信,2008 (10):20-22.
[9] Thelwall M.A web crawler design for data mining[J].Journal of Information Science,2001,27(5): 319-325.
[10] http://jsoup.org/
[11] 胡軍偉,秦奕青,張偉.正則表達(dá)式在 Web 信息抽取中的應(yīng)用[J].北京信息科技大學(xué)學(xué)報(bào):自然科學(xué)版, 2012,26(6): 86-89.
[12] Shkapenyuk V,Suel T.Design and implementation of a high-performance distributed web crawler[C]//Data Engineering, 2002. Proceedings. 18th International Conference on. IEEE,2002:357-368.endprint