摘 要: 分析了當(dāng)前主題爬蟲在面向BT種子文件獲取應(yīng)用上存在的問題,從提高BT種子獲取速率、提高覆蓋率和降低種子獲取延時(shí)的角度出發(fā),提出了基于Hash的去重機(jī)制,給出了爬蟲自動(dòng)登錄的實(shí)現(xiàn)方法,設(shè)計(jì)了AJAX頁面解析引擎,提出批量抓取和增量抓取相結(jié)合的數(shù)據(jù)抓取機(jī)制、歷史數(shù)據(jù)和更新數(shù)據(jù)相結(jié)合的數(shù)據(jù)存儲(chǔ)機(jī)制。通過設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基于爬蟲方式的BT種子文件獲取系統(tǒng)證明了這幾種方法能使系統(tǒng)整體性能平均提高30%~50%。這些技術(shù)和方法也可應(yīng)用于其他主題爬蟲。
關(guān)鍵詞: BitTorrent; BT種子爬蟲; 去重機(jī)制; 自動(dòng)登錄; AJAX解析
中圖分類號(hào): TP393 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào):2095-2163(2013)03-0007-07
Research on BitTorrent Seed File Oriented Web Crawling
SU Majing, YE Lin, SHI Jiantao
(Scholl of Computer Science and Technology, Harbin Institute of Technology,Harbin 150001, China)
Abstract: This article analyzes some difficulties in BitTorrent seed file crawling and explores several approaches of establishing efficient torrent crawler. Some schemes are proposed to improve torrents coverage rate, including a highly efficient duplicated files and URLs deletion method based on hash, automatic login agent, Ajax parsing engine. Different crawling policies and data storage policies for history torrents and new torrents are used to reduce the delay of fetching newly-added torrents. Experimental results indicate that these methods can obtain high freshness and coverage rate. These technologies can also be used in general-crawlers and other topic-focused crawlers.
Key words: BitTorrent; Torrent Crawler; Duplicate Deletion; Automatic Login; AJAX Parsing
0 引 言
P2P技術(shù)因其可為用戶提供便捷、高效的文件檢索和下載功能而進(jìn)入了高速發(fā)展和通用流行的時(shí)代。而作為P2P文件共享系統(tǒng)之一的BitTorrent(簡稱BT)[1]也隨之吸引了更多人的關(guān)注和興趣,進(jìn)而也成為學(xué)術(shù)界的研究熱點(diǎn)。大多數(shù)P2P系統(tǒng)均提供內(nèi)容檢索機(jī)制,但BT對(duì)此支持卻較為有限。通常,用戶需要從多個(gè)BT發(fā)布站點(diǎn)查找相應(yīng)的種子文件,再進(jìn)行文件下載,這一過程極大地降低了基于內(nèi)容的資源檢索效率。此外,BT搜索引擎仍然存在搜索結(jié)果涵蓋范圍小、下載鏈接易失效和文件內(nèi)容正確性與合法性難以得到有效保障等諸多問題。
面向BT種子文件獲取的網(wǎng)絡(luò)爬蟲的目標(biāo)就是快速、全面、高效地提取互聯(lián)網(wǎng)中的BT種子,但傳統(tǒng)的網(wǎng)絡(luò)爬蟲卻難以達(dá)到這些目標(biāo)。為此,本文提出了基于Hash的去重機(jī)制,給出了爬蟲自動(dòng)登錄的實(shí)現(xiàn)方法,設(shè)計(jì)了AJAX頁面解析引擎,提出批量抓取和增量抓取相結(jié)合的數(shù)據(jù)抓取機(jī)制、歷史數(shù)據(jù)和更新數(shù)據(jù)相結(jié)合的數(shù)據(jù)存儲(chǔ)機(jī)制。通過設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基于爬蟲方式的BT種子文件獲取系統(tǒng)驗(yàn)證了這幾種方法能使系統(tǒng)整體性能平均提高30%~50%。
1 相關(guān)工作
面向BitTorrent種子文件獲取的爬蟲與其他聚焦爬蟲[2]具有相同原理,即從一個(gè)或若干個(gè)URL開始,下載對(duì)應(yīng)網(wǎng)頁,從中解析得到URL和相關(guān)信息,再根據(jù)一定的網(wǎng)頁分析算法過濾掉與主題無關(guān)的鏈接,隨后依照一定的URL抓取策略生成新的待抓取隊(duì)列,重復(fù)該過程,直到滿足停止條件為止。目前,國內(nèi)、外主要研究工作擷選如下:
文獻(xiàn)[3]對(duì)基于Java的BitTorrent搜索引擎進(jìn)行了綜述,在對(duì)比不同編程語言實(shí)現(xiàn)的優(yōu)缺點(diǎn)后,給出了一個(gè)Java語言實(shí)現(xiàn)的簡單的BT搜索引擎,但性能并不高。文獻(xiàn)[4]實(shí)現(xiàn)的Torrent Crawler用來抓取Swarm網(wǎng)中Peer信息,而不是抓取種子文件。國內(nèi)清華大學(xué)研究了一種基于P2P的BitTorrent關(guān)鍵詞檢索系統(tǒng)[5],提出了基于對(duì)等網(wǎng)絡(luò)的BT關(guān)鍵詞檢索系統(tǒng),但其重點(diǎn)是對(duì)獲取到的種子進(jìn)行解析,并建立索引以構(gòu)建對(duì)用戶操作便利的檢索系統(tǒng),而沒有考慮能否全面快速地獲取種子。文獻(xiàn)[6]設(shè)計(jì)了一種面向P2P搜索的可定制聚焦網(wǎng)絡(luò)爬蟲,以BT種子文件為獲取目標(biāo),具有資源消耗小、數(shù)據(jù)采集準(zhǔn)確性高、可控性強(qiáng)的特點(diǎn),但是文中卻未涉及種子獲取全面性的指標(biāo)亦能有所提高的實(shí)現(xiàn)方法。學(xué)術(shù)界對(duì)主題爬蟲或者聚焦爬蟲的收獲率和新鮮度雖已啟動(dòng)了許多研究[7][8],但還尚未將這些研究應(yīng)用于BT種子文件獲取。
基于對(duì)以上文獻(xiàn)的研讀和分析可知,面向BT種子文件的爬蟲獲取還需要解決一些問題:
(1)抓取目標(biāo)的定義和描述。BT種子爬蟲獲取的目標(biāo)是BT種子文件,如何從抓取的大量網(wǎng)頁中識(shí)別種子文件是爬蟲面臨攻關(guān)的首要問題。
(2)初始URL的選擇。BT種子可能存在于任一網(wǎng)頁中,但卻主要存在于BT發(fā)布站點(diǎn),可以選擇該站點(diǎn)主頁作為初始URL,而在起始URL偏離主題時(shí),爬蟲完全能夠自動(dòng)調(diào)整。
(3)URL抓取隊(duì)列選擇。根據(jù)選定策略計(jì)算URL或網(wǎng)頁與種子下載的相關(guān)度并進(jìn)行有關(guān)排序,優(yōu)先抓取種子鏈接以確保種子的新鮮度。
(4)網(wǎng)頁相關(guān)度的判斷。鑒別得到與獲取BT種子有關(guān)的網(wǎng)頁(如索引頁面和下載頁面等),并過濾去掉與獲取無關(guān)的頁面(如廣告、新聞和討論等),這是提高系統(tǒng)效率和準(zhǔn)確度的關(guān)鍵。
(5)網(wǎng)站限制的突破。國內(nèi)主要以論壇的形式發(fā)布BT種子,但卻因增加了登錄、回復(fù)等驗(yàn)證機(jī)制而使現(xiàn)有爬蟲很難獲種子文件;而國內(nèi)、外的很多BT發(fā)布站點(diǎn)采用的都是AJAX技術(shù),傳統(tǒng)爬蟲基本無法抓取;另外,還有部分站點(diǎn)為防盜鏈和爬蟲加入了驗(yàn)證碼機(jī)制,這些限制對(duì)BT種子爬蟲能否獲得較高的覆蓋率形成了嚴(yán)峻的挑戰(zhàn)。
(6)種子文件去重。網(wǎng)絡(luò)中有大量種子,同一個(gè)種子文件也可能對(duì)應(yīng)多重下載鏈接,如何對(duì)種子文件實(shí)現(xiàn)去重以減少爬蟲存儲(chǔ)開銷也是值得考慮的問題。
(7)海量數(shù)據(jù)抓取?;ヂ?lián)網(wǎng)中有大量的站點(diǎn)和網(wǎng)頁,即使只對(duì)BT種子發(fā)布站點(diǎn)進(jìn)行爬取,數(shù)據(jù)量也是巨大的,需要分布式并行抓取以提高系統(tǒng)性能。
與此同時(shí),一些網(wǎng)站的下載地址是迅雷等下載工具的專用地址,經(jīng)過編碼處理,爬蟲需對(duì)其解碼才能夠下載到種子;另外,BT種子爬蟲也應(yīng)具備發(fā)現(xiàn)新BT下載站點(diǎn)或下載資源的能力。第3期 蘇馬婧,等:面向BitTorrent種子文件獲取的網(wǎng)絡(luò)爬蟲技術(shù)研究 智能計(jì)算機(jī)與應(yīng)用 第3卷
本文從提高BT種子爬蟲獲取效率、提升覆蓋率以及降低種子獲取延時(shí)的角度出發(fā),對(duì)以上問題的相關(guān)解決技術(shù)進(jìn)行了完整研究和系統(tǒng)論述。
2 提高獲取效率的技術(shù)
為提高獲取效率,本文從三個(gè)方面切入、考慮:提高種子和網(wǎng)頁的處理速度、減少無關(guān)頁面和重復(fù)頁面的抓取、并行抓取以提高性能,具體實(shí)現(xiàn)為:種子通信文件識(shí)別、基于正則表達(dá)式規(guī)則的URL過濾技術(shù)和基于Hash的去重機(jī)制。詳情見如下各節(jié)。
2.1 種子通信文件識(shí)別
通常情況下,識(shí)別種子文件可根據(jù)文件擴(kuò)展名或?qū)ΨN子進(jìn)行Bencode[9]解碼,但前者會(huì)造成遺漏或誤判,而后者的效率卻不高。通過對(duì)20個(gè)熱門的BT發(fā)布站點(diǎn)爬到的780 553個(gè)頁面進(jìn)行分析,總結(jié)得到如下特點(diǎn):
(1)從網(wǎng)站下載文件時(shí),服務(wù)器HTTP響應(yīng)的Content-Type頭如果為application/x-bittorrent,就一定是種子文件,也有一些種子下載時(shí),其Content-Type則為text/plain或application/octet-stream。
(2)正確的種子文件通常是以“d8:announce”開頭,且包含“announce”字段和“info”字段。
基于上述特征,就可以從大量網(wǎng)頁中快速、準(zhǔn)確地識(shí)別種子文件。對(duì)Content-Type的判斷可以在網(wǎng)頁抓取時(shí)進(jìn)行,對(duì)內(nèi)容解析可以在網(wǎng)頁分析時(shí)進(jìn)行,兩者并行處理可以提高爬蟲效率。在BT@China聯(lián)盟鏈接的43個(gè)站點(diǎn)上進(jìn)行測試,共抓取131 829個(gè)種子文件,漏抓0個(gè),誤抓12個(gè),識(shí)別率可達(dá)131 817/131 829=99.99%。
2.2 基于正則表達(dá)式規(guī)則的URL過濾技術(shù)
網(wǎng)站包含大量與種子獲取無關(guān)的鏈接,如廣告或說明信息等,需要將其濾掉以提高效率。對(duì)網(wǎng)頁過濾和主題相關(guān)度的評(píng)價(jià)研究也已經(jīng)積累了一定成果[10-11]。對(duì)國內(nèi)外近百個(gè)BT發(fā)布站點(diǎn)的組織結(jié)構(gòu)通過分析可以發(fā)現(xiàn),網(wǎng)頁鏈接結(jié)構(gòu)如圖 1所示。
圖 1 BT發(fā)布站點(diǎn)頁面間鏈接關(guān)系
Fig.1 Relationship of hyperlinks in BT publish sites 這種結(jié)構(gòu)關(guān)系體現(xiàn)為:同一站點(diǎn)相同類別的URL除Query部分外基本相同,可用一個(gè)或多個(gè)正則表達(dá)式來定義和說明。因此,可以通過URL匹配濾掉無關(guān)網(wǎng)頁。將采集到的網(wǎng)頁進(jìn)行劃分和聚類,抽取正則表達(dá)式,由這些正則表達(dá)式過濾規(guī)則來判定某網(wǎng)頁是否需要抓取,稱之為基于正則表達(dá)式規(guī)則的URL過濾技術(shù)。這些過濾規(guī)則不但要有一定的泛化能力,根據(jù)已抓到的網(wǎng)頁和種子的數(shù)量、狀態(tài),對(duì)過濾規(guī)則進(jìn)行動(dòng)態(tài)調(diào)整,并實(shí)時(shí)反饋給爬蟲以引導(dǎo)后續(xù)抓取過程。本文對(duì)5Q地帶(http://bt9.5qzone.net/)等20多個(gè)BT站點(diǎn)進(jìn)行了測試,采用基于正則表達(dá)式規(guī)則的URL過濾技術(shù)可以減少30%~50%的無關(guān)網(wǎng)頁抓取,抓取效率大為提高。
2.3 基于Hash的去重機(jī)制
同一個(gè)種子的下載鏈接可能存在于不同的頁面中,爬蟲重復(fù)下載這些鏈接會(huì)造成系統(tǒng)資源的浪費(fèi)。其他因素如斷電、系統(tǒng)故障等也可能造成爬蟲抓取狀態(tài)的丟失,重爬或者續(xù)爬是對(duì)已抓到的種子重復(fù)抓取或重復(fù)存儲(chǔ)也會(huì)浪費(fèi)磁盤空間。為此,需要對(duì)下載鏈接和種子文件去重。
基于Hash的去重機(jī)制可分為基于Hash的內(nèi)容去重和基于Hash的URL去重,如圖 2所示。基于Hash的內(nèi)容去重是對(duì)每一個(gè)抓到的種子和網(wǎng)頁都計(jì)算對(duì)應(yīng)的摘要,若當(dāng)前摘要已經(jīng)存在,則只更新狀態(tài),否則保存該摘要,并對(duì)種子進(jìn)行存儲(chǔ),或者對(duì)頁面進(jìn)行解析。基于Hash的URL去重是在爬蟲解析出網(wǎng)頁中的URL后,根據(jù)一定的散列算法計(jì)算URL的Hash值,并檢查該值在Crawldb(抓取數(shù)據(jù)庫)中是否存在,如果存在,則更新狀態(tài)使以后生成抓取隊(duì)列時(shí)不包含該URL,否則,將URL及其Hash寫入Crawldb。通常,散列算法可以選擇MD5或者SHA-1等。
圖 2 基于Hash的去重機(jī)制
Fig.2 Hash-based duplicate mechanism 由于Hash值的計(jì)算和比對(duì)可以與網(wǎng)頁抓取并行實(shí)現(xiàn),因此不會(huì)對(duì)爬蟲抓取網(wǎng)頁的性能產(chǎn)生影響。去重減少了對(duì)重復(fù)網(wǎng)頁的抓取和存儲(chǔ),提高了爬蟲的整體效率。經(jīng)實(shí)驗(yàn)驗(yàn)證,通過此方法,對(duì)同一種子出現(xiàn)在不同頁面鏈接中的站點(diǎn)(如Mininova),可以減少10%左右的種子URL重復(fù)下載。而對(duì)于種子鏈接動(dòng)態(tài)生成的站點(diǎn)(如BT@China聯(lián)盟),通過基于Hash的URL去重并不能夠減少種子的重復(fù)下載,但基于Hash的內(nèi)容去重則能夠減少50%以上種子重復(fù)下載,系統(tǒng)獲取的速度可以提高30%左右。
總之,種子通信文件識(shí)別、基于正則表達(dá)式規(guī)則的URL過濾技術(shù)以及基于Hash的去重機(jī)制能夠有效地提高系統(tǒng)效率。除此之外,提高爬蟲抓取效率還可以采用并行抓取來實(shí)現(xiàn),而這將涉及到多機(jī)協(xié)同、任務(wù)調(diào)度、負(fù)載均衡等[12-13]等相應(yīng)技術(shù)內(nèi)容。
3 提高覆蓋率的技術(shù)
覆蓋率,也稱抓全率,是衡量BT種子爬蟲獲取種子全面程度的數(shù)值指標(biāo)。爬蟲對(duì)網(wǎng)站W(wǎng)的覆蓋率CR(coverage rate)由下式給出:
CR = CI/NI
(1)
其中,CI是爬蟲從該網(wǎng)站獲得的種子數(shù),NI是該網(wǎng)站按種子特征值(infohash)去重后的種子數(shù)。
提高種子的覆蓋率需要解決兩類問題:一是如何發(fā)現(xiàn)新增BT發(fā)布站點(diǎn)或網(wǎng)頁;二是如何突破網(wǎng)站的限制下載到種子文件。本文著重給出兩種從技術(shù)上突破網(wǎng)站限制的方法,分別是爬蟲自動(dòng)登錄技術(shù)和AJAX網(wǎng)頁解析技術(shù)。
3.1 爬蟲自動(dòng)登錄技術(shù)
由圖 3所示的人工登錄和自動(dòng)登錄的對(duì)比可以看出,人工登錄可通過語義來判斷登錄狀態(tài),而爬蟲完成自動(dòng)登錄過程則需要解決:
(1)登錄表單的識(shí)別;
(2)登錄元素的提取和自動(dòng)填寫;
(3)登錄結(jié)果的判斷;
(4)Cookie等狀態(tài)信息的維護(hù)。
圖 3 人工登錄(左)和自動(dòng)登錄(右)過程對(duì)比
Fig.3 Comparisons of manual login (left)
and automatic login (right)3.1.1 登錄表單識(shí)別
登錄表單可由對(duì)登錄頁面進(jìn)行DOM(Document Object Model)解析獲得。一個(gè)登錄頁面包含的表單(form)可能有多個(gè),但是登錄表單卻只有一個(gè),嘗試對(duì)各表單逐個(gè)填充和單次登錄的做法顯然效率不高,對(duì)大量登錄頁面分析發(fā)現(xiàn),登錄表單具有一些共同特點(diǎn),如下所示:
(1)登錄表單的文本一般都含有“登錄”、“用戶名”、“密碼”等關(guān)鍵字,有些還會(huì)包含“安全問題”、“登錄模式”、“登錄有效期”等字樣。
(2)登錄表單的method一般都采用post方法,action對(duì)應(yīng)的目標(biāo)頁面通常都是“l(fā)ogging.php”、“l(fā)ogging.asp”等。
(3)表單至少應(yīng)包含一個(gè)type為text的標(biāo)簽和一個(gè)type為password的標(biāo)簽,用來填寫用戶名和密碼,還應(yīng)有一個(gè)類型為button的標(biāo)簽,或者是一個(gè)標(biāo)簽用來提交表單。
表 1 用于登錄表單判別的特征
Tab.1 Characteristics used to identify login forms
特征
取值
Form的method屬性值 get, post
Form的action屬性是否以“l(fā)og”開頭 yes, no
Form中input標(biāo)簽的type值 hidden,text,password,
radio,submit, image
是否存在類型為text的input標(biāo)簽 true, 1
是否存在類型為password的input標(biāo)簽 true, 1
是否存在類型為submit的input標(biāo)簽 true, 1
Form中button標(biāo)簽的type值 submit,button
是否存在button標(biāo)簽 true,1
類型為text的input的name值 user, username, …
類型為passord的input的name值 passwd,password,…
Form是否包含“登錄”或“l(fā)ogin” true,1
Form是否包含“用戶名”或“username” true,1
Form是否包含“密碼”或“password” true,1
Form是否包含“登錄有效期” true,1
Form是否包含“安全問題” true,1
Form是否包含“登錄模式” true,1
可用表 1所列特征判別一個(gè)登錄頁面中的表單是否為登錄表單。本文將網(wǎng)上隨機(jī)選擇的100個(gè)國內(nèi)外站點(diǎn)的登錄頁面作為訓(xùn)練樣本,由ID3算法生成判定樹,在50個(gè)隨機(jī)選擇的國內(nèi)外登錄頁面組成的測試集上進(jìn)行了驗(yàn)證,所得判別準(zhǔn)確率可達(dá)97.3%,對(duì)7個(gè)需要登錄的BT發(fā)布站點(diǎn)登錄頁面進(jìn)行了測試,結(jié)果準(zhǔn)確率可達(dá)100%。
3.1.2 登錄表單自動(dòng)填寫
表單的自動(dòng)填寫,就是找出表單中的待填項(xiàng)及其對(duì)應(yīng)值,并將每一對(duì)待填項(xiàng)和對(duì)應(yīng)值標(biāo)記為的形式。經(jīng)過分析,發(fā)現(xiàn)登錄表單中的待填項(xiàng)至少包含用戶名、密碼、method屬性和action屬性。用戶名和密碼在登陸網(wǎng)站注冊(cè)時(shí)得到,method屬性和action屬性通過對(duì)登錄頁面進(jìn)行DOM解析也很容易得到,難點(diǎn)在于表單中其他元素的填寫,下面給出一種簡單有效的處理方法:
(1)標(biāo)簽中類型為“text”或“password”的標(biāo)記,若name屬性值為“user”或“username”,則將該標(biāo)簽的value屬性賦值為登錄用戶名;若name屬性值為“pass”、“passwd”、“pwd”或者“password”,則將該標(biāo)簽的value屬性賦值為登錄密碼。如標(biāo)簽的name屬性值不存在上述特征,則選擇第一個(gè)填寫登錄用戶名,第二個(gè)填寫登錄密碼。
(2)標(biāo)簽中類型為“radio”和“checkbox”的標(biāo)記,一般會(huì)有默認(rèn)選項(xiàng)(屬性checked的值是\"checked\"),可以通過DOM獲得其name屬性值和屬性為checked的value屬性值;若默認(rèn)的checked屬性不存在,選擇第一個(gè)value作為該的值。
(3)類型為“file”、“hidden”、“submit”的標(biāo)簽或標(biāo)簽,直接獲得其name屬性值和value屬性值共同組成
(4)
(5)
3.1.3 表單提交和結(jié)果判斷
表單自動(dòng)填寫后,即得到
服務(wù)器收到請(qǐng)求后,會(huì)向客戶端返回HTTP 響應(yīng)。一般情況下,登錄成功的標(biāo)志特征主要是服務(wù)器返回的狀態(tài)碼是“200 OK”并且頁面有關(guān)鍵字“登錄成功”、“歡迎回來”、“我的空間”、“我的消息”等字樣;登錄失敗的主要特征則是服務(wù)器返回狀態(tài)碼“400 Bad Request”或“403 Forbidden”或頁面包含關(guān)鍵字“登錄失敗”、“用戶名錯(cuò)誤”、“用戶不存在”、“您無權(quán)查看該帖子,請(qǐng)登錄”等。另外,還可用響應(yīng)報(bào)文頭部的“Set-Cookie”字段判定登錄狀態(tài)。圖 4給出了登錄結(jié)果判定樹。
3.1.4 Cookie的保存和更新
為提高抓取效率,登錄成功后,將Cookie保存在本地,爬蟲需要維護(hù)站點(diǎn)和Cookie間的對(duì)應(yīng)關(guān)系。當(dāng)對(duì)網(wǎng)站抓取時(shí),獲得相應(yīng)的Cookie值,為保證Cookie有效性,與服務(wù)器進(jìn)行交互后檢查Cookie有無更新以及是否失效。Cookie失效后,需重新登錄。
圖 4 登錄結(jié)果判定樹
Fig.4 Decision tree of login results3.2 AJAX網(wǎng)頁解析引擎
AJAX(Asynchronous JavaScript and XML)是一種基于用戶觸發(fā)事件驅(qū)動(dòng)的Web開發(fā)技術(shù),瀏覽器和服務(wù)器異步并行處理,這就使得傳統(tǒng)的基于協(xié)議驅(qū)動(dòng)的爬蟲不能獲得AJAX網(wǎng)頁或者實(shí)現(xiàn)AJAX網(wǎng)頁的正確解析,因而對(duì)采用AJAX技術(shù)構(gòu)造的BT發(fā)布站點(diǎn)(如BT@China聯(lián)盟),傳統(tǒng)爬蟲無法獲取種子。
對(duì)AJAX的處理主要是解析JavaScript代碼,處理相應(yīng)的事件,并抽取動(dòng)態(tài)內(nèi)容。支持AJAX解析的網(wǎng)絡(luò)爬蟲由互聯(lián)網(wǎng)中抓取原始網(wǎng)頁信息并對(duì)其執(zhí)行解析過程中,不但需要分析鏈接標(biāo)簽,還需要解析JavaScript代碼和引用的JS文件,如代碼中包含AJAX調(diào)用,則向服務(wù)器發(fā)送請(qǐng)求,將返回的結(jié)果與原始的HTML文檔進(jìn)行整合以得到目標(biāo)網(wǎng)頁,再從中提取新的鏈接和文本信息。實(shí)現(xiàn)AJAX網(wǎng)頁解析引擎的關(guān)鍵是設(shè)計(jì)研發(fā)一個(gè)JavaScript解析器。
對(duì)AJAX網(wǎng)頁的解析也可用HTML渲染引擎完整地解析頁面,但這樣抓取,其效率并不高。目前,也有一些開源的JavaScript解析引擎,如Google的V8 JavaScript Engine和Mozilla的Rihno,前者速度較快,但是資源占用率很高,后者速度較慢且功能不強(qiáng)。
本文設(shè)計(jì)的AJAX網(wǎng)頁解析引擎結(jié)構(gòu)如圖 5所示。
爬蟲對(duì)由互聯(lián)網(wǎng)抓到的原始網(wǎng)頁進(jìn)行網(wǎng)頁類型判別和初步網(wǎng)頁解析,將網(wǎng)頁中的JavaScript代碼緩存到臨時(shí)文件,同時(shí)解析并下載需要引用的JS文件且緩存到本地,調(diào)用JavaScript解析器對(duì)源代碼進(jìn)行詞法分析,形成單詞表;然后,進(jìn)行語法分析和語義校驗(yàn),依照J(rèn)avaScript語言的語法規(guī)則產(chǎn)生語法樹,經(jīng)過簡單校驗(yàn)后產(chǎn)生相應(yīng)的中間代碼,由控制器控制腳本解析器對(duì)代碼實(shí)現(xiàn)解釋并執(zhí)行,分析JavaScript代碼里的函數(shù)調(diào)用關(guān)系,確定哪些函數(shù)需要向服務(wù)器發(fā)送數(shù)據(jù)請(qǐng)求。執(zhí)行過程中,會(huì)由服務(wù)器返回相應(yīng)結(jié)果,若是一個(gè)新的頁面,則進(jìn)行同上處理,否則,將其與原始網(wǎng)頁中的HTML內(nèi)容一同生成目標(biāo)頁面,再將該還原后的目標(biāo)頁面送入DOM解析器完成解析,隨即由鏈接提取器從DOM提取外鏈接。
圖 5 AJAX網(wǎng)頁解析引擎示意圖
Fig.5 Sketch of AJAX page parsing engine4 降低種子獲取延時(shí)的技術(shù)
種子獲取延時(shí)是指從網(wǎng)站的種子更新,直到爬蟲獲取到該種子的時(shí)間間隔。該間隔可以反映所獲種子的新鮮程度,獲取延時(shí)越小,種子的新鮮程度越高。無論是設(shè)計(jì)BT搜索引擎,還是對(duì)種子進(jìn)行探測和Peer分析,種子的新鮮程度都是重要的決定性因素之一。
通過分析網(wǎng)站的組織結(jié)構(gòu),可以總結(jié)如下規(guī)律:
一個(gè)歷史頁面包含的鏈接更有可能是一個(gè)更久以前的網(wǎng)頁,而網(wǎng)站的主頁或者重要的索引頁包含的鏈接則更有可能是一些新加入的鏈接。
BT種子爬蟲的目標(biāo)是盡可能早地抓取新增種子文件(爬蟲開始抓取之后,網(wǎng)站新增的種子),盡可能全面和快速地抓取到歷史種子(爬蟲開始抓取之前已經(jīng)存在的種子)。為實(shí)現(xiàn)這一目標(biāo),要區(qū)別對(duì)待歷史種子和新增種子,遂由此提出了如下的爬蟲策略。
4.1 批量抓取和增量抓取相結(jié)合的數(shù)據(jù)抓取機(jī)制
為保證數(shù)據(jù)的新鮮度,對(duì)于歷史種子和新增種子,需要分別采用各自不同的抓取策略。
對(duì)于歷史種子,采用批量抓取方式,由獲得的頁面中解析有關(guān)鏈接并寫入爬蟲抓取數(shù)據(jù)庫,再根據(jù)一定的URL抓取任務(wù)生成策略,生成新的抓取列表。每個(gè)網(wǎng)頁只抓取一次,繼續(xù)如上的抓取過程,直到網(wǎng)站中所有頁面都已經(jīng)實(shí)現(xiàn)了抓取為止。
對(duì)于新增種子,采用增量抓取方式,抓取起點(diǎn)選擇網(wǎng)站主頁和頁面變化較快的網(wǎng)頁,BT種子發(fā)布站點(diǎn)可選擇其首頁或主要索引頁,BT發(fā)布論壇則可選擇論壇各版塊前幾頁,并以一定的時(shí)間間隔對(duì)其重復(fù)抓取,將解析得到的鏈接與已有鏈接相比較,若為新增鏈接,則執(zhí)行抓取并實(shí)現(xiàn)解析。
對(duì)更新頻繁的BT發(fā)布站點(diǎn),設(shè)置較短的增量抓取時(shí)間間隔,而對(duì)更新較慢的站點(diǎn),則可設(shè)置較長的時(shí)間間隔。在這段時(shí)間內(nèi),新增鏈接數(shù)量常常都是有限的,即使是更新較快的網(wǎng)站如Mininova,每小時(shí)新增鏈接數(shù)通常也不會(huì)超過2 000,因此,可對(duì)每層抓取的頁面數(shù)進(jìn)行限定,以稍大于增量抓取時(shí)間間隔與網(wǎng)站更新頻率的乘積為宜。通常,新增種子的鏈接深度不會(huì)超過4層,因此,增量抓取深度限制在3~5層即可。
4.2 歷史數(shù)據(jù)和更新數(shù)據(jù)相結(jié)合的數(shù)據(jù)存儲(chǔ)機(jī)制
抓取新增種子時(shí),需要快速檢索和比對(duì)當(dāng)前URL是否已抓取過,而抓取歷史種子時(shí),則會(huì)存儲(chǔ)數(shù)量巨大的URL,鑒于兩種狀況下的URL相互獨(dú)立,統(tǒng)一存儲(chǔ)則影響查找效率,因而分別設(shè)計(jì)了歷史數(shù)據(jù)庫(History Torrents Crawldb)和更新數(shù)據(jù)庫(New Torrents Crawldb)用來存儲(chǔ)抓取過程中的頁面信息、URL信息和狀態(tài)信息,并分別采用不同的URL任務(wù)選擇機(jī)制生成爬行隊(duì)列。歷史數(shù)據(jù)庫和更新數(shù)據(jù)庫中URL的時(shí)序關(guān)系如圖 6所示,圖中以爬蟲開始運(yùn)行的時(shí)刻作為0時(shí)刻,D和L分別是新增種子i和歷史種子j的獲取延時(shí)。
圖 6 歷史數(shù)據(jù)庫和更新數(shù)據(jù)庫中URL的時(shí)序關(guān)系
Fig.6 Relationship of time series between history
Torrents crawldb and new torrents crawldb 為了減少因種子更新多發(fā)且頻繁,以及爬蟲性能無法滿足對(duì)更新數(shù)據(jù)抓取的需求而造成的較大抓取延時(shí),在增量抓取的基礎(chǔ)上,又增加了定時(shí)數(shù)據(jù)更新,即經(jīng)過一定的時(shí)間間隔強(qiáng)制爬蟲將增量抓獲的網(wǎng)頁寫入更新數(shù)據(jù)庫,并檢查網(wǎng)站主頁和主要索引頁。
定時(shí)更新可能導(dǎo)致一些新增種子未被爬蟲獲取,為解決該問題,將更新數(shù)據(jù)庫定期融合到歷史數(shù)據(jù)庫中,因而漏抓的種子可作為歷史種子進(jìn)行抓取。
4.3 BT爬蟲的URL抓取隊(duì)列選擇策略
由圖 6及前文所述的規(guī)律,將歷史數(shù)據(jù)庫和更新數(shù)據(jù)庫中同一個(gè)站點(diǎn)的URL按照時(shí)間實(shí)現(xiàn)排序,而為盡快獲取新增種子,就應(yīng)從更新數(shù)據(jù)庫中選擇獲取時(shí)間最晚的N個(gè)URL構(gòu)成抓取隊(duì)列,交由抓取新增種子的線程完成抓??;而為更多地獲取歷史種子,則應(yīng)從更新數(shù)據(jù)庫中選擇獲取時(shí)間最早的M個(gè)URL構(gòu)成抓取隊(duì)列,并由抓取歷史種子的線程進(jìn)行抓取。
4.4 動(dòng)態(tài)任務(wù)調(diào)整策略
理想情況下,BT爬蟲對(duì)一個(gè)站點(diǎn)的爬行過程可敘述為:開始一段時(shí)間內(nèi),爬蟲獲取種子的速率會(huì)有一個(gè)急速的上升過程,而后逐漸趨于穩(wěn)定,該穩(wěn)定值是由爬蟲性能、網(wǎng)絡(luò)帶寬和網(wǎng)站組織結(jié)構(gòu)而共同決定的;隨著對(duì)站點(diǎn)已抓取網(wǎng)頁數(shù)量的增加,未抓取的種子越來越少,爬蟲的獲取速度最終將穩(wěn)定于網(wǎng)站的種子更新速度。因此,初始時(shí),需要分配更多的資源抓取歷史種子,而隨著獲取的種子越來越多,歷史種子越來越少,為進(jìn)一步縮減抓取更新延時(shí),需將更多的資源用來抓取新種子,同時(shí)相應(yīng)減少定時(shí)更新的時(shí)間間隔以盡快發(fā)現(xiàn)新增種子。
5 實(shí)驗(yàn)評(píng)價(jià)
本文基于MapReduce模型[14]實(shí)現(xiàn)了一個(gè)分布式并行BT種子爬蟲系統(tǒng),由4臺(tái)曙光天闊I610r-FQ服務(wù)器(CPU:Intel XEON E5440 2.82G ×2,內(nèi)存:DDR2 2G×2)組成測試系統(tǒng)。受實(shí)驗(yàn)網(wǎng)絡(luò)最大可用帶寬1Mbps的限制,實(shí)時(shí)更新線程數(shù)和深層抓取線程數(shù)分別設(shè)為5和10,定時(shí)更新和實(shí)時(shí)更新的時(shí)間間隔分別為1天和3小時(shí)。
用覆蓋率、抓取速率和種子新鮮度來評(píng)價(jià)一個(gè)BT種子爬蟲的性能。其中,覆蓋率反映了爬蟲獲取種子的數(shù)量,速率表示了爬蟲獲取種子的速度,種子新鮮度則用來衡量爬蟲能否及時(shí)獲取網(wǎng)站新增的種子。
5.1 覆蓋率
由于網(wǎng)站按種子特征值去重后的種子數(shù)NI無法精確獲得的特質(zhì),其實(shí)際值不會(huì)超過網(wǎng)站所包含的種子個(gè)數(shù)NT,因此,本文使用NT替代NI計(jì)算覆蓋率。BT種子發(fā)布網(wǎng)站的種子數(shù)NT按如下公式估算:
NT=IndexPageNumber × TorrentsPerPage
+ TorrentsUpdated + TorrentsInvalid
(2)
IndexPageNum為索引頁面數(shù),TorrentsPerPage為每頁種子數(shù),TorrentsUpdated為獲取時(shí)間內(nèi)種子更新數(shù),TorrentsInvalid為獲取時(shí)間內(nèi)種子失效數(shù)。
以BT@China聯(lián)盟的動(dòng)漫索引頁(http://bt2.btchina.net/?categoryid=4)為例,本文測試了爬蟲覆蓋率,該網(wǎng)站采用AJAX技術(shù)實(shí)現(xiàn),普通爬蟲無法從該網(wǎng)站獲取種子。該站點(diǎn)共有75個(gè)索引頁,每個(gè)索引頁有100種子,在爬蟲系統(tǒng)運(yùn)行的時(shí)間段內(nèi),種子失效數(shù)是0,種子更新數(shù)是這段時(shí)間內(nèi)索引頁面上增加的種子個(gè)數(shù)。為去除網(wǎng)絡(luò)狀況對(duì)系統(tǒng)的影響測試了三次,根據(jù)式(1)和式(2)計(jì)算爬蟲對(duì)該網(wǎng)站覆蓋率,結(jié)果如表 2所示。
表 2 爬蟲對(duì)BT@China聯(lián)盟動(dòng)漫索引頁覆蓋率
Tab.2 Coverage of BT@China animation index pages
次數(shù)
網(wǎng)站種子數(shù)
獲取種子數(shù)
網(wǎng)站覆蓋率
1
7 589
6 313
83.16%
2
7 633
6 129
80.30%
3
7 745
6 438
83.12%
再以瘋狂音樂聯(lián)盟的BT發(fā)布區(qū)(http://www.btcrazy.com/bbs/index.php?gid=203)為例測試了覆蓋率,該站點(diǎn)只有登錄才能夠下載種子。經(jīng)不完全統(tǒng)計(jì),該站點(diǎn)中1 661個(gè)種子,通過自動(dòng)登錄,爬蟲獲得了1 477個(gè)種子,覆蓋率達(dá)到了88.92%。
可以看出,爬蟲自動(dòng)登錄技術(shù)和AJAX網(wǎng)頁解析技術(shù)能夠使爬蟲抓取那些原本無法獲取的信息。BT@China聯(lián)盟的覆蓋率不高,其原因是由于該站點(diǎn)還加入了驗(yàn)證碼機(jī)制,這將是本系統(tǒng)未來的攻克重心。而影響瘋狂音樂聯(lián)盟覆蓋率的因素則主要是,一些帖子需要回復(fù)后才能夠下載種子文件。事實(shí)上,去重后的種子數(shù)小于網(wǎng)站所包含的種子個(gè)數(shù),因此實(shí)際的覆蓋率會(huì)更高一些。
5.2 新鮮度
本文選取http://www.mininova.org/作為示例,該網(wǎng)站種子更新頻率較快、更新種子數(shù)較多且種子下載鏈接按時(shí)間順序遞增。在系統(tǒng)實(shí)現(xiàn)中保存種子文件獲取的鏈接和獲取時(shí)間,通過對(duì)比來確定抓取到種子的新鮮度。在對(duì)比實(shí)現(xiàn)過程中,種子獲取延時(shí)的實(shí)驗(yàn)結(jié)果如圖7所示。系統(tǒng)采用30個(gè)線程實(shí)現(xiàn)抓取更新,每隔1小時(shí)自動(dòng)增量更新一次,連續(xù)抓取24小時(shí),共獲得2 312個(gè)種子。
圖 7 種子獲取延時(shí)
Fig.7 Delay of acquiring torrents 圖7中,實(shí)線代表改進(jìn)前系統(tǒng)對(duì)每個(gè)種子的獲取延時(shí),而虛線則代表采用第4節(jié)提出的數(shù)據(jù)抓取機(jī)制和數(shù)據(jù)存儲(chǔ)機(jī)制進(jìn)行改進(jìn)后的獲取延時(shí)??梢钥闯觯帽疚姆椒@著降低了種子獲取延時(shí),提高了種子的新鮮度。
5.3 系統(tǒng)效率
文中對(duì)開源搜索引擎Nutch進(jìn)行了改進(jìn)使其可以抓取種子文件,并與BT種子爬蟲進(jìn)行對(duì)比。實(shí)驗(yàn)中選取5Q地帶和冰魚綜藝聯(lián)盟BT站(http://bt.icefish.org/)進(jìn)行全站點(diǎn)種子抓取,這兩個(gè)站點(diǎn)均不需要進(jìn)行AJAX解析和登錄即可抓取種子。初始5Q地帶有6 100個(gè)種子,冰魚綜藝聯(lián)盟有1 380個(gè)種子,獲取期間共新增種子64個(gè),失效種子4個(gè),由式(2)計(jì)算抓取期間站點(diǎn)種子總數(shù)NI為7 548。分別測試了1、2、3個(gè)節(jié)點(diǎn)集群運(yùn)行時(shí)獲取種子數(shù)TN、獲取網(wǎng)頁數(shù)P、峰值獲取速度MPR和MBR、獲取用時(shí)T。并計(jì)算出平均網(wǎng)頁獲取速度AV、平均種子獲取速度ATV、系統(tǒng)收獲率HR以及覆蓋率CR。其中,AV = P/T,ATV = TN/T,HR = TN/P,覆蓋率則由式(1)進(jìn)行計(jì)算。將BT爬蟲與Nutch性能比較結(jié)果值列成表格,具體如表3所示。
將BT爬蟲與Nutch系統(tǒng)在收獲率和覆蓋率方面的實(shí)驗(yàn)比較結(jié)果以圖線表示,如圖8所示。
表 3 BT 爬蟲與Nutch性能比較結(jié)果
Tab.3 Performance comparison of BT Crawler
and Nutch
圖 8 BT爬蟲與Nutch收獲率和覆蓋率對(duì)比
Fig.8 CR and HR of BT Crawler and Nutch 將BT爬蟲與Nutch平均種子獲取速度實(shí)驗(yàn)對(duì)比結(jié)果描繪為圖線,如圖9所示。
圖 9 BT爬蟲與Nutch平均種子獲取速度對(duì)比
Fig.9 Comparison of speed between
BT Crawler and Nutch 由表3及圖 8、圖 9可以看出,BT爬蟲擁有較高收獲率,可以大幅減少無關(guān)網(wǎng)頁的抓取,且隨著節(jié)點(diǎn)數(shù)增加,系統(tǒng)性能增長基本為線性,并具有較好的加速比。與Nutch相比,BT爬蟲具有更高的平均種子獲取速度和種子覆蓋率。
6 結(jié)束語
本文提出的基于特征的種子文件識(shí)別方法具有高效性和準(zhǔn)確性,而基于Hash的種子文件去重機(jī)制就可大幅減少重復(fù)網(wǎng)頁、降低種子文件對(duì)系統(tǒng)效率的影響和由其帶來的存儲(chǔ)開銷,還有基于正則表達(dá)式規(guī)則的URL過濾技術(shù)則可明顯提高種子獲取速度。另外,本文解決了爬蟲自動(dòng)登錄和AJAX網(wǎng)頁解析問題,提高了覆蓋率,同時(shí)為降低種子文件獲取延時(shí),也提出了一系列的實(shí)施機(jī)制和策略。通過實(shí)驗(yàn)證明了這些方法在提高種子新鮮度方面效果顯著。但是正如本文提到的,BT種子文件在獲取爬蟲今后的研究中需要解決驗(yàn)證碼識(shí)別、論壇自動(dòng)回復(fù)等一系列提高覆蓋率的相關(guān)問題,以及并行抓取、DNS緩存、系統(tǒng)部署等提高抓取速率和提高系統(tǒng)實(shí)用性的相關(guān)問題。
參考文獻(xiàn):
[1]http://www.bittorrent.org/introduction.html
[2]CHAKRABARTI S, VAN DEN BERG M, DOM B. Focused crawling: a new approach for topic-specific resource discovery[C]//Proceedings of the 8th International conference on World Wide Web, Toronto, Canada, 1999:1623-1640.
[3]SOHRAB K. An investigation into a java based torrent search engine[D]. London: University of East London, 2008.
[4]CHUNG Y. Torrent crawler: a tool for collecting information from BitTorrent networks. http://www.cs.cornell.edu/Courses/cs6464/2009sp/projects/yc336/final_doc.pdf
[5]肖建勇, 張武生. Clair:一種基于P2P的BitTorrent關(guān)鍵詞檢索系統(tǒng)[J]. 計(jì)算機(jī)工程與應(yīng)用, 2006, 18: 139-142.
[6]方啟明, 楊廣文,等. 面向P2P搜索的可定制聚焦網(wǎng)絡(luò)爬蟲[J]. 華中科技大學(xué)學(xué)報(bào)(自然科學(xué)版), 2007, 35: 148-152.
[7]SU C, GAO Y, YANG J M, et al. An efficient adaptive focused crawler based on ontology learning[C]//Fifth International Conference on Hybrid Intelligent Systems, Rio de Janeiro, Brazil, 2005:73-78.
[8]DUDA C, FRAY G, KOSSMANN D, et al. AJAX crawl:making AJAX applications searchable[C]//Proceedings of the 2009 IEEE International Conference on Data Engineering, Shanghai, China, 2009:78-89.
[9]COHEN B. BitTorrent protocol specification V11031.http://www.bittorrent.org/beps/bep_0003.html
[10]NOVAK B. A survey of focused web crawling algorithms[C]//Conference On Data Mining and Warehouses(SIKDD 2004), Ljubljana, Slovenia, 2004.
[11]DILIGENTI M, COETZEE F, LAWRENCE S, et al. Focused crawling using context graphs[C]// Proceeding of the 26th International Conference on VLDB, Cairo, Egypt,2000:527-534.
[12]TAN Q Z, MITRA P, GILES C L. Designing clustering-based web crawling policies for search engine crawlers[C]//Proceedings of the 6th ACM conference on Information and Knowledge Management, Lisbon, Portugal, 2007:535-544.
[13]ALTINGOVDE I S, ULUSOY O.Exploiting interclass rules for focused crawling[J].IEEE Intelligent Systems,2004,19(6):66-73.
[14]DEAN P, GHEMAWAT S. MapReduce. Simplified data processing on large clusters[J]. Communications of the ACM, 2008, 51(1):107-113.