2013年10月17日 星期四

搜尋引擎原理-網路蜘蛛(Web Spider)和自動搜索機器人(Robots)

搜尋引擎的工作原理

(一) 搜集信息:搜尋引擎的信息搜集基本都是自動的。搜尋引擎利用稱為網路蜘蛛的自動搜索機器人程序來連上每一個網頁上的超連結。機器人程序根據網頁連到其他中的超連結,就象日常生活中所說的「一傳十,十傳百……」一樣,從少數幾個網頁開始,連到數據庫上所有到其他網頁的連結。理論上,若網頁上有適當的超連結,機器人便可以遍歷絕大部分網頁。

(二) 整理信息搜尋引擎整理信息的過程稱為「建立索引」。搜尋引擎不僅要保存搜集起來的信息,還要將它們按照一定的規則進行編排。這樣,搜尋引擎根本不用重新翻查它所有保存的信息而迅速找到所要的資料。想象一下,如果信息是不按任何規則地隨意堆放在搜尋引擎的資料庫中,那麼它每次找資料都得把整個資料庫完全翻查一遍,如此一來再快的計算機系統也沒有用。

(三) 接受查詢:用戶向搜尋引擎發出查詢,搜尋引擎接受查詢並向用戶返回資料。搜尋引擎每時每刻都要接到來自大量用戶的幾乎是同時發出的查詢,它按照每個用戶的要求檢查自己的索引,在極短時間內找到用戶需要的資料,並返回給用戶。目前,搜尋引擎返回主要是以網頁連結的形式提供的,這樣通過這些連結,用戶便能到達含有自己所需資料的網頁。通常搜尋引擎會在這些連結下提供一小段來自這些網頁的摘要信息以幫助用戶判斷此網頁是否含有自己需要的內容。

網路蜘蛛(Web Spider)基本原理

網路蜘蛛即Web Spider,是一個很形象的名字。把網際網路比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。網路蜘蛛是通過網頁的連結位址來尋找網頁,從網站某一個頁面(通常是首頁)開始,讀取網頁的內容,找到在網頁中的其它連結位址,然後通過這些連結位址尋找下一個網頁,這樣一直迴圈下去,直到把這個網站所有的網頁都抓取完為止。如果把整個網際網路當成一個網站,那麼網路蜘蛛就可以用這個原理把網際網路上所有的網頁都抓取下來。

對於搜尋引擎來說,要抓取網際網路上所有的網頁幾乎是不可能的,從目前公佈的資料來看,容量最大的搜尋引擎也不過是抓取了整個網頁數量的百分之四十左右。這其中的原因一方面是抓取技術的瓶頸,無法遍歷所有的網頁,有許多網頁無法從其它網頁的連結中找到;另一個原因是存儲技術和處理技術的問題,如果按照每個頁面的平均大小為20K計算(包含圖片),100億網頁的容量是100×2000G位元組,即使能夠存儲,下載也存在問題(按照一台機器每秒下載20K計算,需要 340台機器不停的下載一年時間,才能把所有網頁下載完畢)。同時,由於資料量太大,在提供搜索時也會有效率方面的影響。因此,許多搜尋引擎的網路蜘蛛只是抓取那些重要的網頁,而在抓取的時候評價重要性主要的依據是某個網頁的連結深度。

在抓取網頁的時候,網路蜘蛛一般有兩種策略:廣度優先和深度優先。

廣度優先是指網路蜘蛛會先抓取起始網頁中連結的所有網頁,然後再選擇其中的一個連結網頁,繼續抓取在此網頁中連結的所有網頁。這是最常用的方式,因為這個方法可以讓網路蜘蛛並行處理,提高其抓取速度。深度優先是指網路蜘蛛會從起始頁開始,一個連結一個連結跟蹤下去,處理完這條線路之後再轉入下一個起始頁,繼續跟蹤連結。這個方法有個優點是網路蜘蛛在設計的時候比較容易。由於不可能抓取所有的網頁,有些網路蜘蛛對一些不太重要的網站,設置了訪問的層數。例如:A為起始網頁,屬於0層,B、C、D、E、F屬於第1層,G、H屬於第2層, I屬於第3層。如果網路蜘蛛設置的訪問層數為2的話,網頁I是不會被訪問到的。這也讓有些網站上一部分網頁能夠在搜尋引擎上搜索到,另外一部分不能被搜索到。對於網站設計者來說,扁平化的網站結構設計有助於搜尋引擎抓取其更多的網頁。

