隨著搜索經(jīng)濟的崛起,人們開始越加關(guān)注全球各大搜索引擎的性能、技術(shù)和日流量。作為企業(yè),會根據(jù)搜索引擎的知名度以及日流量來選擇是否要投放廣告等;作為普通網(wǎng)民,會根據(jù)搜索引擎的性能和技術(shù)來選擇自己喜歡的引擎查找資料;作為學者,會把有代表性的搜索引擎作為研究對象……
而作為一個網(wǎng)站的經(jīng)營者,其更關(guān)心的或許是如何通過網(wǎng)絡(luò)載體讓更多的網(wǎng)民知道自己的網(wǎng)站,進而獲得更高的流量和知名度。這其中,搜索引擎已經(jīng)成了一個重要的且是免費的宣傳途徑。一方面,搜索引擎會主動出擊,尋找網(wǎng)絡(luò)上的各種網(wǎng)頁數(shù)據(jù),并在后臺按相關(guān)條件進行索引;另一方面,各大網(wǎng)站為了能讓自己的內(nèi)容更多的通過搜索引擎向網(wǎng)民展示,都開始對網(wǎng)站結(jié)構(gòu)進行重大調(diào)整,其中包括扁平化結(jié)構(gòu)設(shè)計、動態(tài)(網(wǎng)頁)轉(zhuǎn)靜態(tài)(網(wǎng)頁)、Sitemap等。
這些看來不經(jīng)意的舉動都讓我們切身感受到搜索引擎對我們網(wǎng)絡(luò)使用方式的改變起到了重要作用。并且,正因為搜索引擎的興起以及社會各界對其重視程度日漸高漲,還由此創(chuàng)造了一個全新的職位——SEO。實際上,搜索引擎經(jīng)濟的崛起,又一次向人們證明了網(wǎng)絡(luò)所蘊藏的巨大商機。網(wǎng)絡(luò)離開了搜索將只剩下空洞雜亂的數(shù)據(jù),以及大量等待去費力挖掘的金礦。
搜索引擎一直專注于提升用戶的體驗度,其用戶體驗度則反映在三個方面: 準、全、快 。用專業(yè)術(shù)語講是:查準率、查全率和搜索速度(即搜索耗時)。其中最易達到的是搜索速度,因為對于搜索耗時在1秒以下的系統(tǒng)來說,訪問者很難辨別其快慢了,更何況還有網(wǎng)絡(luò)速度的影響。因此,對搜索引擎的評價就集中在了前兩者:準、全。中文搜索引擎的“準”,需要保證搜索的前幾十條結(jié)果都和搜索詞十分相關(guān),這需由“ 分詞技術(shù) ”和“ 排序技術(shù) ”來決定;中文搜索引擎的“全”則需保證不遺漏某些重要的結(jié)果,而且能找到最新的網(wǎng)頁,這需要搜索引擎有一個強大的網(wǎng)頁收集器,一般稱為“網(wǎng)絡(luò)蜘蛛”,也有叫“網(wǎng)頁機器人”。
研究搜索引擎技術(shù)的文章不少,但大部分討論的是如何評價網(wǎng)頁的重要性,對于網(wǎng)絡(luò)蜘蛛研究的文章不多。網(wǎng)絡(luò)蜘蛛技術(shù)并不是一項十分高深的技術(shù),但要做一個強大的網(wǎng)絡(luò)蜘蛛,卻非易事。在目前磁盤容量已經(jīng)不是瓶頸的時候,搜索引擎一直在擴大自己的網(wǎng)頁數(shù)量。最大的搜索引擎Google( http://www.google.com )從2002年的10億網(wǎng)頁增加到現(xiàn)在近40億網(wǎng)頁;最近雅虎搜索引擎( http://search.yahoo.com/ )號稱收錄了45億個網(wǎng)頁;國內(nèi)的中文搜索引擎百度( http://www.baidu.com )的中文頁面從兩年前的七千萬頁增加到了現(xiàn)在的兩億多。據(jù)估計,整個互聯(lián)網(wǎng)的網(wǎng)頁數(shù)達到100多億,而且每年還在快速增長。因此一個優(yōu)秀的搜索引擎,需要不斷的優(yōu)化網(wǎng)絡(luò)蜘蛛的算法,提升其性能。
或許有些人有疑問,為何搜索引擎需要用網(wǎng)絡(luò)蜘蛛抓取網(wǎng)站所有的網(wǎng)頁,為什么不在搜索者輸入關(guān)鍵詞后只把那些需要的結(jié)果抓取過來?這實際上是效率問題,搜索引擎不可能在搜索時實時去檢查每個網(wǎng)頁,而是需要把網(wǎng)頁先抓取下來,按照關(guān)鍵詞建立好索引,每次搜索的結(jié)果都會直接從搜索引擎建立好索引的數(shù)據(jù)庫中查找,然后把結(jié)果返回給訪問者。 關(guān)于搜索引擎系統(tǒng)架構(gòu)方面的知識, 本文主要介紹網(wǎng)絡(luò)蜘蛛的相關(guān)技術(shù)。
網(wǎng)絡(luò)蜘蛛基本原理
網(wǎng)絡(luò)蜘蛛即Web Spider,是一個很形象的名字。把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來爬去的蜘蛛。網(wǎng)絡(luò)蜘蛛是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁,從網(wǎng)站某一個頁面(通常是首頁)開始,讀取網(wǎng)頁的內(nèi)容,找到在網(wǎng)頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網(wǎng)頁,這樣一直循環(huán)下去,直到把這個網(wǎng)站所有的網(wǎng)頁都抓取完為止。如果把整個互聯(lián)網(wǎng)當成一個網(wǎng)站,那么網(wǎng)絡(luò)蜘蛛就可以用這個原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁都抓取下來。
對于搜索引擎來說,要抓取互聯(lián)網(wǎng)上所有的網(wǎng)頁幾乎是不可能的,從目前公布的數(shù)據(jù)來看,容量最大的搜索引擎也不過是抓取了整個網(wǎng)頁數(shù)量的百分之四十左右。這其中的原因一方面是抓取技術(shù)的瓶頸,無法遍歷所有的網(wǎng)頁,有許多網(wǎng)頁無法從其它網(wǎng)頁的鏈接中找到;另一個原因是存儲技術(shù)和處理技術(shù)的問題,如果按照每個頁面的平均大小為20K計算(包含圖片),100億網(wǎng)頁的容量是100×2000G字節(jié),即使能夠存儲,下載也存在問題(按照一臺機器每秒下載20K計算,需要340臺機器不停的下載一年時間,才能把所有網(wǎng)頁下載完畢)。同時,由于數(shù)據(jù)量太大,在提供搜索時也會有效率方面的影響。因此,許多搜索引擎的網(wǎng)絡(luò)蜘蛛只是抓取那些重要的網(wǎng)頁,而在抓取的時候評價重要性主要的依據(jù)是某個網(wǎng)頁的鏈接深度。
在抓取網(wǎng)頁的時候,網(wǎng)絡(luò)蜘蛛一般有兩種策略:廣度優(yōu)先和深度優(yōu)先(如下圖所示)。廣度優(yōu)先是指網(wǎng)絡(luò)蜘蛛會先抓取起始網(wǎng)頁中鏈接的所有網(wǎng)頁,然后再選擇其中的一個鏈接網(wǎng)頁,繼續(xù)抓取在此網(wǎng)頁中鏈接的所有網(wǎng)頁。這是最常用的方式,因為這個方法可以讓網(wǎng)絡(luò)蜘蛛并行處理,提高其抓取速度。深度優(yōu)先是指網(wǎng)絡(luò)蜘蛛會從起始頁開始,一個鏈接一個鏈接跟蹤下去,處理完這條線路之后再轉(zhuǎn)入下一個起始頁,繼續(xù)跟蹤鏈接。這個方法有個優(yōu)點是網(wǎng)絡(luò)蜘蛛在設(shè)計的時候比較容易。兩種策略的區(qū)別,下圖的說明會更加明確。

由于不可能抓取所有的網(wǎng)頁,有些網(wǎng)絡(luò)蜘蛛對一些不太重要的網(wǎng)站,設(shè)置了訪問的層數(shù)。例如,在上圖中,A為起始網(wǎng)頁,屬于0層,B、C、D、E、F屬于第1層,G、H屬于第2層,I屬于第3層。如果網(wǎng)絡(luò)蜘蛛設(shè)置的訪問層數(shù)為2的話,網(wǎng)頁I是不會被訪問到的。這也讓有些網(wǎng)站上一部分網(wǎng)頁能夠在搜索引擎上搜索到,另外一部分不能被搜索到。 對于網(wǎng)站設(shè)計者來說,扁平化的網(wǎng)站結(jié)構(gòu)設(shè)計有助于搜索引擎抓取其更多的網(wǎng)頁。
網(wǎng)絡(luò)蜘蛛在訪問網(wǎng)站網(wǎng)頁的時候,經(jīng)常會遇到加密數(shù)據(jù)和網(wǎng)頁權(quán)限的問題,有些網(wǎng)頁是需要會員權(quán)限才能訪問。當然,網(wǎng)站的所有者可以通過協(xié)議讓網(wǎng)絡(luò)蜘蛛不去抓。ㄏ滦」(jié)會介紹),但對于一些出售報告的網(wǎng)站,他們希望搜索引擎能搜索到他們的報告,但又不能完全免費的讓搜索者查看,這樣就需要給網(wǎng)絡(luò)蜘蛛提供相應的用戶名和密碼。網(wǎng)絡(luò)蜘蛛可以通過所給的權(quán)限對這些網(wǎng)頁進行網(wǎng)頁抓取,從而提供搜索。而當搜索者點擊查看該網(wǎng)頁的時候,同樣需要搜索者提供相應的權(quán)限驗證。
網(wǎng)站與網(wǎng)絡(luò)蜘蛛
網(wǎng)絡(luò)蜘蛛需要抓取網(wǎng)頁,不同于一般的訪問,如果控制不好,則會引起網(wǎng)站服務(wù)器負擔過重。今年4月,淘寶網(wǎng)( http://www.taobao.com )就因為雅虎搜索引擎的網(wǎng)絡(luò)蜘蛛抓取其數(shù)據(jù)引起淘寶網(wǎng)服務(wù)器的不穩(wěn)定。網(wǎng)站是否就無法和網(wǎng)絡(luò)蜘蛛交流呢?其實不然,有多種方法可以讓網(wǎng)站和網(wǎng)絡(luò)蜘蛛進行交流。一方面讓網(wǎng)站管理員了解網(wǎng)絡(luò)蜘蛛都來自哪兒,做了些什么,另一方面也告訴網(wǎng)絡(luò)蜘蛛哪些網(wǎng)頁不應該抓取,哪些網(wǎng)頁應該更新。
每個網(wǎng)絡(luò)蜘蛛都有自己的名字,在抓取網(wǎng)頁的時候,都會向網(wǎng)站標明自己的身份。網(wǎng)絡(luò)蜘蛛在抓取網(wǎng)頁的時候會發(fā)送一個請求,這個請求中就有一個字段為User-agent,用于標識此網(wǎng)絡(luò)蜘蛛的身份。例如Google網(wǎng)絡(luò)蜘蛛的標識為GoogleBot,Baidu網(wǎng)絡(luò)蜘蛛的標識為BaiDuSpider,Yahoo網(wǎng)絡(luò)蜘蛛的標識為Inktomi Slurp。如果在網(wǎng)站上有訪問日志記錄,網(wǎng)站管理員就能知道,哪些搜索引擎的網(wǎng)絡(luò)蜘蛛過來過,什么時候過來的,以及讀了多少數(shù)據(jù)等等。如果網(wǎng)站管理員發(fā)現(xiàn)某個蜘蛛有問題,就通過其標識來和其所有者聯(lián)系。下面是博客中國( http://www.blogchina.com )2004年5月15日的搜索引擎訪問日志:
 網(wǎng)絡(luò)蜘蛛進入一個網(wǎng)站,一般會訪問一個特殊的文本文件Robots.txt,這個文件一般放在網(wǎng)站服務(wù)器的根目錄下,如: http://www.blogchina.com/robots.txt 。網(wǎng)站管理員可以通過robots.txt來定義哪些目錄網(wǎng)絡(luò)蜘蛛不能訪問,或者哪些目錄對于某些特定的網(wǎng)絡(luò)蜘蛛不能訪問。例如有些網(wǎng)站的可執(zhí)行文件目錄和臨時文件目錄不希望被搜索引擎搜索到,那么網(wǎng)站管理員就可以把這些目錄定義為拒絕訪問目錄。Robots.txt語法很簡單,例如如果對目錄沒有任何限制,可以用以下兩行來描述: User-agent: * Disallow:
當然,Robots.txt只是一個協(xié)議,如果網(wǎng)絡(luò)蜘蛛的設(shè)計者不遵循這個協(xié)議,網(wǎng)站管理員也無法阻止網(wǎng)絡(luò)蜘蛛對于某些頁面的訪問,但一般的網(wǎng)絡(luò)蜘蛛都會遵循這些協(xié)議,而且網(wǎng)站管理員還可以通過其它方式來拒絕網(wǎng)絡(luò)蜘蛛對某些網(wǎng)頁的抓取。
網(wǎng)絡(luò)蜘蛛在下載網(wǎng)頁的時候,會去識別網(wǎng)頁的HTML代碼,在其代碼的部分,會有META標識。通過這些標識,可以告訴網(wǎng)絡(luò)蜘蛛本網(wǎng)頁是否需要被抓取,還可以告訴網(wǎng)絡(luò)蜘蛛本網(wǎng)頁中的鏈接是否需要被繼續(xù)跟蹤。例如: 表示本網(wǎng)頁不需要被抓取,但是網(wǎng)頁內(nèi)的鏈接需要被跟蹤。
關(guān)于Robots.txt的語法和META Tag語法,有興趣的讀者查看文獻[4]
現(xiàn)在一般的網(wǎng)站都希望搜索引擎能更全面的抓取自己網(wǎng)站的網(wǎng)頁,因為這樣可以讓更多的訪問者能通過搜索引擎找到此網(wǎng)站。為了讓本網(wǎng)站的網(wǎng)頁更全面被抓取到,網(wǎng)站管理員可以建立一個網(wǎng)站地圖,即Site Map。許多網(wǎng)絡(luò)蜘蛛會把sitemap.htm文件作為一個網(wǎng)站網(wǎng)頁爬取的入口,網(wǎng)站管理員可以把網(wǎng)站內(nèi)部所有網(wǎng)頁的鏈接放在這個文件里面,那么網(wǎng)絡(luò)蜘蛛可以很方便的把整個網(wǎng)站抓取下來,避免遺漏某些網(wǎng)頁,也會減小對網(wǎng)站服務(wù)器的負擔。
內(nèi)容提取
搜索引擎建立網(wǎng)頁索引,處理的對象是文本文件。對于網(wǎng)絡(luò)蜘蛛來說,抓取下來網(wǎng)頁包括各種格式,包括html、圖片、doc、pdf、多媒體、動態(tài)網(wǎng)頁及其它格式等。這些文件抓取下來后,需要把這些文件中的文本信息提取出來。準確提取這些文檔的信息,一方面對搜索引擎的搜索準確性有重要作用,另一方面對于網(wǎng)絡(luò)蜘蛛正確跟蹤其它鏈接有一定影響。
對于doc、pdf等文檔,這種由專業(yè)廠商提供的軟件生成的文檔,廠商都會提供相應的文本提取接口。網(wǎng)絡(luò)蜘蛛只需要調(diào)用這些插件的接口,就可以輕松的提取文檔中的文本信息和文件其它相關(guān)的信息。
HTML等文檔不一樣,HTML有一套自己的語法,通過不同的命令標識符來表示不同的字體、顏色、位置等版式,如:、、 等,提取文本信息時需要把這些標識符都過濾掉。過濾標識符并非難事,因為這些標識符都有一定的規(guī)則,只要按照不同的標識符取得相應的信息即可。但在識別這些信息的時候,需要同步記錄許多版式信息,例如文字的字體大小、是否是標題、是否是加粗顯示、是否是頁面的關(guān)鍵詞等,這些信息有助于計算單詞在網(wǎng)頁中的重要程度。同時,對于HTML網(wǎng)頁來說,除了標題和正文以外,會有許多廣告鏈接以及公共的頻道鏈接,這些鏈接和文本正文一點關(guān)系也沒有,在提取網(wǎng)頁內(nèi)容的時候,也需要過濾這些無用的鏈接。例如某個網(wǎng)站有“產(chǎn)品介紹”頻道,因為導航條在網(wǎng)站內(nèi)每個網(wǎng)頁都有,若不過濾導航條鏈接,在搜索“產(chǎn)品介紹”的時候,則網(wǎng)站內(nèi)每個網(wǎng)頁都會搜索到,無疑會帶來大量垃圾信息。過濾這些無效鏈接需要統(tǒng)計大量的網(wǎng)頁結(jié)構(gòu)規(guī)律,抽取一些共性,統(tǒng)一過濾;對于一些重要而結(jié)果特殊的網(wǎng)站,還需要個別處理。這就需要網(wǎng)絡(luò)蜘蛛的設(shè)計有一定的擴展性。
對于多媒體、圖片等文件,一般是通過鏈接的錨文本(即,鏈接文本)和相關(guān)的文件注釋來判斷這些文件的內(nèi)容。例如有一個鏈接文字為“張曼玉照片”,其鏈接指向一張bmp格式的圖片,那么網(wǎng)絡(luò)蜘蛛就知道這張圖片的內(nèi)容是“張曼玉的照片”。這樣,在搜索“張曼玉”和“照片”的時候都能讓搜索引擎找到這張圖片。另外,許多多媒體文件中有文件屬性,考慮這些屬性也可以更好的了解文件的內(nèi)容。 動態(tài)網(wǎng)頁一直是網(wǎng)絡(luò)蜘蛛面臨的難題。所謂動態(tài)網(wǎng)頁,是相對于靜態(tài)網(wǎng)頁而言,是由程序自動生成的頁面,這樣的好處是可以快速統(tǒng)一更改網(wǎng)頁風格,也可以減少網(wǎng)頁所占服務(wù)器的空間,但同樣給網(wǎng)絡(luò)蜘蛛的抓取帶來一些麻煩。由于開發(fā)語言不斷的增多,動態(tài)網(wǎng)頁的類型也越來越多,如:asp、jsp、php等。這些類型的網(wǎng)頁對于網(wǎng)絡(luò)蜘蛛來說,可能還稍微容易一些。網(wǎng)絡(luò)蜘蛛比較難于處理的是一些腳本語言(如VBScript和JavaScript)生成的網(wǎng)頁,如果要完善的處理好這些網(wǎng)頁,網(wǎng)絡(luò)蜘蛛需要有自己的腳本解釋程序。對于許多數(shù)據(jù)是放在數(shù)據(jù)庫的網(wǎng)站,需要通過本網(wǎng)站的數(shù)據(jù)庫搜索才能獲得信息,這些給網(wǎng)絡(luò)蜘蛛的抓取帶來很大的困難。對于這類網(wǎng)站,如果網(wǎng)站設(shè)計者希望這些數(shù)據(jù)能被搜索引擎搜索,則需要提供一種可以遍歷整個數(shù)據(jù)庫內(nèi)容的方法。
對于網(wǎng)頁內(nèi)容的提取,一直是網(wǎng)絡(luò)蜘蛛中重要的技術(shù)。整個系統(tǒng)一般采用插件的形式,通過一個插件管理服務(wù)程序,遇到不同格式的網(wǎng)頁采用不同的插件處理。這種方式的好處在于擴充性好,以后每發(fā)現(xiàn)一種新的類型,就可以把其處理方式做成一個插件補充到插件管理服務(wù)程序之中。
更新周期
由于網(wǎng)站的內(nèi)容經(jīng)常在變化,因此網(wǎng)絡(luò)蜘蛛也需不斷的更新其抓取網(wǎng)頁的內(nèi)容,這就需要網(wǎng)絡(luò)蜘蛛按照一定的周期去掃描網(wǎng)站,查看哪些頁面是需要更新的頁面,哪些頁面是新增頁面,哪些頁面是已經(jīng)過期的死鏈接。 搜索引擎的更新周期對搜索引擎搜索的查全率有很大影響。如果更新周期太長,則總會有一部分新生成的網(wǎng)頁搜索不到;周期過短,技術(shù)實現(xiàn)會有一定難度,而且會對帶寬、服務(wù)器的資源都有浪費。搜索引擎的網(wǎng)絡(luò)蜘蛛并不是所有的網(wǎng)站都采用同一個周期進行更新,對于一些重要的更新量大的網(wǎng)站,更新的周期短,如有些新聞網(wǎng)站,幾個小時就更新一次;相反對于一些不重要的網(wǎng)站,更新的周期就長,可能一兩個月才更新一次。 一般來說,網(wǎng)絡(luò)蜘蛛在更新網(wǎng)站內(nèi)容的時候,不用把網(wǎng)站網(wǎng)頁重新抓取一遍,對于大部分的網(wǎng)頁,只需要判斷網(wǎng)頁的屬性(主要是日期),把得到的屬性和上次抓取的屬性相比較,如果一樣則不用更新。
結(jié)論
本文主要討論了網(wǎng)絡(luò)蜘蛛相關(guān)的技術(shù)要點,如果要設(shè)計好的網(wǎng)絡(luò)蜘蛛, 需要了解更多的技術(shù)細節(jié),可以參考文獻
網(wǎng)絡(luò)蜘蛛在搜索引擎中占有重要位置,對搜索引擎的查全、查準都有影響,決定了搜索引擎數(shù)據(jù)容量的大小,而且網(wǎng)絡(luò)蜘蛛的好壞直接影響搜索結(jié)果頁中的死鏈接(即鏈接所指向的網(wǎng)頁已經(jīng)不存在)的個數(shù)。目前如何發(fā)現(xiàn)更多的網(wǎng)頁、如何正確提取網(wǎng)頁內(nèi)容、如果下載動態(tài)網(wǎng)頁、如何提供抓取速度、如何識別網(wǎng)站內(nèi)內(nèi)容相同的網(wǎng)頁等都是網(wǎng)絡(luò)蜘蛛需要進一步改進的問題。
|