爬蟲
自動獲取網頁內容的程序
網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
隨著網路的迅速發展,萬維網成為大量信息的載體,如何有效地提取並利用這些信息成為一個巨大的挑戰。搜索引擎(Search Engine),例如傳統的通用搜索引擎AltaVista,Yahoo!和Google等,作為一個輔助人們檢索信息的工具成為用戶訪問萬維網的入口和指南。但是,這些通用性搜索引擎也存在著一定的局限性,如:
(1)不同領域、不同背景的用戶往往具有不同的檢索目的和需求,通用搜索引擎所返回的結果包含大量用戶不關心的網頁。
(2)通用搜索引擎的目標是儘可能大的網路覆蓋率,有限的搜索引擎伺服器資源與無限的網路數據資源之間的矛盾將進一步加深。
(3)萬維網數據形式的豐富和網路技術的不斷發展,圖片、資料庫、音頻、視頻多媒體等不同數據大量出現,通用搜索引擎往往對這些信息含量密集且具有一定結構的數據無能為力,不能很好地發現和獲取。
(4)通用搜索引擎大多提供基於關鍵字的檢索,難以支持根據語義信息提出的查詢。
為了解決上述問題,定向抓取相關網頁資源的聚焦爬蟲應運而生。聚焦爬蟲是一個自動下載網頁的程序,它根據既定的抓取目標,有選擇的訪問萬維網上的網頁與相關的鏈接,獲取所需要的信息。與通用爬蟲(general purpose web crawler)不同,聚焦爬蟲並不追求大的覆蓋,而將目標定為抓取與某一特定主題內容相關的網頁,為面向主題的用戶查詢準備數據資源。
1 聚焦爬蟲工作原理以及關鍵技術概述
爬蟲[自動獲取網頁內容的程序]
相對於通用網路爬蟲,聚焦爬蟲還需要解決三個主要問題:
(1)對抓取目標的描述或定義;
(2)對網頁或數據的分析與過濾;
(3)對URL的搜索策略。
截止到2007年底,Internet上網頁數量超出160億個,研究表明接近30%的頁面是重複的;動態頁面的存在:客戶端、伺服器端腳本語言的應用使得指向相同Web信息的URL數量呈指數級增長。上述特徵使得網路爬蟲面臨一定的困難,主要體現在Web信息的巨大容量使得爬蟲在給定時間內只能下載少量網頁。Lawrence和Giles的研究表明沒有哪個搜索引擎能夠索引超出16%的Internet上Web頁面,即使能夠提取全部頁面,也沒有足夠的空間來存儲。
為提高爬行效率,爬蟲需要在短時間內儘可能多多地取高質量頁面,是它面臨的難題之一。當前有五種表示頁面質量高低的方式:Similarity(頁面與爬行主題之間的相似度)、Backlink(頁面在Web圖中的入度大小)、PageRank(指向它的所有頁面平均權值之和)、Forwardlink(頁面在Web圖中的出度大小)、Location(頁面的信息位置);Parallel(并行性問題)。為了提高爬行速度,網路通常會採取并行爬行的工作方式,隨之引入了新的問題:重複性(并行運行的爬蟲或爬行線程同時運行時增加了重複頁面)、質量問題(并行運行時,每個爬蟲或爬行線程只能獲取部分頁面,導致頁面質量下降)、通信帶寬代價(并行運行時,各個爬蟲或爬行線程之間不可避免要進行一些通信)。并行運行時,網路爬蟲通常採用三種方式:獨立方式(各個爬爬蟲都有獨立行頁面,互不通信)、動態分配方式(由一個中央協調器動態協調分配URL各個個爬蟲)、靜態分配方式(URL事先劃分給各個爬蟲)。
網路爬蟲按照系統結構和實現技術,大致可以分為以下幾種類型:通用網路爬蟲(General Purpose Web Crawler)、聚焦網路爬蟲(Focused Web Crawler)、增量式網路爬蟲(Incremental Web Crawler)、深層網路爬蟲(Deep Web Crawler)。實際的網路爬蟲系統通常是幾種爬蟲技術相結合實現的。
通用網路爬蟲
通用網路爬蟲又稱全網爬蟲(Scalable Web Crawler),爬行對象從一些種子URL擴充到整個Web,主要為門戶站點搜索引擎和大型Web服務提供商採集數據。由於商業原因,它們的技術細節很少公布出來。這類網路爬蟲的爬行範圍和數量巨大,對於爬行速度和存儲空間要求較高,對於爬行頁面的順序要求相對較低,同時由於待刷新的頁面太多,通常採用并行工作方式,但需要較長時間才能刷新一次頁面。雖然存在一定缺陷,通用網路爬蟲適用於搜索引擎搜索廣泛的主題,有較強的應用價值。
通用網路爬蟲的結構大致可以分為頁面爬行模塊、頁面分析模塊、鏈接過濾模塊、頁面資料庫、URL隊列、初始URL集合幾個部分。為提高工作效率,通用網路爬蟲會採取一定的爬行策略。常用的爬行策略有:深度優先策略、廣度優先策略。
1)深度優先策略:其基本方法是按照深度由低到高的順序,依次訪問下一級網頁鏈接,直到不能再深入為止。爬蟲在完成一個爬行分支后返回到上一鏈接節點進一步搜索其它鏈接。當所有鏈接遍歷完后,爬行任務結束。這種策略比較適合垂直搜索或站內搜索,但爬行頁面內容層次較深的站點時會造成資源的巨大浪費。
2)廣度優先策略:此策略按照網頁內容目錄層次深淺來爬行頁面,處於較淺目錄層次的頁面首先被爬行。當同一層次中的頁面爬行完畢后,爬蟲再深入下一層繼續爬行。這種策略能夠有效控制頁面的爬行深度,避免遇到一個無窮深層分支時無法結束爬行的問題,實現方便,無需存儲大量中間節點,不足之處在於需較長時間才能爬行到目錄層次較深的頁面。
聚焦網路爬蟲
聚焦網路爬蟲(Focused Crawler),又稱主題網路爬蟲(Topical Crawler),是指選擇性地爬行那些與預先定義好的主題相關頁面的網路爬蟲。和通用網路爬蟲相比,聚焦爬蟲只需要爬行與主題相關的頁面,極大地節省了硬體和網路資源,保存的頁面也由於數量少而更新快,還可以很好地滿足一些特定人群對特定領域信息的需求。
聚焦網路爬蟲和通用網路爬蟲相比,增加了鏈接評價模塊以及內容評價模塊。聚焦爬蟲爬行策略實現的關鍵是評價頁面內容和鏈接的重要性,不同的方法計算出的重要性不同,由此導致鏈接的訪問順序也不同。
1)基於內容評價的爬行策略:DeBra將文本相似度的計算方法引入到網路爬蟲中,提出了Fish Search演演算法,它將用戶輸入的查詢詞作為主題,包含查詢詞的頁面被視為與主題相關,其局限性在於無法評價頁面與主題相關度的高低。Herseovic對Fish Search演演算法進行了改進,提出了Sharksearch演演算法,利用空間向量模型計算頁面與主題的相關度大小。
2)基於鏈接結構評價的爬行策略:Web頁面作為一種半結構化文檔,包含很多結構信息,可用來評價鏈接重要性。PageRank演演算法最初用於搜索引擎信息檢索中對查詢結果進行排序,也可用於評價鏈接重要性,具體做法就是每次選擇PageRank值較大頁面中的鏈接來訪問。另一個利用Web結構評價鏈接價值的方法是HITS方法,它通過計算每個已訪問頁面的Authority權重和Hub權重,並以此決定鏈接的訪問順序。
3)基於增強學習的爬行策略:Rennie和McCallum將增強學習引入聚焦爬蟲,利用貝葉斯分類器,根據整個網頁文本和鏈接文本對超鏈接進行分類,為每個鏈接計算出重要性,從而決定鏈接的訪問順序。
4)基於語境圖的爬行策略:Diligenti等人提出了一種通過建立語境圖(Context Graphs)學習網頁之間的相關度,訓練一個機器學習系統,通過該系統可計算當前頁面到相關Web頁面的距離,距離越近的頁面中的鏈接優先訪問。印度理工大學(IIT)和IBM研究中心的研究人員開發了一個典型的聚焦網路爬蟲。該爬蟲對主題的定義既不是採用關鍵詞也不是加權矢量,而是一組具有相同主題的網頁。它包含兩個重要模塊:一個是分類器,用來計算所爬行的頁面與主題的相關度,確定是否與主題相關;另一個是凈化器,用來識別通過較少鏈接連接到大量相關頁面的中心頁面。
增量式網路爬蟲
增量式網路爬蟲(Incremental Web Crawler)是指指已下載網網頁取增量式更新和只爬行新產生的或者已經發生變化網頁的爬蟲,它能夠在一定程度上保證所爬行的頁面是儘可能新的頁面。和周期性爬行和刷新頁面的網路爬蟲相比,增量式爬蟲只會在需要的時候爬行新產生或發生更新的頁面,並不重新下載沒有發生變化的頁面,可有效減少數據下載量,及時更新已爬行的網頁,減小時間和空間上的耗費,但是增加了爬行演演算法的複雜度和實現難度。增量式網路爬蟲的體系結構[包含爬行模塊、排序模塊、更新模塊、本地頁面集、待爬行URL集以及本地頁面URL集。
增量式爬蟲有兩個目標:保持本地頁面集中存儲的頁面為最新頁面和提高本地頁面集中頁面的質量。為實現第一個目標,增量式爬蟲需要通過重新訪問網頁來更新本地頁面集中頁面內容,常用的方法有:1)統一更新法:爬蟲以相同的頻率訪問所有網頁,不考慮網頁的改變頻率;2)個體更新方法方法爬蟲根據個體網頁的改變頻率來重新訪問各頁面;3)基於分類的更新法:爬蟲根據網頁改變頻率將其分為更新較快網頁子集和更新較慢網頁子集兩類,然後以不同的頻率訪問這兩類網頁。
為實現第二個目標,增量式爬蟲需要對網頁的重要性排序,常用的策略有:廣度優先策略、PageRank優先策略等。IBM開發的WebFountain是一個功能強大的增量式網路爬蟲,它採用一個優化模型控制爬行過程,並沒有對頁面變化過程做任何統計假設,而是採用一種自適應的方法根據先前爬行周期里爬行結果和網頁實際變化速度對頁面更新頻率進行調整。北京大學的天網增量爬行系統旨在爬行國內Web,將網頁分為變化網頁和新網頁兩類,分別採用不同爬行策略。為緩解對大量網頁變化歷史維護導致的性能瓶頸,它根據網頁變化時間局部性規律,在短時期內直接爬行多次變化的網頁,為儘快獲取新網頁,它利用索引型網頁跟蹤新出現網頁。
Deep Web爬蟲
Web頁面按存在方式可以分為表層網頁(Surface Web)和深層網頁(Deep Web,也稱Invisible Web Pages或Hidden Web)。表層網頁是指傳統搜索引擎可以索引的頁面,以超鏈接可以到達的靜態網頁為主構成的Web頁面。Deep Web是那些大部分內容不能通過靜態鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關鍵詞才能獲得的Web頁面。例如那些用戶註冊后內容才可見的網頁就屬於 Deep Web。2000年 Bright Planet指出:Deep Web中可訪問信息容量是Surface Web的幾百倍,是網際網路上最大、發展最快的新型信息資源。
Deep Web爬蟲體系結構包含六個基本功能模塊(爬行控制器、解析器、表單分析器、表單處理器、響應分析器、LVS控制器)和兩個爬蟲內部數據結構(URL列表、LVS表)。其中LVS(Label Value Set)表示標籤/數值集合,用來表示填充表單的數據源。
Deep Web爬蟲爬行過程中最重要部分就是表單填寫,包含兩種類型:
1)基於領域知識的表單填寫:此方法一般會維持一個本體庫,通過語義分析來選取合適的關鍵詞填寫表單。Yiyao Lu等人提出一種獲取Form表單信息的多註解方法,將數據表單按語義分配到各個組中,對每組從多方面註解,結合各種註解結果來預測一個最終的註解標籤;鄭冬冬等人利用一個預定義的領域本體知識庫來識別Deep Web頁面內容,同時利用一些來自Web站點導航模式來識別自動填寫表單時所需進行的路徑導航。
2)基於網頁結構分析的表單填寫:此方法一般無領域知識或僅有有限的領域知識,將網頁表單表示成DOM樹,從中提取表單各欄位值。Desouky等人提出一種LEHW方法,該方法將HTML網頁表示為DOM樹形式,將表單區分為單屬性表單和多屬性表單,分別進行處理;孫彬等人提出一種基於XQuery的搜索系統,它能夠模擬表單和特殊頁面標記切換,把網頁關鍵字切換信息描述為三元組單元,按照一定規則排除無效表單,將Web文檔構造成DOM樹,利用XQuery將文字屬性映射到表單欄位。
Raghavan等人提出的HIWE系統中,爬行管理器負責管理整個爬行過程,分析下載的頁面,將包含表單的頁面提交表單處理器處理,表單處理器先從頁面中提取表單,從預先準備好的數據集中選擇數據自動填充並提交表單,由爬行控制器下載相應的結果頁面。
抓取目標的描述和定義是決定網頁分析演演算法與URL搜索策略如何制訂的基礎。而網頁分析演演算法和候選URL排序演演算法是決定搜索引擎所提供的服務形式和爬蟲網頁抓取行為的關鍵所在。這兩個部分的演演算法又是緊密相關的。
現有聚焦爬蟲對抓取目標的描述可分為基於目標網頁特徵、基於目標數據模式和基於領域概念3種。
基於目標網頁特徵
基於目標網頁特徵的爬蟲所抓取、存儲並索引的對象一般為網站或網頁。根據種子樣本獲取方式可分為:
(1)預先給定的初始抓取種子樣本;
(2)預先給定的網頁分類目錄和與分類目錄對應的種子樣本,如Yahoo!分類結構等;
(3)通過用戶行為確定的抓取目標樣例,分為:
(a)用戶瀏覽過程中顯示標註的抓取樣本;
(b)通過用戶日誌挖掘得到訪問模式及相關樣本。
其中,網頁特徵可以是網頁的內容特徵,也可以是網頁的鏈接結構特徵,等等。
基於目標數據模式
基於目標數據模式的爬蟲針對的是網頁上的數據,所抓取的數據一般要符合一定的模式,或者可以轉化或映射為目標數據模式。
基於領域概念
另一種描述方式是建立目標領域的本體或詞典,用於從語義角度分析不同特徵在某一主題中的重要程度。
網頁的抓取策略可以分為深度優先、廣度優先和最佳優先三種。深度優先在很多情況下會導致爬蟲的陷入(trapped)問題,目前常見的是廣度優先和最佳優先方法。
廣度優先搜索策略是指在抓取過程中,在完成當前層次的搜索后,才進行下一層次的搜索。該演演算法的設計和實現相對簡單。在目前為覆蓋儘可能多的網頁,一般使用廣度優先搜索方法。也有很多研究將廣度優先搜索策略應用於聚焦爬蟲中。其基本思想是認為與初始URL在一定鏈接距離內的網頁具有主題相關性的概率很大。另外一種方法是將廣度優先搜索與網頁過濾技術結合使用,先用廣度優先策略抓取網頁,再將其中無關的網頁過濾掉。這些方法的缺點在於,隨著抓取網頁的增多,大量的無關網頁將被下載並過濾,演演算法的效率將變低。
最佳優先搜索策略按照一定的網頁分析演演算法,預測候選URL與目標網頁的相似度,或與主題的相關性,並選取評價最好的一個或幾個URL進行抓取。它只訪問經過網頁分析演演算法預測為“有用”的網頁。存在的一個問題是,在爬蟲抓取路徑上的很多相關網頁可能被忽略,因為最佳優先策略是一種局部最優搜索演演算法。因此需要將最佳優先結合具體的應用進行改進,以跳出局部最優點。將在第4節中結合網頁分析演演算法作具體的討論。研究表明,這樣的閉環調整可以將無關網頁數量降低30%~90%。
深度優先搜索策略從起始網頁開始,選擇一個URL進入,分析這個網頁中的URL,選擇一個再進入。如此一個鏈接一個鏈接地抓取下去,直到處理完一條路線之後再處理下一條路線。深度優先策略設計較為簡單。然而門戶網站提供的鏈接往往最具價值,PageRank也很高,但每深入一層,網頁價值和PageRank都會相應地有所下降。這暗示了重要網頁通常距離種子較近,而過度深入抓取到的網頁卻價值很低。同時,這種策略抓取深度直接影響著抓取命中率以及抓取效率,對抓取深度是該種策略的關鍵。相對於其他兩種策略而言。此種策略很少被使用。
網頁分析演演算法可以歸納為基於網路拓撲、基於網頁內容和基於用戶訪問行為三種類型。
拓撲分析演演算法
基於網頁之間的鏈接,通過已知的網頁或數據,來對與其有直接或間接鏈接關係的對象(可以是網頁或網站等)作出評價的演演算法。又分為網頁粒度、網站粒度和網頁塊粒度這三種。
1 網頁(Webpage)粒度的分析演演算法
PageRank和HITS演演算法是最常見的鏈接分析演演算法,兩者都是通過對網頁間鏈接度的遞歸和規範化計算,得到每個網頁的重要度評價。PageRank演演算法雖然考慮了用戶訪問行為的隨機性和Sink網頁的存在,但忽略了絕大多數用戶訪問時帶有目的性,即網頁和鏈接與查詢主題的相關性。針對這個問題,HITS演演算法提出了兩個關鍵的概念:權威型網頁(authority)和中心型網頁(hub)。
基於鏈接的抓取的問題是相關頁面主題團之間的隧道現象,即很多在抓取路徑上偏離主題的網頁也指向目標網頁,局部評價策略中斷了在當前路徑上的抓取行為。文獻提出了一種基於反向鏈接(BackLink)的分層式上下文模型(Context Model),用於描述指向目標網頁一定物理跳數半徑內的網頁拓撲圖的中心Layer0為目標網頁,將網頁依據指向目標網頁的物理跳數進行層次劃分,從外層網頁指向內層網頁的鏈接稱為反向鏈接。
2 網站粒度的分析演演算法
網站粒度的資源發現和管理策略也比網頁粒度的更簡單有效。網站粒度的爬蟲抓取的關鍵之處在於站點的劃分和站點等級(SiteRank)的計算。SiteRank的計算方法與PageRank類似,但是需要對網站之間的鏈接作一定程度抽象,並在一定的模型下計算鏈接的權重。
網站劃分情況分為按域名劃分和按IP地址劃分兩種。文獻討論了在分散式情況下,通過對同一個域名下不同主機、伺服器的IP地址進行站點劃分,構造站點圖,利用類似PageRank的方法評價SiteRank。同時,根據不同文件在各個站點上的分佈情況,構造文檔圖,結合SiteRank分散式計算得到DocRank。文獻證明,利用分散式的SiteRank計算,不僅大大降低了單機站點的演演算法代價,而且克服了單獨站點對整個網路覆蓋率有限的缺點。附帶的一個優點是,常見PageRank造假難以對SiteRank進行欺騙。
3 網頁塊粒度的分析演演算法
在一個頁面中,往往含有多個指向其他頁面的鏈接,這些鏈接中只有一部分是指向主題相關網頁的,或根據網頁的鏈接錨文本表明其具有較高重要性。但是,在PageRank和HITS演演算法中,沒有對這些鏈接作區分,因此常常給網頁分析帶來廣告等雜訊鏈接的干擾。在網頁塊級別(Block?level)進行鏈接分析的演演算法的基本思想是通過VIPS網頁分割演演算法將網頁分為不同的網頁塊(page block),然後對這些網頁塊建立page?to?block和block?to?page的鏈接矩陣,?分別記為Z和X。於是,在page?to?page圖上的網頁塊級別的PageRank為?W?p=X×Z;?在block?to?block圖上的BlockRank為?W?b=Z×X。已經有人實現了塊級別的PageRank和HITS演演算法,並通過實驗證明,效率和準確率都比傳統的對應演演算法要好。
網頁內容分析演演算法
基於網頁內容的分析演演算法指的是利用網頁內容(文本、數據等資源)特徵進行的網頁評價。網頁的內容從原來的以超文本為主,發展到後來動態頁面(或稱為Hidden Web)數據為主,後者的數據量約為直接可見頁面數據(PIW,Publicly Indexable Web)的400~500倍。另一方面,多媒體數據、Web Service等各種網路資源形式也日益豐富。因此,基於網頁內容的分析演演算法也從原來的較為單純的文本檢索方法,發展為涵蓋網頁數據抽取、機器學習、數據挖掘、語義理解等多種方法的綜合應用。本節根據網頁數據形式的不同,將基於網頁內容的分析演演算法,歸納以下三類:第一種針對以文本和超鏈接為主的無結構或結構很簡單的網頁;第二種針對從結構化的數據源(如RDBMS)動態生成的頁面,其數據不能直接批量訪問;第三種針對的數據界於第一和第二類數據之間,具有較好的結構,顯示遵循一定模式或風格,且可以直接訪問。
基於文本的網頁分析演演算法
1)純文本分類與聚類演演算法
很大程度上借用了文本檢索的技術。文本分析演演算法可以快速有效的對網頁進行分類和聚類,但是由於忽略了網頁間和網頁內部的結構信息,很少單獨使用。
2)超文本分類和聚類演演算法
根據網頁鏈接網頁的相關類型對網頁進行分類,依靠相關聯的網頁推測該網頁的類型。
這些處理被稱為網路抓取或者蜘蛛爬行。很多站點,尤其是搜索引擎,都使用爬蟲提供最新的數據,它主要用於提供它訪問過頁面的一個副本,然後,搜索引擎就可以對得到的頁面進行索引,以提供快速的訪問。蜘蛛也可以在web上用來自動執行一些任務,例如檢查鏈接,確認html代碼;也可以用來抓取網頁上某種特定類型信息,例如抓取電子郵件地址(通常用於垃圾郵件)。
一個網路蜘蛛就是一種機器人,或者軟體代理。大體上,它從一組要訪問的URL鏈接開始,可以稱這些URL為種子。爬蟲訪問這些鏈接,它辨認出這些頁面的所有超鏈接,然後添加到這個URL列表,可以稱作檢索前沿。這些URL按照一定的策略反覆訪問。
1.爬行策略
下述的三種網路特徵,造成了設計網頁爬蟲抓取策略變得很難:
它巨大的數據量;
它快速的更新頻率;
動態頁面的產生
它們三個特徵一起產生了很多種類的爬蟲抓取鏈接。
巨大的數據量暗示了爬蟲,在給定的時間內,只可以抓取所下載網路的一部分,所以,它需要對它的抓取頁面設置優先順序;快速的更新頻率說明在爬蟲抓取下載某網站一個網頁的時候,很有可能在這個站點又有新的網頁被添加進來,或者這個頁面被更新或者刪除了。
最近新增的很多頁面都是通過伺服器端腳本語言產生的,無窮的參數組合也增加了爬蟲抓取的難度,只有一小部分這種組合會返回一些獨特的內容。例如,一個很小照片存儲庫僅僅通過get方式可能提供就給用戶三種操作方式。如果這裡存著四種分類方式,三種縮略圖方式,兩種文件格式,和一個禁止用戶提供內容的選項,那麼,同樣的內容就可以通過48種方式訪問。這種數學組合給網路爬蟲創造的難處就是,為了獲取不同的內容,他們必須篩選無窮僅有微小變化的組合。
正如愛德華等人所說的:“用於檢索的帶寬不是無限的,也不是免費的;所以,如果引入衡量爬蟲抓取質量或者新鮮度的有效指標的話,不但伸縮性,連有效性都將變得十分必要”(愛德華等人,2001年)。一個爬蟲就必須小心的選擇下一步要訪問什麼頁面。網頁爬蟲的行為通常是四種策略組合的結果。
♦選擇策略,決定所要下載的頁面;
♦重新訪問策略,決定什麼時候檢查頁面的更新變化;
♦平衡禮貌策略,指出怎樣避免站點超載;
♦并行策略,指出怎麼協同達到分散式抓取的效果;
1.1選擇策略:
就現在網路資源的大小而言,即使很大的搜索引擎也只能獲取網路上可得到資源的一小部分。由勞倫斯河蓋爾斯共同做的一項研究指出,沒有一個搜索引擎抓取的內容達到網路的16%(勞倫斯河蓋爾斯,2001)。網路爬蟲通常僅僅下載網頁內容的一部分,但是大家都還是強烈要求下載的部分包括最多的相關頁面,而不僅僅是一個隨機的簡單的站點。
這就要求一個公共標準來區分網頁的重要程度,一個頁面的重要程度與他自身的質量有關,與按照鏈接數、訪問數得出的受歡迎程度有關,甚至與他本身的網址(後來出現的把搜索放在一個頂級域名或者一個固定頁面上的垂直搜索)有關。設計一個好的搜索策略還有額外的困難,它必須在不完全信息下工作,因為整個頁面的集合在抓取時是未知的。
Cho等人(Cho et al,1998)做了第一份抓取策略的研究。他們的數據是斯坦福大學網站中的18萬個頁面,使用不同的策略分別模仿抓取。排序的方法使用了廣度優先,后鏈計數,和部分pagerank演演算法。計算顯示,如果你想要優先下載pagerank高的頁面,那麼,部分PageRank策略是比較好的,其次是廣度優先和后鏈計數。並且,這樣的結果僅僅是針對一個站點的。
Najork和Wiener(Najork and Wiener,2001)採用實際的爬蟲,對3.28億個網頁,採用廣度優先研究。他們發現廣度優先會較早的抓到PageRank高的頁面(但是他們沒有採用其他策略進行研究)。作者給出的解釋是:“最重要的頁面會有很多的主機連接到他們,並且那些鏈接會較早的發現,而不用考慮從哪一個主機開始。”
Abiteboul(Abiteboul等人,2003),設計了一種基於OPIC(在線頁面重要指數)的抓取戰略。在OPIC中,每一個頁面都有一個相等的初始權值,並把這些權值平均分給它所指向的頁面。這種演演算法與Pagerank相似,但是他的速度很快,並且可以一次完成。OPIC的程序首先抓取獲取權值最大的頁面,實驗在10萬個冪指分佈的模擬頁面中進行。並且,實驗沒有和其它策略進行比較,也沒有在真正的WEB頁面測試。
Boldi等人(Boldi et al.,2004)的模擬檢索實驗進行在從.it網路上取下的4000萬個頁面和從webbase得到的1億個頁面上,測試廣度優先和深度優先,隨機序列和有序序列。比較的基礎是真實頁面pageRank值和計算出來的pageRank值的接近程度。令人驚奇的是,一些計算pageRank很快的頁面(特別明顯的是廣度優先策略和有序序列)僅僅可以達到很小的接近程度。
Baeza-Yates等人(Baeza-Yates et al.,2005)在從.gr域名和.cl域名子網站上獲取的300萬個頁面上模擬實驗,比較若干個抓取策略。結果顯示OPIC策略和站點隊列長度,都比廣度優先要好;並且如果可行的話,使用之前的爬行抓取結果來指導這次抓取,總是十分有效的。
Daneshpajouh等人(Daneshpajouh et al.,2008)設計了一個用於尋找好種子的社區。它們從來自不同社區的高PageRank頁面開始檢索的方法,迭代次數明顯小於使用隨機種子的檢索。使用這種方式,可以從以前抓取頁面之中找到好的種子,使用這些種子是十分有效的。
1.1.1限定訪問鏈接
一個爬蟲可能僅僅想找到html頁面的種子而避免其他的文件類型。為了僅僅得到html的資源,一個爬蟲可以首先做一個http head的請求,以在使用request方法獲取所有的資源之前,決定這個網路文件的類型。為了避免要發送過多的head請求,爬蟲可以交替的檢查url並且僅僅對以html,htm和反斜杠結尾的文件發送資源請求。這種策略會導致很多的html資源在無意中錯過,一種相似的策略是將網路資源的擴展名同已知是html文件類型的一組擴展名(如.html,.htm,.asp,.php,.aspx,反斜杠)進行比較。
一些爬蟲也會限制對任何含有“?”的資源(這些是動態生成的)進行獲取請求,以避免蜘蛛爬行在某一個站點中陷入下載無窮無盡的URL的困境。
1.1.2路徑檢索
一些爬蟲會儘可能多的嘗試下載一個特定站點的資源。Cothey(Cothey,2004)引入了一種路徑檢索的爬蟲,它會嘗試抓取需要檢索資源的所有URL。例如,給定一個種子地址:它將會嘗試檢索/hamster/menkey/,/hamster/和/ 。Cothey發現路徑檢索對發現獨立資源,或者一些通常爬蟲檢索不到的的連接是非常有效的。
一些路徑檢索的爬蟲也被稱為收割機軟體,因為他們通常用於收割或者收集所有的內容,可能是從特定的頁面或者主機收集相冊的照片。
1.1.3聚焦抓取
爬蟲所抓取頁面的重要程度也可以表述成它與給定查詢之間相似程度的函數。網路爬蟲嘗試下載相似頁面,可以稱為聚焦檢索或者主題檢索。關於主題檢索和聚焦檢索的概念,最早是由Menczer(Menczer 1997;Menczer and Belew,1998)和Chakrabarti等人首先提出來的(Chakrabarti et al.,1999)。
聚焦檢索的主要問題是網頁爬蟲的使用環境,我們希望在實際下載頁面之前,就可以知道給定頁面和查詢之間的相似度。一個可能的方法就是在鏈接之中設置錨點,這就是在早期時候,Pinkerton(Pinkerton,1994)曾經在一個爬蟲中採用的策略。Diligenti等人(Diligenti等人,2000)建議使用已經抓取頁面的內容去推測查詢和未訪問頁的相似度。一個聚焦查詢的表現的好壞主要依賴於查詢主題內容的豐富程度,通常還會依賴頁面查詢引擎提供的查詢起點。
1.1.4抓取深層的網頁
很多的頁面隱藏的很深或隱藏在在看不到的網路之中。這些頁面通常只有在向資料庫提交查詢的時候才可以訪問到,如果沒有鏈接指向他們的話,一般的爬蟲是不能訪問到這些頁面的。谷歌站點地圖協議和mod oai(Nelson等人,2005)嘗試允許發現這些深層次的資源。
深層頁面抓取器增加了抓取網頁的鏈接數。一些爬蟲僅僅抓取形如超文本所包含的內容,標籤和文本。
1.1.5 WEB3.0檢索
Web3.0為下一代搜索技術定義了更先進的技術和新的準則,可以概括為語義網路和網站模板解析的概念。第三代檢索技術將建立在人機巧妙地聯繫的基礎上。
1.2重新訪問策略
網路具有動態性很強的特性。抓取網路上的一小部分內容可能會花費真的很長的時間,通常用周或者月來衡量。當爬蟲完成它的抓取的任務以後,很多操作是可能會發生的,這些操作包括新建,更新和刪除。
從搜索引擎的角度來看,不檢測這些事件是有成本的,成本就是我們僅僅擁有一份過時的資源。最常使用的成本函數,是新鮮度和過時性(2000年,Cho和Garcia-Molina)
新鮮度:這是一個衡量抓取內容是不是準確的二元值。在時間t內,倉庫中頁面p的新鮮度是這樣定義的:
過時性:這是一個衡量本地已抓取的內容過時程度的指標。在時間t時,倉庫中頁面p的時效性的定義如下:
在頁面抓取中,新鮮度和過時性的發展
Coffman等人(Edward G.Coffman,1998)是從事爬蟲對象定義的,他們提出了一個相當於新鮮度的概念,但是使用了不同的措詞:他們建議爬蟲必須最小化過時頁面部分。他們指出網路爬行的問題就相當於多個隊列,一個投票系統;這裡,爬蟲是伺服器,不同的站點是隊列。頁面修改是到達的顧客,頁面切換的時間是頁面進入一個單一站點的間隔。在這個模型下,每一個顧客在投票系統的平均時間,相當於爬蟲的平均過時性。
爬蟲的目標是儘可能高的提高頁面的新鮮度,同時降低頁面的過時性。這一目標並不是完全一樣的,第一種情況,爬蟲關心的是有多少頁面時過時的;在第二種情況,爬蟲關心的頁面過時了多少。
兩種最簡單的重新訪問策略是由Cho和Garcia-Molina研究的(Cho和Garcia-Molina,2003):
統一策略:使用相同的頻率,重新訪問收藏中的所有的鏈接,而不考慮他們更新頻率。
正比策略:對變化越多的網頁,重新訪問的頻率也越高。網頁訪問的頻率和網頁變化的頻率直接相關。
(兩種情況下,爬蟲的重新抓取都可以採用隨機方式,或者固定的順序)
Cho和Garcia-Molina證明了一個出人意料的結果。以平均新鮮度方式衡量,統一策略在模擬頁面和真實的網路抓取中都比正比策略出色。對於這種結果的解釋是:當一個頁面變化太快的時候,爬蟲將會將會在不斷的嘗試重新抓取而浪費很多時間,但是卻還是不能保證頁面的新鮮度。
為了提高頁面的新鮮度,我們應該宣判變化太快的頁面死罪(Cho和Garcia-Molina,2003a)。最佳的重新訪問策略既不是統一策略,也不是正比策略;保持平均頁面新鮮度高的最佳方法策略包括忽略那些變化太快的頁面,而保持頁面平均過時性低的方法則是對每一頁按照頁面變化率單調變化的策略訪問。兩種情況下,最佳的策略較正比策略,都更接近統一策略。正如Coffman等人(Edward G.Coffman,1998)所注意到的:“為了最小化頁面過時的時間,對任一個頁面的訪問都應該儘可能的均勻間隔地訪問。”對於重新訪問的詳盡的策略在大體上是不可以達到的,但是他們可以從數學上得到,因為他們依賴於頁面的變化。(Cho和Garcia-Molina,2003a)指出指數變化是描述頁面變化的好方法,同時(Ipeirotis等人,2005)指出了怎麼使用統計工具去發現適合這些變化的參數。注意在這裡的重新訪問策略認為每一個頁面都是相同的(網路上所有的頁面價值都是一樣的)這不是現實的情況,所以,為了獲取更好的抓取策略,更多有關網頁質量的信息應該考慮進去。
1.3 平衡禮貌策略
爬蟲相比於人,可以有更快的檢索速度和更深的層次,所以,他們可能使一個站點癱瘓。不需要說一個單獨的爬蟲一秒鐘要執行多條請求,下載大的文件。一個伺服器也會很難響應多線程爬蟲的請求。
就像Koster(Koster,1995)所注意的那樣,爬蟲的使用對很多工作都是很有用的,但是對一般的社區,也需要付出代價。使用爬蟲的代價包括:
網路資源:在很長一段時間,爬蟲使用相當的帶寬高度并行地工作。
伺服器超載:尤其是對給定伺服器的訪問過高時。
質量糟糕的爬蟲,可能導致伺服器或者路由器癱瘓,或者會嘗試下載自己無法處理的頁面。
個人爬蟲,如果過多的人使用,可能導致網路或者伺服器阻塞。
對這些問題的一個部分解決方法是漫遊器排除協議(Robots exclusion protocol),也被稱為robots.txt議定書(Koster,1996),這份協議對於管理員指明網路伺服器的那一部分不能到達是一個標準。這個標準沒有包括重新訪問一台伺服器的間隔的建議,雖然訪問間隔是避免伺服器超載的最有效的辦法。最近的商業搜索軟體,如Ask Jeeves,MSN和Yahoo可以在robots.txt中使用一個額外的“Crawl-delay”參數來指明請求之間的延遲。
對連接間隔時間的第一個建議由Koster 1993年給出,時間是60秒。按照這個速度,如果一個站點有超過10萬的頁面,即使我們擁有零延遲和無窮帶寬的完美連接,它也會需要兩個月的時間來下載整個站點,並且,這個伺服器中的資源,只有一小部分可以使用。這似乎是不可以接受的。
Cho(Cho和Garcia-Molina,2003)使用10秒作為訪問的間隔時間,WIRE爬蟲(Baeza-Yates and Castillo,2002)使用15秒作為默認間隔。MercatorWeb(Heydon 和Najork,1999)爬蟲使用了一種自適應的平衡策略:如果從某一伺服器下載一個文檔需要t秒鐘,爬蟲就等待10t秒的時間,然後開始下一個頁面。Dill等人 (Dill et al.,2002) 使用1秒。
對於那些使用爬蟲用於研究目的的,一個更詳細的成本-效益分析是必要的,當決定去哪一個站點抓取,使用多快的速度抓取的時候,倫理的因素也需要考慮進來。
訪問記錄顯示已知爬蟲的訪問間隔從20秒鐘到3-4分鐘不等。需要注意的是即使很禮貌,採取了所有的安全措施來避免伺服器超載,還是會引來一些網路伺服器管理員的抱怨的。Brin和Page注意到:運行一個針對超過50萬伺服器的爬蟲,會產生很多的郵件和電話。這是因為有無數的人在上網,而這些人不知道爬蟲是什麼,因為這是他們第一次見到。(Brin和Page,1998)
1.4 并行策略
一個并行爬蟲是并行運行多個進程的爬蟲。它的目標是最大化下載的速度,同時盡量減少并行的開銷和下載重複的頁面。為了避免下載一個頁面兩次,爬蟲系統需要策略來處理爬蟲運行時新發現的URL,因為同一個URL地址,可能被不同的爬蟲進程抓到。
2.網路爬蟲體系結構
網頁爬蟲的高層體系結構
一個爬蟲不能像上面所說的,僅僅只有一個好的抓取策略,還需要有一個高度優化的結構。
Shkapenyuk和Suel(Shkapenyuk和Suel,2002)指出:設計一個短時間內,一秒下載幾個頁面的頗慢的爬蟲是一件很容易的事情,而要設計一個使用幾周可以下載百萬級頁面的高性能的爬蟲,將會在系統設計,I/O和網路效率,健壯性和易用性方面遇到眾多挑戰。
網路爬蟲是搜索引擎的核心,他們演演算法和結構上的細節被當作商業機密。當爬蟲的設計發布時,總會有一些為了阻止別人複製工作而缺失的細節。人們也開始關注主要用於阻止主要搜索引擎發布他們的排序演演算法的“搜索引擎垃圾郵件”。
2.1 URL一般化
爬蟲通常會執行幾種類型的URL規範化來避免重複抓取某些資源。URL一般化也被稱為URL標準化,指的是修正URL並且使其前後一致的過程。這裡有幾種一般化方法,包括轉化URL為小寫的,去除逗號(如‘.’‘..’等),對非空的路徑,在末尾加反斜杠。
3.爬蟲身份識別
網路爬蟲通過使用http請求的用戶代理(User Agent)欄位來向網路伺服器表明他們的身份。網路管理員則通過檢查網路伺服器的日誌,使用用戶代理欄位來辨認哪一個爬蟲曾經訪問過以及它訪問的頻率。用戶代理欄位可能會包含一個可以讓管理員獲取爬蟲更多信息的URL。郵件抓取器和其他懷有惡意的網路爬蟲通常不會留任何的用戶代理欄位內容,或者他們也會將他們的身份偽裝成瀏覽器或者其他的知名爬蟲。
對於網路爬蟲,留下用戶標誌信息是十分重要的;這樣,網路管理員在需要的時候就可以聯繫爬蟲的主人。有時,爬蟲可能會陷入爬蟲陷阱或者使一個伺服器超負荷,這時,爬蟲主人需要使爬蟲停止。對那些有興趣了解特定爬蟲訪問時間網路管理員來講,用戶標識信息是十分重要的。
4.用戶爬蟲的例子
以下是一系列已經發布的一般用途的網路爬蟲(除了主題檢索的爬蟲)的體系結構,包括了對不同組件命名和突出特點的簡短的描述。
RBSE(Eichmann,1994)是第一個發布的爬蟲。它有兩個基礎程序。第一個是“spider”,抓取隊列中的內容到一個關係資料庫中,第二個程序是“mite”,是一個修改後的www的ASCII瀏覽器,負責從網路上下載頁面。
WebCrawler(Pinkerton,1994)是第一個公開可用的用來建立全文索引的一個子程序,它使用庫www來下載頁面;另外一個程序使用廣度優先來解析獲取URL並對其排序;它還包括一個根據選定文本和查詢相似程度爬行的實時爬蟲。
World Wide Web Worm(McBryan,1994)是一個用來為文件建立包括標題和URL簡單索引的爬蟲。索引可以通過grep式的Unix命令來搜索。
Google Crawler(Brin and Page,1998)用了一些細節來描述,但是這些細節僅僅是關於使用C++和Python編寫的、一個早期版本的體系結構。因為文本解析就是全文檢索和URL抽取的過程,所以爬蟲集成了索引處理。這裡擁有一個URL伺服器,用來給幾個爬蟲程序發送要抓取的URL列表。在文本解析的時候,新發現的URL傳送給URL伺服器並檢測這個URL是不是已經存在,如果不存在的話,該URL就加入到URL伺服器中。
CobWeb(da Silva et al.,1999)使用了一個中央“調度者”和一系列的“分散式的搜集者”。搜集者解析下載的頁面並把找到的URL發送給調度者,然後調度者反過來分配給搜集者。調度者使用深度優先策略,並且使用平衡禮貌策略來避免伺服器超載。爬蟲是使用Perl語言編寫的。
Mercator(Heydon and Najork,1999;Najork and Heydon,2001)是一個分散式的,模塊化的使用java編寫的網路爬蟲。它的模塊化源自於使用可互換的的“協議模塊”和“處理模塊”。協議模塊負責怎樣獲取網頁(例如使用HTTP),處理模塊負責怎樣處理頁面。標準處理模塊僅僅包括了解析頁面和抽取URL,其他處理模塊可以用來檢索文本頁面,或者搜集網路數據。
WebFountain(Edwards et al.,2001)是一個與Mercator類似的分散式的模塊化的爬蟲,但是使用C++編寫的。它的特點是一個管理員機器控制一系列的螞蟻機器。經過多次下載頁面后,頁面的變化率可以推測出來,這時,一個非線性的方法必須用於求解方程以獲得一個最大的新鮮度的訪問策略。作者推薦在早期檢索階段使用這個爬蟲,然後用統一策略檢索,就是所有的頁面都使用相同的頻率訪問。
PolyBot[Shkapenyuk and Suel,2002]是一個使用C++和Python編寫的分散式網路爬蟲。它由一個爬蟲管理者,一個或多個下載者,一個或多個DNS解析者組成。抽取到的URL被添加到硬碟的一個隊列裡面,然後使用批處理的模式處理這些URL。平衡禮貌方面考慮到了第二、三級網域,因為第三級網域通常也會保存在同一個網路伺服器上。
WebRACE(Zeinalipour-Yazti and Dikaiakos,2002)是一個使用java實現的,擁有檢索模塊和緩存模塊的爬蟲,它是一個很通用的稱作eRACE的系統的一部分。系統從用戶得到下載頁面的請求,爬蟲的行為有點像一個聰明的代理伺服器。系統還監視訂閱網頁的請求,當網頁發生改變的時候,它必須使爬蟲下載更新這個頁面並且通知訂閱者。WebRACE最大的特色是,當大多數的爬蟲都從一組URL開始的時候,WebRACE可以連續地的接收抓取開始的URL地址。
Ubicrawer(Boldi et al.,2004)是一個使用java編寫的分散式爬蟲。它沒有中央程序。它由一組完全相同的代理組成,分配功能通過主機前後一致的散列計算進行。這裡沒有重複的頁面,除非爬蟲崩潰了(然後,另外一個代理就會接替崩潰的代理重新開始抓取)。爬蟲設計為高伸縮性和允許失敗的。
FAST Crawler(Risvik and Michelsen,2002)是一個分散式的爬蟲,在Fast Search&Transfer中使用,關於其體系結構的一個大致的描述可以在[citation needed]找到。
Labrador,一個工作在開源項目Terrier Search Engine上的非開源的爬蟲。
TeezirCrawler是一個非開源的可伸縮的網頁抓取器,在Teezir上使用。該程序被設計為一個完整的可以處理各種類型網頁的爬蟲,包括各種JavaScript和HTML文檔。爬蟲既支持主題檢索也支持非主題檢索。
Spinn3r,一個通過博客構建反饋信息的爬蟲。Spinn3r是基於java的,它的大部分的體系結構都是開源的。
HotCrawler,一個使用c語言和php編寫的爬蟲。
ViREL Microformats Crawler,搜索公眾信息作為嵌入到網頁的一小部分。
除了上面列出的幾個特定的爬蟲結構以外,還有Cho(Cho and Garcia-Molina,2002)和Chakrabarti(Chakrabarti,2003)發布的一般的爬蟲體系結構。
4.1 開源爬蟲
DataparkSearch是一個在GNU GPL許可下發布的爬蟲搜索引擎。
GNU Wget是一個在GPL許可下,使用C語言編寫的命令行式的爬蟲。它主要用於網路伺服器和FTP伺服器的鏡像。
Heritrix是一個網際網路檔案館級的爬蟲,設計的目標為對大型網路的大部分內容的定期存檔快照,是使用java編寫的。
Ht://Dig在它和索引引擎中包括了一個網頁爬蟲。
HTTrack用網路爬蟲創建網路站點鏡像,以便離線觀看。它使用C語言編寫,在GPL許可下發行。
ICDL Crawler是一個用C++編寫,跨平台的網路爬蟲。它僅僅使用空閑的CPU資源,在ICDL標準上抓取整個站點。
JSpider是一個在GPL許可下發行的,高度可配置的,可定製的網路爬蟲引擎。
LLarbin由Sebastien Ailleret開發;
Webtools4larbin由Andreas Beder開發;
Methabot是一個使用C語言編寫的高速優化的,使用命令行方式運行的,在2-clause BSD許可下發布的網頁檢索器。它的主要的特性是高可配置性,模塊化;它檢索的目標可以是本地文件系統,HTTP或者FTP。
Nutch是一個使用java編寫,在Apache許可下發行的爬蟲。它可以用來連接Lucene的全文檢索套件;
Pavuk是一個在GPL許可下發行的,使用命令行的WEB站點鏡像工具,可以選擇使用X11的圖形界面。與wget和httprack相比,他有一系列先進的特性,如以正則表達式為基礎的文件過濾規則和文件創建規則。
WebVac是斯坦福WebBase項目使用的一個爬蟲。
WebSPHINX(Miller and Bharat,1998)是一個由java類庫構成的,基於文本的搜索引擎。它使用多線程進行網頁檢索,html解析,擁有一個圖形用戶界面用來設置開始的種子URL和抽取下載的數據;
WIRE-網路信息檢索環境(Baeza-Yates和Castillo,2002)是一個使用C++編寫,在GPL許可下發行的爬蟲,內置了幾種頁面下載安排的策略,還有一個生成報告和統計資料的模塊,所以,它主要用於網路特徵的描述;
LWP:RobotUA(Langheinrich,2004)是一個在Perl5許可下發行的,可以優異的完成并行任務的Perl類庫構成的機器人。
Web Crawler是一個為.net準備的開放源代碼的網路檢索器(C#編寫)。
Sherlock Holmes收集和檢索本地和網路上的文本類數據(文本文件,網頁),該項目由捷克門戶網站中樞(Czech web portal Centrum)贊助並且主用商用於這裡;它同時也使用在。
YaCy是一個基於P2P網路的免費的分散式搜索引擎(在GPL許可下發行);
Ruya是一個在廣度優先方面表現優秀,基於等級抓取的開放源代碼的網路爬蟲。在英語和日語頁面的抓取表現良好,它在GPL許可下發行,並且完全使用Python編寫。按照robots.txt有一個延時的單網域延時爬蟲。
Universal Information Crawler快速發展的網路爬蟲,用於檢索存儲和分析數據;
Agent Kernel,當一個爬蟲抓取時,用來進行安排,併發和存儲的java框架。
是一個使用C#編寫,需要SQL Server 2005支持的,在GPL許可下發行的多功能的開源的機器人。它可以用來下載,檢索,存儲包括電子郵件地址,文件,超鏈接,圖片和網頁在內的各種數據。
Dine是一個多線程的java的http客戶端。它可以在LGPL許可下進行二次開發。
網路爬蟲的組成
在網路爬蟲的系統框架中,主過程由控制器,解析器,資源庫三部分組成。控制器的主要工作是負責給多線程中的各個爬蟲線程分配工作任務。解析器的主要工作是下載網頁,進行頁面的處理,主要是將一些JS腳本標籤、CSS代碼內容、空格字元、HTML標籤等內容處理掉,爬蟲的基本工作是由解析器完成。資源庫是用來存放下載到的網頁資源,一般都採用大型的資料庫存儲,如Oracle資料庫,並對其建立索引。
控制器
控制器是網路爬蟲的中央控制器,它主要是負責根據系統傳過來的URL鏈接,分配一線程,然後啟動線程調用爬蟲爬取網頁的過程。
解析器
解析器是負責網路爬蟲的主要部分,其負責的工作主要有:下載網頁的功能,對網頁的文本進行處理,如過濾功能,抽取特殊HTML標籤的功能,分析數據功能。
資源庫
主要是用來存儲網頁中下載下來的數據記錄的容器,並提供生成索引的目標源。中大型的資料庫產品有:Oracle、Sql Server等。