網路蜘蛛在訪問網站網頁的時候,經常會遇到加密資料和網頁許可權的問題,有些網頁是需要會員許可權才能訪問。當然,網站的所有者可以通過協定讓網路蜘蛛不去抓取(下小節會介紹),但對於一些出售報告的網站,他們希望搜尋引擎能搜索到他們的報告,但又不能完全**的讓搜索者查看,這樣就需要給網路蜘蛛提供相應的用戶名和密碼。網路蜘蛛可以通過所給的許可權對這些網頁進行網頁抓取,從而提供搜索。而當搜索者點擊查看該網頁的時候,同樣需要搜索者提供相應的許可權驗證。

網站與網路蜘蛛

網路蜘蛛需要抓取網頁,不同於一般的訪問,如果控制不好,則會引起網站伺服器負擔過重,網站是否就無法和網路蜘蛛交流呢?其實不然,有多種方法可以讓網站和網路蜘蛛進行交流。一方面讓網站管理員瞭解網路蜘蛛都來自哪兒,做了些什麼,另一方面也告訴網路蜘蛛哪些網頁不應該抓取,哪些網頁應該更新。

每個網路蜘蛛都有自己的名字,在抓取網頁的時候,都會向網站標明自己的身份。網路蜘蛛在抓取網頁的時候會發送一個請求,這個請求中就有一個欄位為User- agent,用於標識此網路蜘蛛的身份。例如Google網路蜘蛛的標識為GoogleBot,Baidu網路蜘蛛的標識為BaiDuSpider, Yahoo網路蜘蛛的標識為Inktomi Slurp。如果在網站上有訪問日誌記錄,網站管理員就能知道,哪些搜尋引擎的網路蜘蛛過來過,什麼時候過來的,以及讀了多少資料等等。如果網站管理員發現某個蜘蛛有問題,就通過其標識來和其所有者聯繫。

網路蜘蛛進入一個網站,一般會訪問一個特殊的文字檔Robots.txt,這個檔一般放在網站伺服器的根目錄下。網站管理員可以通過robots.txt來定義哪些目錄網路蜘蛛不能訪問,或者哪些目錄對於某些特定的網路蜘蛛不能訪問,例如有些網站的可執行檔目錄和暫存檔案目錄不希望被搜尋引擎搜索到,那麼網站管理員就可以把這些目錄定義為拒絕訪問目錄。

Robots.txt 語法很簡單,例如如果對目錄沒有任何限制,可以用以下兩行來描述:
User-agent: *
Disallow:
當然,Robots.txt 只是一個協定,如果網路蜘蛛的設計者不遵循這個協議,網站管理員也無法阻止網路蜘蛛對於某些頁面的訪問,但一般的網路蜘蛛都會遵循這些協定,而且網站管理員還可以通過其它方式來拒絕網路蜘蛛對某些網頁的抓取。

網路蜘蛛在下載網頁的時候,會去識別網頁的HTML代碼,在其代碼的部分,會有META標識。通過這些標識,可以告訴網路蜘蛛本網頁是否需要被抓取,還可以告訴網路蜘蛛本網頁中的連結是否需要被繼續跟蹤。例如:表示本網頁不需要被抓取,但是網頁內的連結需要被跟蹤。

現在一般的網站都希望搜尋引擎能更全面的抓取自己網站的網頁,因為這樣可以讓更多的訪問者能通過搜尋引擎找到此網站。為了讓本網站的網頁更全面被抓取到,網站管理員可以建立一個網站地圖,即Site Map。許多網路蜘蛛會把sitemap.htm 檔作為一個網站網頁爬取的入口,網站管理員可以把網站內部所有網頁的連結放在這個檔裡面,那麼網路蜘蛛可以很方便的把整個網站抓取下來,避免遺漏某些網頁,也會減小對網站伺服器的負擔。

網頁內容的提取

搜尋引擎建立網頁索引,處理的物件是文字檔。對於網路蜘蛛來說,抓取下來網頁包括各種格式,包括html、圖片、doc、pdf、多媒體、動態網頁及其它格式等。這些檔抓取下來後,需要把這些檔中的文本資訊提取出來。準確提取這些文檔的資訊,一方面對搜尋引擎的搜索準確性有重要作用,另一方面對於網路蜘蛛正確跟蹤其它連結有一定影響。對於doc、pdf等文檔,這種由專業廠商提供的軟體生成的文檔,廠商都會提供相應的文本提取介面。網路蜘蛛只需要調用這些外掛程式的介面,就可以輕鬆的提取文檔中的文本資訊和檔其它相關的資訊。

