孫龍,李彥
(1.四川大學計算機學院,成都 610065;2.四川大學制造學院,成都 610065)
基于AJAX的深網爬蟲設計
孫龍1,李彥2
(1.四川大學計算機學院,成都 610065;2.四川大學制造學院,成都 610065)
AJAX技術廣泛應用在深網中,要實現對深網的AJAX頁面數據采集,爬蟲技術將面臨新的挑戰。在研究如何發現網頁中包含超鏈接標簽、AJAX事件的爬取元素,并有效遍歷由事件觸發的AJAX響應信息的基礎上,提出一種AJAX深網狀態模型,設計爬取算法。并通過實驗驗證該爬蟲模型能夠有效提升實現AJAX深網的爬取的覆蓋率。
深網(Deep Web),也稱隱形網絡(Invisible Web),或隱藏網絡(Hidden Web),是萬維網的一部分,其內容因種種原因無法被標準搜索引擎索引到。與深層網絡相反的術語是表層網絡。大量Web信息深埋于網站之下,傳統的搜索引擎無法尋找它們,發現它們,取回深網之中的內容,被傳統搜索引擘索引的那部分只是表層網絡。無法測量和嚴格估計的深網的大小,因為大多數的信息被隱藏或鎖定在數據庫內。早期的估算表明,深網的信息要比表層網絡大幾個數量級,深網是400倍至550倍大于表層網,其大小約有7.5PB[1]。然而,由于不斷有更多的信息和網站被添加,可以估算深網應是以指數級的數量成倍增長。隨著AJAX技術的不斷發展,越來越多的深網采取了這一技術。AJAX深網的爬取也逐漸成為學者研究的一個熱點。
網絡爬蟲也被稱作網絡蜘蛛[2],或自動網絡索引[3],是一個自動提取網頁的程序,它為搜索引擎從萬維網上下載網頁,是搜索引擎的重要組成。
網絡爬蟲一般從一個URL列表中開始抓取,這個列表稱作種子。當爬蟲讀取這些列表時,它會識別出URL列表中網頁所包含的超鏈接并將其添加到要爬取的隊列中,稱為爬取邊界。爬取邊界的URL會按照規定策略遞歸地進行訪問。聚焦爬蟲的工作流程較為復雜,需要根據一定的網頁分析算法過濾與主題無關的鏈接,保留有用的鏈接并將其放入等待抓取的URL隊列。然后,它將根據一定的搜索策略從隊列中選擇下一步要抓取的網頁URL,并重復上述過程,直到達到系統的某一條件時停止。如果爬蟲正在進行網站文檔獲取,它會將其訪問過的網頁進行復制和保存。另外,所有被爬蟲抓取過的網頁將會被系統存貯,進行一定的分析、過濾,并建立索引,以便之后的查詢和檢索。這些經常存儲在網站上以被查看、閱讀和導航的文檔,會被以“快照”的方式進行保存到本地[4]。歸檔被稱為倉儲,用來存儲和管理網頁的集合。倉庫只存儲HTML頁,這些頁被存儲為不同的文件,倉儲庫與存儲數據的其他系統類似,就像現代數據庫一樣。唯一不同的是,倉儲庫不需要數據庫系統提供的所有功能。倉儲庫存儲由爬蟲檢索的網頁的最新版本[5]。
雖然無法直接發現特定的網站服務的內容,以便可以對其建立索引,但這個網站可以可能通過間接的方式進行訪問。為了發現網站內容,淺網采取的搜索引擎從已知協議的虛擬端口號跟蹤超鏈接的技術,對于深網內容基本無效。舉例說,這些爬蟲不會去嘗試發現AJAX結果生成的動態頁面。深網爬取也成倍增加了待爬取的網頁鏈接,一些爬蟲只從網頁代碼中形如<a href="URL">取出一部分URL。其中通過AJAX生成的頁面會給爬蟲帶來問題。在這方面學者已有一些研究,陸亮等采取rhino組件實現了一個AJAX爬蟲[6],以分析JavaScript代碼來獲取URL,但該設計中缺乏對頁面狀態的遍歷,爬取AJAX內容十分有限;郭津丞等提出了一個用WebKit模擬JavaScript動作的爬蟲模型[7],但該模型在摸擬AJAX事件觸發機制還比較欠缺。要解決好AJAX深網的內容爬取,必須將網頁狀態遍歷,事件觸發,XML解析技術有機融合,才能有效實現更大范圍的內容覆蓋和更高的爬取效率。
與靜態網頁相比,AJAX網頁是在靜態網頁的基礎上,通過JavaScript實現網頁內容的動態變化。靜網頁一般通過一系列<a href=’XXXXX’>超鏈接到其他網頁,而AJAX網頁可以通過通定義各種事件實現同一網頁內容的變化,或者到其他網頁的跳轉。
為了實現對AJAX的爬取,我們需要針對AJAX網頁建立相應的模型。一個網站的狀態模型可以用下述元組表示:
<Dom,element,event,action>
Dom表示網頁對象模型結構
Element網頁內的各種元素,名稱及狀態屬性;
Event綁定于元素的事件
Action事件觸發后,網站相應的操作
在爬取過程中,由于事件的觸發,dom相應發生更新,element元素發達變化,包括新的元素,以及元素新的狀態,與綁定的事件又形成了新元組。我們將上述元組中element元素組以<name,status>表示,則可以用<name,status,event,action>簡潔而唯一地標示出包含狀態的動作元素,本文以actionlist命名。
爬取AJAX相應的算法也可描述為:
第一步:從爬取隊列中指定鏈接;將提取URL作為crawler任務線程準備加入到事件隊列。
第二步,若事件隊列是超鏈接,則抓取新的網頁,生成dom;若是AJAX事件,則觸發AJAX事件并獲取響應內容,刷新dom;
第三步,對dom的元素進行解析,根據網頁的超鏈接、綁定AJAX事件的元素,元素的狀態,生成元組。
第四步,遍歷元組,由相應的element,及event,對應生成actionlist;
第五步,若未達到最大爬取深度,則將actionlist進行去重處理,并加入爬取隊列;
第六步,按此過程進行新一輪的迭代。繼續轉之前爬取步驟。
具體實現為:

