概述
而作為一個網站的經營者,其更關心的或許是如何通過網路載體讓更多的網民知道自己的網站,進而獲得更高的流量和知名度。這其中,搜尋引擎已經成了一個重要的且是免費的宣傳途徑。一方面,搜尋引擎會主動出擊,尋找網路上的各種網頁數據,並在後台按相關條件進行索引;另一方面,各大網站為了能讓自己的內容更多的通過搜尋引擎向網民展示,都開始對網站結構進行重大調整,其中包括扁平化結構設計、動態(網頁)轉靜態(網頁)、Sitemap等。
這些看來不經意的舉動都讓我們切身感受到搜尋引擎對我們網路使用方式的改變起到了重要作用。並且,正因為搜尋引擎的興起以及社會各界對其重視程度日漸高漲,還由此創造了一個全新的職位——SEO。實際上,搜尋引擎經濟的崛起,又一次向人們證明了網路所蘊藏的巨大商機。網路離開了搜尋將只剩下空洞雜亂的數據,以及大量等待去費力挖掘的金礦。
搜尋引擎體驗
搜尋引擎一直專注於提升用戶的體驗度,其用戶體驗度則反映在三個方面: 準、全、快 。用專業術語講是:查準率、查全率和搜尋速度(即搜尋耗時)。其中最易達到的是搜尋速度,因為對於搜尋耗時在1秒以下的系統來說,訪問者很難辨別其快慢了,更何況還有網路速度的影響。因此,對搜尋引擎的評價就集中在了前兩者:準、全。中文搜尋引擎的“準”,需要保證搜尋的前幾十條結果都和搜尋詞十分相關,這需由“ 分詞技術 ”和“ 排序技術 ”來決定;中文搜尋引擎的“全”則需保證不遺漏某些重要的結果,而且能找到最新的網頁,這需要搜尋引擎有一個強大的網頁收集器,一般稱為“網路蜘蛛”,也有叫“網頁機器人”。
研究搜尋引擎技術的文章不少,但大部分討論的是如何評價網頁的重要性,對於網路蜘蛛研究的文章不多。網路蜘蛛技術並不是一項十分高深的技術,但要做一個強大的網路蜘蛛,卻非易事。在目前磁碟容量已經不是瓶頸的時候,搜尋引擎一直在擴大自己的網頁數量。最大的搜尋引擎Google( /wiki/http://www.google.com)從2002年的10億網頁增加到現在近40億網頁;最近雅虎搜尋引擎( /wiki/http://search.yahoo.com/)號稱收錄了45億個網頁;國內的中文搜尋引擎百度( http://www.baidu.com)的中文頁面從兩年前的七千萬頁增加到了現在的兩億多。據估計,整個網際網路的網頁數達到100多億,而且每年還在快速增長。因此一個優秀的搜尋引擎,需要不斷的最佳化網路蜘蛛的算法,提升其性能。
網路蜘蛛
或許有些人有疑問,為何搜尋引擎需要用網路蜘蛛抓取網站所有的網頁,為什麼不在搜尋者輸入關鍵字後只把那些需要的結果抓取過來?這實際上是效率問題,搜尋引擎不可能在搜尋時實時去檢查每個網頁,而是需要把網頁先抓取下來,按照關鍵字建立好索引,每次搜尋的結果都會直接從搜尋引擎建立好索引的資料庫中查找,然後把結果返回給訪問者。 關於搜尋引擎系統架構方面的知識, 本文主要介紹網路蜘蛛的相關技術。
網路蜘蛛基本原理
網路蜘蛛即Web Spider,是一個很形象的名字。把網際網路比喻成一個蜘蛛網,那么Spider就是在網上爬來爬去的蜘蛛。網路蜘蛛是通過網頁的連結地址來尋找網頁,從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結地址,然後通過這些連結地址尋找下一個網頁,這樣一直循環下去,直到把這個網站所有的網頁都抓取完為止。如果把整個網際網路當成一個網站,那么網路蜘蛛就可以用這個原理把網際網路上所有的網頁都抓取下來。對於搜尋引擎來說,要抓取網際網路上所有的網頁幾乎是不可能的,從目前公布的數據來看,容量最大的搜尋引擎也不過是抓取了整個網頁數量的百分之四十左右。這其中的原因一方面是抓取技術的瓶頸,無法遍歷所有的網頁,有許多網頁無法從其它網頁的連結中找到;另一個原因是存儲技術和處理技術的問題,如果按照每個頁面的平均大小為20K計算(包含圖片),100億網頁的容量是100×2000G位元組,即使能夠存儲,下載也存在問題(按照一台機器每秒下載20K計算,需要340台機器不停的下載一年時間,才能把所有網頁下載完畢)。同時,由於數據量太大,在提供搜尋時也會有效率方面的影響。因此,許多搜尋引擎的網路蜘蛛只是抓取那些重要的網頁,而在抓取的時候評價重要性主要的依據是某個網頁的連結深度。
在抓取網頁的時候,網路蜘蛛一般有兩種策略:廣度優先和深度優先(如下圖所示)。廣度優先是指網路蜘蛛會先抓取起始網頁中連結的所有網頁,然後再選擇其中的一個連結網頁,繼續抓取在此網頁中連結的所有網頁。這是最常用的方式,因為這個方法可以讓網路蜘蛛並行處理,提高其抓取速度。深度優先是指網路蜘蛛會從起始頁開始,一個連結一個連結跟蹤下去,處理完這條線路之後再轉入下一個起始頁,繼續跟蹤連結。這個方法有個優點是網路蜘蛛在設計的時候比較容易。兩種策略的區別,下圖的說明會更加明確。
由於不可能抓取所有的網頁,有些網路蜘蛛對一些不太重要的網站,設定了訪問的層數。例如,在上圖中,A為起始網頁,屬於0層,B、C、D、E、F屬於第1層,G、H屬於第2層,I屬於第3層。如果網路蜘蛛設定的訪問層數為2的話,網頁I是不會被訪問到的。這也讓有些網站上一部分網頁能夠在搜尋引擎上搜尋到,另外一部分不能被搜尋到。 對於網站設計者來說,扁平化的網站結構設計有助於搜尋引擎抓取其更多的網頁。
網路蜘蛛在訪問網站網頁的時候,經常會遇到加密數據和網頁許可權的問題,有些網頁是需要會員許可權才能訪問。當然,網站的所有者可以通過協定讓網路蜘蛛不去抓取(下小節會介紹),但對於一些出售報告的網站,他們希望搜尋引擎能搜尋到他們的報告,但又不能完全免費的讓搜尋者查看,這樣就需要給網路蜘蛛提供相應的用戶名和密碼。網路蜘蛛可以通過所給的許可權對這些網頁進行網頁抓取,從而提供搜尋。而當搜尋者點擊查看該網頁的時候,同樣需要搜尋者提供相應的許可權驗證。
網站與網路蜘蛛
網路蜘蛛需要抓取網頁,不同於一般的訪問,如果控制不好,則會引起網站伺服器負擔過重。今年4月,淘寶網( /wiki/http://www.taobao.com)就因為雅虎搜尋引擎的網路蜘蛛抓取其數據引起淘寶網伺服器的不穩定。網站是否就無法和網路蜘蛛交流呢?其實不然,有多種方法可以讓網站和網路蜘蛛進行交流。一方面讓網站管理員了解網路蜘蛛都來自哪兒,做了些什麼,另一方面也告訴網路蜘蛛哪些網頁不應該抓取,哪些網頁應該更新。
每個網路蜘蛛都有自己的名字,在抓取網頁的時候,都會向網站標明自己的身份。網路蜘蛛在抓取網頁的時候會傳送一個請求,這個請求中就有一個欄位為User-agent,用於標識此網路蜘蛛的身份。例如Google網路蜘蛛的標識為GoogleBot,Baidu網路蜘蛛的標識為baiduspider,Yahoo網路蜘蛛的標識為Inktomi slurp。如果在網站上有訪問日誌記錄,網站管理員就能知道,哪些搜尋引擎的網路蜘蛛過來過,什麼時候過來的,以及讀了多少數據等等。如果網站管理員發現某個蜘蛛有問題,就通過其標識來和其所有者聯繫。
網路蜘蛛進入一個網站,一般會訪問一個特殊的文本檔案Robots.txt,這個檔案一般放在網站伺服器的根目錄下,如: /wiki/http://www.blogchina.com/robots.txt。網站管理員可以通過robots.txt來定義哪些目錄網路蜘蛛不能訪問,或者哪些目錄對於某些特定的網路蜘蛛不能訪問。例如有些網站的執行檔目錄和臨時檔案目錄不希望被搜尋引擎搜尋到,那么網站管理員就可以把這些目錄定義為拒絕訪問目錄。Robots.txt語法很簡單,例如如果對目錄沒有任何限制,可以用以下兩行來描述: User-agent: * Disallow:
當然,Robots.txt只是一個協定,如果網路蜘蛛的設計者不遵循這個協定,網站管理員也無法阻止網路蜘蛛對於某些頁面的訪問,但一般的網路蜘蛛都會遵循這些協定,而且網站管理員還可以通過其它方式來拒絕網路蜘蛛對某些網頁的抓取。
網路蜘蛛在下載網頁的時候,會去識別網頁的HTML代碼,在其代碼的部分,會有META標識。通過這些標識,可以告訴網路蜘蛛本網頁是否需要被抓取,還可以告訴網路蜘蛛本網頁中的連結是否需要被繼續跟蹤。例如: 表示本網頁不需要被抓取,但是網頁內的連結需要被跟蹤。
關於Robots.txt的語法和META Tag語法,有興趣的讀者查看文獻
現在一般的網站都希望搜尋引擎能更全面的抓取自己網站的網頁,因為這樣可以讓更多的訪問者能通過搜尋引擎找到此網站。為了讓本網站的網頁更全面被抓取到,網站管理員可以建立一個網站地圖,即Site Map。許多網路蜘蛛會把sitemap.htm檔案作為一個網站網頁爬取的入口,網站管理員可以把網站內部所有網頁的連結放在這個檔案裡面,那么網路蜘蛛可以很方便的把整個網站抓取下來,避免遺漏某些網頁,也會減小對網站伺服器的負擔。
名稱列表
1、baiduspider百度的綜合索引蜘蛛
2、Googlebot谷歌蜘蛛
3、Googlebot-Image專門用來抓取圖片的蜘蛛
4、Mediapartners-Google廣告聯盟代碼的蜘蛛
5、YahooSlurp雅虎蜘蛛
6、Yahoo!SlupChina雅虎中國蜘蛛
7、Yahoo!-AdCrawler雅虎廣告蜘蛛
8、YodaoBot網易蜘蛛
9、Sosospider騰訊SOSO綜合蜘蛛
10、sogouspider搜狗綜合蜘蛛
11、MSNBotLive綜合蜘蛛
網站關係
編輯網路蜘蛛需要抓取網頁,不同於一般的訪問,如果控制不好,則會引起網站伺服器負擔過重。淘寶網就因為雅虎搜尋引擎的網路蜘蛛抓取其數據引起淘寶網伺服器的不穩定。網站是否就無法和網路蜘蛛交流呢?其實不然,有多種方法可以讓網站和網路蜘蛛進行交流。一方面讓網站管理員了解網路蜘蛛都來自哪兒,做了些什麼,另一方面也告訴網路蜘蛛哪些網頁不應該抓取,哪些網頁應該更新。
每個網路蜘蛛都有自己的名字,在抓取網頁的時候,都會向網站標明自己的身份。網路蜘蛛在抓取網頁的時候會傳送一個請求,這個請求中就有一個欄位為User-agent,用於標識此網路蜘蛛的身份。例如Google網路蜘蛛的標識為GoogleBot,Baidu網路蜘蛛的標識為BaiDuSpider,Yahoo網路蜘蛛的標識為InktomiSlurp。如果在網站上有訪問日誌記錄,網站管理員就能知道,哪些搜尋引擎的網路蜘蛛過來過,什麼時候過來的,以及讀了多少數據等等。如果網站管理員發現某個蜘蛛有問題,就通過其標識來和其所有者聯繫。
進入網站
編輯網路蜘蛛進入一個網站,一般會訪問一個特殊的文本檔案Robots.txt,這個檔案一般放在網站伺服器的根目錄下,網站管理員可以通過robots.txt來定義哪些目錄網路蜘蛛不能訪問,或者哪些目錄對於某些特定的網路蜘蛛不能訪問。例如有些網站的執行檔目錄和臨時檔案目錄不希望被搜尋引擎搜尋到,那么網站管理員就可以把這些目錄定義為拒絕訪問目錄。Robots.txt語法很簡單,例如如果對目錄沒有任何限制,可以用以下兩行來描述:User-agent:*Disallow:
當然,Robots.txt只是一個協定,如果網路蜘蛛的設計者不遵循這個協定,網站管理員也無法阻止網路蜘蛛對於某些頁面的訪問,但一般的網路蜘蛛都會遵循這些協定,而且網站管理員還可以通過其它方式來拒絕網路蜘蛛對某些網頁的抓取。
網路蜘蛛在下載網頁的時候,會去識別網頁的HTML代碼,在其代碼的部分,會有META標識。通過這些標識,可以告訴網路蜘蛛本網頁是否需要被抓取,還可以告訴網路蜘蛛本網頁中的連結是否需要被繼續跟蹤。例如:表示本網頁不需要被抓取,但是網頁內的連結需要被跟蹤。
現在一般的網站都希望搜尋引擎能更全面的抓取自己網站的網頁,因為這樣可以讓更多的訪問者能通過搜尋引擎找到此網站。為了讓本網站的網頁更全面被抓取到,網站管理員可以建立一個網站地圖,即SiteMap。許多網路蜘蛛會把sitemap.htm檔案作為一個網站網頁爬取的入口,網站管理員可以把網站內部所有網頁的連結放在這個檔案裡面,那么網路蜘蛛可以很方便的把整個網站抓取下來,避免遺漏某些網頁,也會減小對網站伺服器的負擔。
內容提取
搜尋引擎建立網頁索引,處理的對象是文本檔案。對於網路蜘蛛來說,抓取下來網頁包括各種格式,包括html、圖片、doc、pdf、多媒體、動態網頁及其它格式等。這些檔案抓取下來後,需要把這些檔案中的文本信息提取出來。準確提取這些文檔的信息,一方面對搜尋引擎的搜尋準確性有重要作用,另一方面對於網路蜘蛛正確跟蹤其它連結有一定影響。
對於doc、pdf等文檔,這種由專業廠商提供的軟體生成的文檔,廠商都會提供相應的文本提取接口。網路蜘蛛只需要調用這些外掛程式的接口,就可以輕鬆的提取文檔中的文本信息和檔案其它相關的信息。
HTML等文檔不一樣,HTML有一套自己的語法,通過不同的命令標識符來表示不同的字型、顏色、位置等版式,如:、、 等,提取文本信息時需要把這些標識符都過濾掉。過濾標識符並非難事,因為這些標識符都有一定的規則,只要按照不同的標識符取得相應的信息即可。但在識別這些信息的時候,需要同步記錄許多版式信息,例如文字的字型大小、是否是標題、是否是加粗顯示、是否是頁面的關鍵字等,這些信息有助於計算單詞在網頁中的重要程度。同時,對於HTML網頁來說,除了標題和正文以外,會有許多廣告連結以及公共的頻道連結,這些連結和文本正文一點關係也沒有,在提取網頁內容的時候,也需要過濾這些無用的連結。例如某個網站有“產品介紹”頻道,因為導航條在網站內每個網頁都有,若不過濾導航條連結,在搜尋“產品介紹”的時候,則網站內每個網頁都會搜尋到,無疑會帶來大量垃圾信息。過濾這些無效連結需要統計大量的網頁結構規律,抽取一些共性,統一過濾;對於一些重要而結果特殊的網站,還需要個別處理。這就需要網路蜘蛛的設計有一定的擴展性。
連結指向
對於多媒體、圖片等檔案,一般是通過連結的錨文本(即,連結文本)和相關的檔案注釋來判斷這些檔案的內容。例如有一個連結文字為“張曼玉照片”,其連結指向一張bmp格式的圖片,那么網路蜘蛛就知道這張圖片的內容是“張曼玉的照片”。這樣,在搜尋“張曼玉”和“照片”的時候都能讓搜尋引擎找到這張圖片。另外,許多多媒體檔案中有檔案屬性,考慮這些屬性也可以更好的了解檔案的內容。
動態網頁一直是網路蜘蛛面臨的難題。所謂動態網頁,是相對於靜態網頁而言,是由程式自動生成的頁面,這樣的好處是可以快速統一更改網頁風格,也可以減少網頁所占伺服器的空間,但同樣給網路蜘蛛的抓取帶來一些麻煩。由於開發語言不斷的增多,動態網頁的類型也越來越多,如:asp、jsp、php等。這些類型的網頁對於網路蜘蛛來說,可能還稍微容易一些。網路蜘蛛比較難於處理的是一些腳本語言(如VBScript和javascript) 生成的網頁,如果要完善的處理好這些網頁,網路蜘蛛需要有自己的腳本解釋程式。對於許多數據是放在資料庫的網站,需要通過本網站的資料庫搜尋才能獲得信息,這些給網路蜘蛛的抓取帶來很大的困難。對於這類網站,如果網站設計者希望這些數據能被搜尋引擎搜尋,則需要提供一種可以遍歷整個資料庫內容的方法。
對於網頁內容的提取,一直是網路蜘蛛中重要的技術。整個系統一般採用外掛程式的形式,通過一個外掛程式管理服務程式,遇到不同格式的網頁採用不同的外掛程式處理。這種方式的好處在於擴充性好,以後每發現一種新的類型,就可以把其處理方式做成一個外掛程式補充到外掛程式管理服務程式之中。
更新周期
由於網站的內容經常在變化,因此網路蜘蛛也需不斷的更新其抓取網頁的內容,這就需要網路蜘蛛按照一定的周期去掃描網站,查看哪些頁面是需要更新的頁面,哪些頁面是新增頁面,哪些頁面是已經過期的死連結。搜尋引擎的更新周期對搜尋引擎搜尋的查全率有很大影響。如果更新周期太長,則總會有一部分新生成的網頁搜尋不到;周期過短,技術實現會有一定難度,而且會對頻寬、伺服器的資源都有浪費。搜尋引擎的網路蜘蛛並不是所有的網站都採用同一個周期進行更新,對於一些重要的更新量大的網站,更新的周期短,如有些新聞網站,幾個小時就更新一次;相反對於一些不重要的網站,更新的周期就長,可能一兩個月才更新一次。
一般來說,網路蜘蛛在更新網站內容的時候,不用把網站網頁重新抓取一遍,對於大部分的網頁,只需要判斷網頁的屬性(主要是日期),把得到的屬性和上次抓取的屬性相比較,如果一樣則不用更新。