HTML等文檔不一樣,HTML有一套自己的語法,通過不同的命令識別字來表示不同的字體、顏色、位置等版式,如:、、等,提取文本資訊時需要把這些識別字都過濾掉。過濾識別字並非難事,因為這些識別字都有一定的規則,只要按照不同的識別字取得相應的資訊即可。但在識別這些資訊的時候,需要同步記錄許多版式資訊,例如文字的字體大小、是否是標題、是否是加粗顯示、是否是頁面的關鍵字等,這些資訊有助於計算單詞在網頁中的重要程度。同時,對於HTML網頁來說,除了標題和正文以外,會有許多廣告連結以及公共的頻道連結,這些連結和文本正文一點關係也沒有,在提取網頁內容的時候,也需要過濾這些無用的連結。例如某個網站有“產品介紹”頻道,因為導航條在網站內每個網頁都有,若不過濾導航條連結,在搜索“產品介紹”的時候,則網站內每個網頁都會搜索到,無疑會帶來大量垃圾資訊。過濾這些無效連結需要統計大量的網頁結構規律,抽取一些共性,統一過濾;對於一些重要而結果特殊的網站,還需要個別處理。這就需要網路蜘蛛的設計有一定的擴展性。

對於多媒體、圖片等檔,一般是通過連結的錨文本(即,連結文本)和相關的檔注釋來判斷這些檔的內容。例如有一個連結文字為“玉山照片”,其連結指向一張bmp格式的圖片,那麼網路蜘蛛就知道這張圖片的內容是“玉山的照片”。這樣,在搜索“玉山”和“照片”的時候都能讓搜尋引擎找到這張圖片。另外,許多多媒體檔中有檔案屬性,考慮這些屬性也可以更好的瞭解檔的內容。

動態網頁一直是網路蜘蛛面臨的難題。所謂動態網頁,是相對於靜態網頁而言,是由程式自動生成的頁面,這樣的好處是可以快速統一更改網頁風格,也可以減少網頁所占伺服器的空間,但同樣給網路蜘蛛的抓取帶來一些麻煩。由於開發語言不斷的增多,動態網頁的類型也越來越多,如:asp、jsp、php等。這些類型的網頁對於網路蜘蛛來說,可能還稍微容易一些。網路蜘蛛比較難於處理的是一些指令碼語言(如VBScript和javascript)生成的網頁,如果要完善的處理好這些網頁,網路蜘蛛需要有自己的腳本解釋程式。對於許多資料是放在資料庫的網站,需要通過本網站的資料庫搜索才能獲得資訊,這些給網路蜘蛛的抓取帶來很大的困難。對於這類網站,如果網站設計者希望這些資料能被搜尋引擎搜索,則需要提供一種可以遍歷整個資料庫內容的方法。

對於網頁內容的提取,一直是網路蜘蛛中重要的技術。整個系統一般採用外掛程式的形式,通過一個外掛程式管理服務程式,遇到不同格式的網頁採用不同的外掛程式處理。這種方式的好處在於擴充性好,以後每發現一種新的類型,就可以把其處理方式做成一個外掛程式補充到外掛程式管理服務程式之中。

搜尋引擎的更新週期

由於網站的內容經常在變化,因此網路蜘蛛也需不斷的更新其抓取網頁的內容,這就需要網路蜘蛛按照一定的週期去掃描網站,查看哪些頁面是需要更新的頁面,哪些頁面是新增頁面,哪些頁面是已經過期的無效連結。

搜尋引擎的更新週期對搜尋引擎搜索的查全率有很大影響。如果更新週期太長,則總會有一部分新生成的網頁搜索不到;週期過短,技術實現會有一定難度,而且會對頻寬、伺服器的資源都有浪費。搜尋引擎的網路蜘蛛並不是所有的網站都採用同一個週期進行更新,對於一些重要的更新量大的網站,更新的週期短,如有些新聞網站,幾個小時就更新一次;相反對於一些不重要的網站,更新的週期就長,可能一兩個月才更新一次。

一般來說,網路蜘蛛在更新網站內容的時候,不用把網站網頁重新抓取一遍,對於大部分的網頁,只需要判斷網頁的屬性(主要是日期),把得到的屬性和上次抓取的屬性相比較,如果一樣則不用更新。

自動搜索機器人(Robots)