其主要功能介紹:addactionlist添加動作,動作隊列actionlists存儲網頁事件動成作隊列,根據事件動作隊列,生成相應爬取任務,啟動fecher抓取相關網頁。在整個抓取過程中,根據動作元組hash,對網址進行去重處理duplicate removal。去重之后的網頁進行解析,并存儲。抓取的過程中也根據網頁含的鏈接、事件動作,更新actionlist,進行廣度遍歷。Fetcher內部采用生產者消費者模式,QueueFeeder線程不斷從Generator中獲取抓取任務,FetcherThread則負責消費這些任務-抓取頁面。
在這些包中,crawler和fecher包是整個爬取系統的核心功能包,其中,crawler包調用fecher抓取頁面,從頁面中提取鏈接,生成種子,注入種子到抓取隊列,fecher從種子隊列中取出種子,執行抓取任務。兩個模塊的主要功能如圖1所示。

圖1 Crawler主要功能示意圖
我們將該爬蟲與常規爬蟲在實驗環境中進行了比較,以Tomcat服務器,用JSP+AJAX從數據庫生成動態網頁,我們采取httpclient+htmlunit+Selenium組件,從各大專利網站以廣度優先方式進行爬取,以網站域名和專利類別索引為單位來切分爬取工作,每個分類對應一個map任務。系統要維護一個全局一索引表,用來記錄哪些url已經爬取過,哪些尚未爬取,哪些正在爬取。這樣可以實現在hadoop上的分布式知識爬取目標。并與傳統爬蟲heritrix進行了比較。
從表1中可以看出,相對較傳統爬蟲,AJAX爬蟲能夠在AJAX動態網頁上爬取更多的網頁內容。分析其原因,傳統的爬蟲(如heritrix)僅能從單一的<a href=..>標簽中去判斷下一步要抓取的隊列。而AJAX爬蟲可以從網頁中所有的元素綁定的事件中去觸發下一步抓取的隊列。因此,其抓取范圍和內容遠大于普通爬蟲。另外,AJAX爬蟲的抓取速度又遠低于傳統抓蟲,其原因于,AJAX爬蟲需要解析綁定JavaScript事件的所有網頁元素,傳統爬蟲僅需解析單一的超鏈接標簽;AJAX爬蟲還需要通過模擬組件httpclient+html?unit+Selenium來模擬對AJAX事件的觸發,十分耗時;傳統爬蟲則直接用http get命令去下載url的內容,相對快得多。

表1 爬蟲性能比較
[1]Bergman,Michael K(August 2001).The Deep Web:Surfacing Hidden Value.The Journal of Electronic Publishing.7(1)。
[2]Spetka,Scott.The TkWWW Robot:Beyond Browsing.NCSA.Archived from the Original on 3 September,2004.
[3]Kobayashi,M.&Takeda,K.(2000).Information Retrieval on the Web.ACM Computing Surveys.ACM Press,32(2):144-173.
[4]Masanès,Julien(February 15,2007).Web Archiving.Springer.p.1.ISBN 978-3-54046332-0.
[5]Patil,Yugandhara et al.(2016).Review of Web Crawlers with Specification and Working.International Journal of Advanced Research Computer and Communication Engineering,5(1):4.
[6]陸亮,李東.支持AJAX的網絡爬蟲設計與實現[J].智能計算機與應用,2013(06):57-59+62
[7]郭津丞,馮超,張磊.基于WebKit的網絡爬蟲[J].現代電子技術,2013(18):62-64.
Design of Deep Web Crawler Based on AJAX
SONG Long1,LI Yan2
(1.CollegeofComputerScience,Sichuan University,Chengdu 610065;2.CollegeofManufacturing,SichuanUniversity,Chengdu 610065)
AJAX technology is widely used in the deep network,yet implementing the data acquisition of the AJAX pages of the deep web by the web crawler technology faces huge challenges.On the basis of studying how to find the hyperlink information in the webpage,and effectively tra?versing the event triggered Ajax response information,proposes a AJAX deep web state model and designs a crawling algorithm.Experi?ments show that the crawler model can effectively enhance the coverage rate of AJAX deep web crawling.
爬蟲;AJAX;搜索引擎
1007-1423(2017)28-0072-04
10.3969/j.issn.1007-1423.2017.28.019
孫龍(1975-),男,四川巴中人,研究方向為軟件工程、人工智能
2017-08-01
2017-09-25
Crawler;AJAX;Search Engine