在萬維網飛速發(fā)展的網絡背景下,搜索引擎在人們的生活工作中無疑扮演著重要的角色,而網絡爬蟲則是搜索引擎技術的最基礎部分。
一、網絡爬蟲概述
在搜索引擎成為主流檢索工具的今天,互聯(lián)網上的網絡爬蟲各式各樣,但爬蟲爬取網頁的基本步驟大致相同:
1) 人工給定一個URL作為入口,從這里開始爬取。
萬維網的可視圖呈蝴蝶型,網絡爬蟲一般從蝴蝶型左邊結構出發(fā)。這里有一些門戶網站的主頁,而門戶網站中包含大量有價值的鏈接。
2) 用運行隊列和完成隊列來保存不同狀態(tài)的鏈接。
對于大型數(shù)據量而言,內存中的隊列是不夠的,通常采用數(shù)據庫模擬隊列。用這種方法既可以進行海量的數(shù)據抓取,還可以擁有斷點續(xù)抓功能。
3) 線程從運行隊列讀取隊首URL,如果存在,則繼續(xù)執(zhí)行,反之則停止爬取。
4) 每處理完一個URL,將其放入完成隊列,防止重復訪問。
5) 每次抓取網頁之后分析其中的URL(URL是字符串形式,功能類似指針),將經過過濾的合法鏈接寫入運行隊列,等待提取。
6) 重復步驟 3)、4)、5)。
1.1網頁搜索策略
萬維網高闊無邊,為了最大限度利用有限的資源,我們需要進行資源配置,并運用某些策略使爬蟲優(yōu)先爬取重要性較高的網頁。
目前主流的網頁搜索策略主要有三,即:深度優(yōu)先、廣度優(yōu)先、最佳優(yōu)先。
深度優(yōu)先,即從起始網頁開始,選擇一個URL,進入,分析這個網頁中的URL,選擇一個再進入。如此一個鏈接一個鏈接地深入追蹤下去,處理完一條路線之后再處理下一條路線。
有一個例子是:在封建制度中,封建帝王的繼承制度是長子優(yōu)先級最高,長孫次之,次子隨后。即如果長子去世,那么長孫的優(yōu)先級比次子高。
該類爬蟲設計時較為簡單。然而深度優(yōu)先型網絡爬蟲存在一個問題:門戶網站提供的鏈接往往最具價值,PageRank也很高,而每深入一層,網頁價值和PageRank都會相應地有所下降。這暗示了重要網頁通常距離種子較近,而過度深入抓取到的網頁卻價值很低。
由于這個缺陷,廣度優(yōu)先策略產生了。
廣度優(yōu)先(又稱寬度優(yōu)先),即從起始網頁開始,抓取其中所有鏈接的網頁,然后從中選擇一個,繼續(xù)抓取該網頁中的所有鏈接頁面。
網絡爬蟲在抓取網頁時普遍采用這種策略,這其中有兩個原因:
第一,萬維網的實際深度最大能達到17層,網頁之間四通八達,因此存在從一個網頁到另一個網頁的最短路徑問題。如果采用深度優(yōu)先,則有可能從一個PageRank很低的網頁爬取到一個PageRank實際很高的網頁,不方便計算PageRank(個人理解)。
第二,采用寬度優(yōu)先策略有利于多個爬蟲并行爬取。這種多爬蟲合作抓取通常是先抓取站內鏈接,遇到站外連接就爬出去,抓取的封閉性很強。
廣度優(yōu)先策略的優(yōu)點在于其設計和實現(xiàn)相對簡單,且這種策略的基本思想是:與種子在一定距離內的網頁重要度較高,符合實際。
在聚焦爬蟲的應用中,廣度優(yōu)先策略可以與網頁過濾技術結合,即先用廣度優(yōu)先抓取一些網頁,再將其中與主題無關的過濾掉。但這種方法的缺點是隨著抓取網頁的增多,算法的效率會變低。
另外,還有一種常用于聚焦爬蟲的網頁搜索策略——最佳優(yōu)先策略。
最佳優(yōu)先,即按照某種網頁分析算法預測候選URL與目標網頁的相似度,或主題的相關性,并選取其中評價最好的一個或幾個URL進行進一步的爬取。
這種策略的缺陷是可能會有很多相關網頁被忽略,但相對的,這種策略可以將無關網頁數(shù)量降低30%—90%。
1.2對URL的獲取和處理
網絡爬蟲訪問的是后臺html代碼,它分析出URL之后,對其進行過濾并將結果放入運行隊列。
在取得URL時要提防一種“爬蟲陷阱”。因為即使一個URL能訪問到相應內容,也不能保證服務器端有一個相應頁面存在,例如動態(tài)網頁的應用可能會使網站中存在一些無法窮盡的地址,讓爬蟲在一個位置上無限循環(huán)而無法終結。
針對“爬蟲陷阱”,其中一種應對方法是:檢查URL長度(或“”的數(shù)量),一旦超出某個閾值就不再獲取。
鏈接過濾處理涉及兩個數(shù)組,第一個是“必須存在的關鍵字”組。分析鏈接時,鏈接中必須存在這個數(shù)組中所有關鍵字(例如關鍵字為http和index,則httpwww.mysite.comindex符合要求,而httpwww.mysite.comhtml不符合要求)。另一個是“不可存在的關鍵字”組。分析鏈接時,鏈接中必須不存在這個數(shù)組中任何一個關鍵字(例如關鍵字為index,則httpwww.mysite.comindex不符合要求)。
對關鍵字的過濾方法包括以下兩種:
1) 只取得包含給定關鍵字的鏈接,這樣取得的鏈接為內部鏈接。
2) 只取得不包含給定關鍵字的鏈接,這樣取得的鏈接為外部鏈接。
1.3頁面選取問題
為提高資源利用率,我們需要盡可能提取最為重要的網頁。
網頁的重要程度判斷有許多依據,如:鏈接的歡迎程度(通過反向鏈接判斷)、鏈接的重要度(通過某種URL函數(shù)判斷,如認為包含.com和home的URL重要度高于包含.cc和map的網頁)、鏈接平均深度(通過距離種子的深度判斷)、歷史權重、網頁質量等。
當需要判斷網頁與某些給定關鍵字的相關性時,我們需要利用網頁分析算法。
網頁分析算主要有以下三種:基于網頁拓補、基于網頁內容、基于用戶訪問。
基于網頁拓補,即通過已知的網頁或數(shù)據,對其有間接關系的網頁或網站做出評價的算法,這種算法廣泛應用于實時搜索,其中又包括:網頁粒度分析算法、網站粒度分析算法、網頁塊粒度分析算法三種。
1、網頁粒度分析算法
常見的有鏈接分析算法PageRank和hits,兩者都得到網頁的重要度評價。
其中PageRank考慮了用戶訪問行為的隨機性和sink網頁,但忽略了大多數(shù)用戶訪問時具有目的性的事實。針對這個問題,hits提出了權威性網頁和中心型網頁兩個概念。
2、網站粒度分析算法
比網頁粒度分析算法更加簡單有效,其關鍵在于站點的劃分和評級,SiteRank的計算方法與PageRank類似。利用分布式SiteRank計算,不僅降低了單機站點的算法代價,而且克服了單獨站點對整個網絡覆蓋率有限的缺點。另外,SiteRank不會被常見的針對PageRank的造假所蒙騙。
3、網頁塊粒度分析算法
基本思想是通過某種網頁分割算法,將網頁分為不同網頁塊,排除其中與主題無關的鏈接后在進行進一步處理。這種分析算法可以避免廣告等噪聲鏈接的干擾。
基于網頁內容,即利用網頁內容(文本、錨文本、其他數(shù)據等)特征進行的網頁評價。其針對網頁數(shù)據形式不同可分為三類:
1、針對以文本和超鏈接為主的無結構或結構很簡單的網頁。
隨著如今網頁內容的多樣化,該方法已不再單獨使用。
2、針對從結構化的數(shù)據源(RDBMS)動態(tài)生成的頁面,其數(shù)據不能直接批量訪問。
3、介于1和2之間的,具有較好結構,遵循一定模式或風格,可直接訪問的網頁。
在提取html文檔的文本信息時要過濾標識符,但同時還要注意依照標識符來取得版式信息(如標題、粗體、關鍵字等),另外還要過濾無用鏈接(如廣告鏈接)。
錨文本可以作為所在頁面內容的評估和所指向的頁面內容的評估,還可以收集一些搜索引擎不能索引的文件(例如圖片)。
多媒體,圖片等文件一般通過錨文本和相關文件注釋來判斷文件內容。
對于doc、pdf等有專業(yè)廠商提供的軟件生成的文檔,廠商會會為爬蟲提供相應的文本提取接口的插件。
Google對網頁優(yōu)先性的考慮因素有以下幾點:
1)查詢驅動的爬取
此方法適于實時搜索。對于一些最新出現(xiàn)的熱門話題,或隨時變動的數(shù)據(如股市信息),數(shù)據庫里沒有這些網頁的信息,如果此時接受了用戶的查詢,則會通過已爬取的其他網頁來判斷未爬取的網頁的相關性。
2)反向鏈接數(shù)
3)PageRank值
4)前向鏈接數(shù)
5)路徑深度
路徑深度淺的頁面被認為更重要。
1.4網頁去重方法
網頁之間的鏈接關系錯綜復雜,為了避免重復抓取同一頁面,要把需要入庫的鏈接與數(shù)據庫中的運行隊列和完成隊列都進行比較。
另外,大型搜索引擎多采取多爬蟲并行合作抓取的方法,這也產生了一些問題。
例如Google為了避免多爬蟲合作時重復抓取同一頁面,而采用了Crawl Caching Proxy(緩存代理)。
網絡爬蟲在工作時,首先通過DNS解析一個URL的主機IP地址,然后連接相應服務器的端口并發(fā)送請求,通過服務器響應來獲取相關頁面內容。
URL與IP之間的對應關系可能是一對一、一對多或多對一的。
一個URL對應多個IP通常出現(xiàn)在訪問量較大的域名,將一個URL與多個IP綁定以分流訪問量,減小單個服務器的訪問壓力(如Baidu、Google);一個IP對應多個URL則是出于節(jié)約服務器的目的,或是由于公網IP地址匱乏而產生的策略,當客戶端對該IP進行訪問時,先通過請求的協(xié)議頭部來獲取需要訪問的URL,再將該請求通過反向代理或虛擬主機的方式轉發(fā)到相應服務。
由于這種情況,若用IP作為判斷重復網頁的標準,則可能因為URL與IP的一對多而出現(xiàn)重復獲取,或因為URL與IP的多對一而出現(xiàn)遺漏。因此,爬蟲在判斷重復頁面時主要以URL所謂判斷標準,以保證服務的唯一性。
1.5網絡爬蟲的效率
單線程的爬蟲由于頁面的分析和下載不能同時而效率較低,因此出現(xiàn)了多線程爬蟲。有一個例子可以幫助理解多線程的意義:現(xiàn)在很多下載軟件都支持多線程同步下載,即將下載內容分成幾部分同步下載,速度比單線程要快上很多。
爬蟲采用線程進行循環(huán),但這存在一定弊端:一旦發(fā)生網絡阻塞,整個線程就一直處于等待狀態(tài)而導致死亡。
一般采取線程監(jiān)控的方法來解決,即存在一個主線程和一個監(jiān)控線程,監(jiān)控線程每隔一段時間去訪問一次主線程并與其分享的變量,一旦發(fā)現(xiàn)超時,就認為網絡阻塞,這時終止主線程并重新啟動,由此避免了網絡阻塞導致線程一直等待的問題。
1.6網頁更新
對于搜索引擎而言,評價網絡爬蟲效率的一個重要標準是爬蟲的開銷。
爬蟲開銷 = 重復抓取的老頁面數(shù) 發(fā)掘的新頁面數(shù)
即是說,爬蟲應當盡量發(fā)掘新頁面而減少重復頁面的爬取,而決定對某個網頁的更新頻率涉及到時間更新控制。
一般做法是將這次抓取到的頁面上的數(shù)據與上一次相比較,如果進行連續(xù)五次這樣的比較都沒有變化,則將以后爬取該網頁的時間擴大為原來的2倍;如果進行連續(xù)五次這樣的比較都有變化,則將以后爬取該網頁的時間縮短為原來的12。
另外,爬蟲在更新網頁內容時,不需要將網頁重新抓取一遍,只需對網頁的一些屬性加以判斷(如日期),并與上次結果相比即可,如果相同則無需更新。
1.7實時搜索
設想當用戶查詢一個熱門話題,而爬蟲還未抓取相關網頁,這時就不能在用PageRank來評價網頁重要性了。PageRank的計算對象是已經抓取下來的網頁,即,在計算PageRank過程中不會有新頁面加入,這種方法被稱為“離線”(off-line)的計算方法。這種方法適合于對結果的排序,但不適用于爬蟲的調度(即動態(tài)決定URL的抓取順序),因而誕生了一種OPIC (On-line Page Importance Computation)的新型算法策略。
OPIC的基本思想是:每個頁面有一個初始cash,在抓取過程中,通過前向鏈接將cash平均分給該網頁指向的所有頁面(分配過程一次完成),而爬蟲在爬取過程中只需優(yōu)先抓取cash較多的頁面。
1.8其他
1、對于一些出售資料的網站,他們希望搜索引擎能所引導他們的資料,但又不能無償將資料的全部內容提供給搜索用戶。因此,他們?yōu)榫W絡爬蟲提供了專門的用戶名和密碼,設置一定的權限,是爬蟲能夠對網頁進行爬取而又不會讓用戶看到全部內容(用戶點開網頁時,需要提供權限驗證)。
2、每個網絡爬蟲都有自己的名字。在抓取網頁時會向服務器端發(fā)送請求,該請求中包含一個用于表示爬蟲身份的字段,這個請求會留在訪問日志記錄中,便于網站管理員查看。
3、爬蟲進入網站時會先訪問網站服務器根目錄下的robots.txt,這個協(xié)議告訴爬蟲網站中那些內容希望被抓取,那些內容不希望被抓取。該協(xié)議不具備強制力。
二、網絡爬蟲實例
2.1 Heritrix
Heritrix是一個爬蟲框架,可以加入一些可互換的組件。Heritrix是用來獲取完整精確的網站內容的爬蟲,除文本內容之外,它還獲取其他非文本內容(如圖片等)并對其進行處理,且不對網頁內容進行修改。當重復爬行相同URL時,不會對先前網頁進行替換。
Heritrix主要有以下幾步:
1)在預定的URL中選擇一個并獲取。
2)分析,并將結果歸檔。
3)選擇已經發(fā)現(xiàn)的感興趣的URL,加入運行隊列。
4)標記已經處理過的URL
Heritrix利用廣度優(yōu)先策略來進行網頁獲取,其主要部件都具有高效性和可擴展性。然而Heritrix也有其一定的局限性,如:
只支持單線程爬蟲,多爬蟲之間不能合作;
操作復雜,對有限的資源來說是一個問題;
在硬件是系統(tǒng)失敗時,其恢復能力較差等等。
2.2 Nutch
Nutch深度遍歷網站資源,將這些資源抓取到本地,使用的方法都是分析網站每一個有效的URL并向服務器端提交請求來獲得相應結果,生成本地文件及相應的日志信息等。
Nutch與Heritrix有幾點差異,即:
1)Nutch只獲取并保存可索引的內容。
2)Nutch 可以修剪內容,或者對內容格式進行轉換。
3)Nutch 保存內容為數(shù)據庫優(yōu)化格式,便于以后索引;且對重復URL,刷新替換舊的內容。
4)Nutch 從命令行運行、控制。
5)Nutch 的定制能力不夠強(不過現(xiàn)在已經有了一定改進)。
2.3 Larbin
Larbin不同于以上兩種網絡爬蟲,它只抓取網頁,而不提供包括分析網頁、將結果存儲到數(shù)據庫以及建立索引等服務。
Larbin的目的是對頁面上的URL進行擴展性的抓取,為搜索引擎提供廣泛的數(shù)據來源。雖然工作能力較為單一,但Larbin勝在其高度可配置性和良好的工作效率(一個簡單的larbin的爬蟲可以每天獲取500萬的網頁),這也是Larbin最初的設計理念。
2.4 Lucene
Lucene 是一個基于Java的全文信息檢索工具包,它本身不是一個完整的全文索引應用程序,而是為各種應用程序提供索引和搜索功能。只要能把要索引的數(shù)據轉化的文本格式,Lucene 就能對該文檔進行索引和搜索。
Lucene采用的是一種稱為反向索引(inverted index)的方法。因此,在用戶輸入查詢條件的時候,Lucebne能非常快地得到搜索結果。
對文檔建立好索引后,搜索引擎首先會對關鍵詞進行解析,然后在建立好的索引上面進行查找并返回和用戶輸入的關鍵詞相關聯(lián)的文檔。
上海先予工業(yè)自動化設備有限公司以自主核心技術和系統(tǒng)集成優(yōu)勢為依托,針對企業(yè)用戶在生產過程控制中的各種復雜控制要求,采用DCS和PLC等控制系統(tǒng)為企業(yè)量身定制,技術先進、可靠性高、經濟實用的電氣和自動化控制,生產,輸送,包裝、清洗系統(tǒng),提供完整的非標制定自動化生產解決方案,從而有效為企業(yè)降低勞動力成本、提高品質、提升效率。