<meta name="Robots" contect= "all|none|index|noindex|follow|nofollow">
其中的屬性說明如下:
設定為all:檔將被檢索,且頁面上的連結可以被查詢;
設定為none:檔將不被檢索,且頁面上的連結不可以被查詢;
設定為index:檔將被檢索;
設定為follow:頁面上的連結可以被查詢;
設定為noindex:檔將不被檢索,但頁面上的連結可以被查詢;
設定為nofollow:檔將不被檢索,頁面上的連結可以被查詢。

我們知道,搜尋引擎都有自己的搜索機器人(Robots),並通過這些Robots在網路上沿著網頁上的連結(一般是http和src連結)不斷抓取資料建立自己的資料庫。

對於網站管理者和內容提供者來說,有時候會有一些網站內容,不希望被Robots抓取而公開。為了解決這個問題,Robots開發界提供了兩個辦法:一個是robots.txt,另一個是The Robots META標籤。

一、robots.txt

1、 什麼是robots.txt?
robots.txt是一個純文字檔,通過在這個檔中聲明該網站中不想被robots訪問的部分,這樣,該網站的部分或全部內容就可以不被搜尋引擎收錄了,或者指定搜尋引擎只收錄指定的內容。
當一個搜索機器人訪問一個網站時,它會首先檢查該網站根目錄下是否存在robots.txt,如果找到,搜索機器人就會按照該檔中的內容來確定訪問的範圍,如果該檔不存在,那麼搜索機器人就沿著連結抓取。

robots.txt 必須放置在一個網站的根目錄下,而且檔案名必須全部小寫。
網站 URL
相應的 robots.txt的 URL
http://www.w3.org/
http://www.w3.org/robots.txt

http://www.w3.org:80/
http://www.w3.org:80/robots.txt

http://www.w3.org:1234/
http://www.w3.org:1234/robots.txt

http://w3.org/
http://w3.org/robots.txt

2、 robots.txt 的語法
"robots.txt"檔包含一條或更多的記錄,這些記錄通過空行分開(以CR,CR/NL, or NL作為結束語碼),每一條記錄的格式如下所示:
"<field>:<optionalspace><value><optionalspace>"。
在該檔中可以使用#進行注解,具體使用方法和UNIX中的慣例一樣。該檔中的記錄通常以一行或多行User-agent開始,後面加上若干Disallow行,詳細情況如下:
User-agent:
該項的值用於描述搜尋引擎robot的名字,在"robots.txt"檔中,如果有多條User-agent記錄說明有多個robot會受到該協議的限制,對該檔來說,至少要有一條User-agent記錄。如果該項的值設為*,則該協議對任何機器人均有效,在"robots.txt"文件中, "User-agent:*"這樣的記錄只能有一條。
Disallow :
該項的值用於描述不希望被訪問到的一個URL,這個URL可以是一條完整的路徑,也可以是部分的,任何以Disallow 開頭的URL均不會被robot訪問到。例如"Disallow: /help"對/help.htm和/help/index.html都不允許搜尋引擎訪問,而"Disallow: /help/"則允許robot訪問/help.html,而不能訪問/help/index.html。
任何一條Disallow記錄為空,說明該網站的所有部分都允許被訪問,在"/robots.txt"檔中,至少要有一條Disallow記錄。如果 "/robots.txt"是一個空檔,則對於所有的搜尋引擎robot,該網站都是開放的。
下面是一些robots.txt基本的用法:
禁止所有搜尋引擎訪問網站的任何部分:
User-agent: *
Disallow: /
允許所有的robot訪問
User-agent: *
Disallow:
或者也可以建一個空檔 "/robots.txt" file
禁止所有搜尋引擎訪問網站的幾個部分(下例中的cgi-bin、tmp、private目錄)
User-agent: *
Disallow: /cgi-bin/
Disallow: /tmp/
Disallow: /private/
禁止某個搜尋引擎的訪問(下例中的BadBot)
User-agent: BadBot
Disallow: /
只允許某個搜尋引擎的訪問(下例中的WebCrawler)
User-agent: WebCrawler
Disallow:
User-agent: *
Disallow: /

3、 常見搜尋引擎機器人Robots名字
名稱 搜尋引擎
Baiduspider http://www.baidu.com
Scooter http://www.altavista.com
ia_archiver http://www.alexa.com
Googlebot http://www.google.com
FAST-WebCrawler http://www.alltheweb.com
Slurp http://www.inktomi.com
MSN Live Search http://www.live.com/

4、 robots.txt舉例
下面是一些著名網站的robots.txt:
http://www.cnn.com/robots.txt
http://www.google.com/robots.txt
http://www.ibm.com/robots.txt
http://www.sun.com/robots.txt
http://www.eachnet.com/robots.txt

5、 常見robots.txt錯誤
顛倒了順序: 錯誤寫成
User-agent: *
Disallow: GoogleBot
正確的應該是:
User-agent: GoogleBot
Disallow: *
把多個禁止命令放在一行中: 例如,錯誤地寫成
Disallow: /css/ /cgi-bin/ /images/
正確的應該是
Disallow: /css/
Disallow: /cgi-bin/
Disallow: /images/
行前有大量空格,例如寫成
Disallow: /cgi-bin/
儘管在標準沒有談到這個,但是這種方式很容易出問題。
404重定向到另外一個頁面:
當Robot 訪問很多沒有設置robots.txt檔的網站時,會被自動404重定向到另外一個Html頁面。這時Robot常常會以處理robots.txt檔的方式處理這個Html分頁檔。雖然一般這樣沒有什麼問題,但是最好能放一個空白的robots.txt檔在網站根目錄下。
採用大寫。例如
USER-AGENT: EXCITE
DISALLOW:
雖然標準是沒有大小寫的,但是目錄和檔案名應該小寫:
user-agent:GoogleBot
disallow:
語法中只有Disallow,沒有Allow! 錯誤的寫法是:
User-agent: Baiduspider
Disallow: /john/
allow: /jane/
忘記了斜杠/ 錯誤的寫做:
User-agent: Baiduspider
Disallow: css
正確的應該是
User-agent: Baiduspider
Disallow: /css/
下面一個小工具專門檢查robots.txt文件的有效性:
http://www.searchengineworld.com/cgi-bin/robotcheck.cgi

二、 Robots META標籤
1、什麼是Robots META標籤
Robots.txt檔主要是限制整個網站或者目錄的搜尋引擎訪問情況,而Robots META標籤則主要是針對一個個具體的頁面。和其他的META標籤(如使用的語言、頁面的描述、關鍵字等)一樣,Robots META標籤也是放在頁面的<head></head>中,專門用來告訴搜尋引擎ROBOTS如何抓取該頁的內容。具體的形式類似(見黑體部分):
<html>
<head>
<title>時代行銷--網路行銷專業門戶</title>
<meta name="Robots" content="index,follow">
<meta http-equiv="Content-Type" CONTENT="text/html; charset=gb2312">
<meta name="keywords" content="行銷… ">
<meta name="description" content="時代行銷網是…">
<link rel="stylesheet" href="/public/css.css" type="text/css">
</head>
<body> … </body>
</html>

2、Robots META標籤的寫法:
Robots META標籤中沒有大小寫之分,name=”Robots”表示所有的搜尋引擎,可以針對某個具體搜尋引擎寫為name=”BaiduSpider”。 content部分有四個指令選項:index、noindex、follow、nofollow,指令間以“,”分隔。
INDEX 指令告訴搜索機器人抓取該頁面;
FOLLOW 指令表示搜索機器人可以沿著該頁面上的連結繼續抓取下去;
Robots Meta標籤的缺省值是INDEX和FOLLOW,只有inktomi除外,對於它,缺省值是INDEX,NOFOLLOW。
這樣,一共有四種組合:
<META NAME="ROBOTS" CONTENT="INDEX,FOLLOW">
<META NAME="ROBOTS" CONTENT="NOINDEX,FOLLOW">
<META NAME="ROBOTS" CONTENT="INDEX,NOFOLLOW">
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">
其中
<META NAME="ROBOTS" CONTENT="INDEX,FOLLOW">可以寫成
<META NAME="ROBOTS" CONTENT="ALL">;
<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">可以寫成
<META NAME="ROBOTS" CONTENT="NONE">
需要注意的是:上述的robots.txt和Robots META標籤限制搜尋引擎機器人(ROBOTS)抓取網站內容的辦法只是一種規則。
目前看來,絕大多數的搜尋引擎機器人都遵守robots.txt的規則,而對於Robots META標籤,目前支持的並不多,但是正在逐漸增加,如著名搜尋引擎google就完全支持,而且google還增加了一個指令“archive”,可以限制google是否保留網頁快照。例如:
<META NAME="googlebot" CONTENT="index,follow,noarchive">
表示抓取該網站中頁面並沿著頁面中連結抓取,但是不在google上保留該頁面的網頁快照。
(此篇文章為網路轉載,如有冒犯,請來信告知,當即刻移除!)

0 意見:

About This Blog

  © Blogger templates Psi by Ourblogtemplates.com 2008

Back to TOP