Robots協議(也稱爲爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
____________________________________
Robots協議也稱爲爬蟲協議、爬蟲規則、機器人協議,是網站國際互聯網界通行的道德規範,其目的是保護網站數據和敏感信息、確保用戶個人信息和隱私不被侵犯。“規則”中將搜索引擎抓取網站內容的範圍做了約定,包括網站是否希望被搜索引擎抓取,哪些內容不允許被抓取,而網絡爬蟲可以據此自動抓取或者不抓取該網頁內容。如果將網站視爲酒店裏的一個房間,robots.txt就是主人在房間門口懸掛的“請勿打擾”或“歡迎打掃”的提示牌。這個文件告訴來訪的搜索引擎哪些房間可以進入和參觀,哪些不對搜索引擎開放。
____________________________________
robots.txt(統一小寫)是一種存放於網站根目錄下的ASCII編碼的文本文件,它通常告訴網絡搜索引擎的漫遊器(又稱網絡蜘蛛),此網站中的哪些內容是不應被搜索引擎的漫遊器獲取的,哪些是可以被漫遊器獲取的。因爲一些系統中的URL是大小寫敏感的,所以robots.txt的文件名應統一爲小寫。robots.txt應放置於網站的根目錄下。如果想單獨定義搜索引擎的漫遊器訪問子目錄時的行爲,那麼可以將自定的設置合併到根目錄下的robots.txt,或者使用robots元數據(Metadata,又稱元資料)。
robots.txt協議並不是一個規範,而只是約定俗成的,所以並不能保證網站的隱私。注意robots.txt是用字符串比較來確定是否獲取URL,所以目錄末尾有與沒有斜槓“/”表示的是不同的URL。robots.txt允許使用類似"Disallow: *.gif"這樣的通配符[1][2]。
其他的影響搜索引擎的行爲的方法包括使用robots元數據:
<meta name="robots" content="noindex,nofollow" />
這個協議也不是一個規範,而只是約定俗成的,有些搜索引擎會遵守這一規範,而其他則不然。通常搜索引擎會識別這個元數據,不索引這個頁面,以及這個頁面的鏈出頁面。
Robots協議的詳解
Robots協議是Web站點和搜索引擎爬蟲交互的一種方式,Robots.txt是存放在站點根目錄下的一個純文本文件。該文件可以指定搜索引擎爬蟲只抓取指定的內容,或者是禁止搜索引擎爬蟲抓取網站的部分或全部內容。當一個搜索引擎爬蟲訪問一個站點時,它會首先檢查該站點根目錄下是否存在robots.txt,如果存在,搜索引擎爬蟲就會按照該文件中的內容來確定訪問的範圍;如果該文件不存在,那麼搜索引擎爬蟲就沿着鏈接抓取。
另外,robots.txt必須放置在一個站點的根目錄下,而且文件名必須全部小寫。如果搜索引擎爬蟲要訪問的網站地址是http://www.w3.org/,那麼robots.txt文件必須能夠通過http://www.w3.org/robots.txt打開並看到裏面的內容。
# robots.txt for http://www.w3.org
#
#Id:robots.txt.v1.482007/10/1605:3l:15geraldExp
#
#Forusebysearch.w3.org
User-agent:W3C-gsa
Disallow:/Out-Of-DateUser-agent:W3T_SE
Disallow:/Out-Of-Date-
User-agent:MozillaJ4.0(compatible;MSIE6.0;WindowsNT;MSSearch4.0Robot)
Disallow:
#W3CLinkchecker
User-agent:W3C-checklink
Disallow:
#excludesomeaccess-controlledareas
User-agent:*
Disallow:/Team
Disallow;/Project
Disallow:/Web
Disallow:/Systems
Disallow:/History
Disallow:/0ut-Of-Date
Disallow:/People/all/
Disallow:/2005/11/Translations/Query
Disallow:/2000/06/webdata/xslt
Disallow:/2000/09/webdata/xslt
Disallow:/2005/08/online-xslt/xslt
Disallow:/Search/Mail/Public/
Disallow:/2006/02/chartergen
具體使用格式如下:
(1)User.agent:用於描述搜索引擎爬蟲的名字。在Robots.txt文件中,如果有多條User-agent記錄,說明有多個搜索引擎爬蟲會受到該協議的限制,對該文件來說,至少要有一條User-agent記錄。如果該項的值設爲木,則該協議對任何搜索引擎爬蟲均有效,在Robots.txt文件中,“User-agent:*這樣的記錄只能有一條。
(2)Disallow:用於描述不希望被訪問到的一個URL。這個URL可以是一條完整的路徑,也可以是部分路徑,任何以Disallow開頭的URL均不會被Robot訪問到。
搜索引擎爬蟲必須要遵守Robots協議並執行Web站點的要求。因此搜索引擎爬蟲需要有一個分析Robots協議的模塊,並嚴格按照Robots協議的規定抓取Web主機允許訪問的目錄和網頁。
當然,Robots.txt只是一個協議,如果搜索引擎爬蟲的設計者不遵循這個協議,網站管理員也無法阻止搜索引擎爬蟲對於某些頁面的訪問,但一般的搜索引擎爬蟲都會遵循這些協議,而且網站管理員還可以通過其他方式來拒絕網絡蜘蛛對某些網頁的抓取。
搜索引擎爬蟲在下載網頁的時候,會去識別網頁的HTML代碼,在其代碼部分會有META標識。通過這些標識,可以告訴搜索引擎爬蟲本網頁是否需要被抓取,還可以告訴搜索引擎爬蟲本網頁中的鏈接是否需要被繼續跟蹤。例如:表示本網頁不需要被抓取,但是網頁內的鏈接需要被跟蹤。
現在一般的網站都希望搜索引擎能更全面地抓取自己網站的網頁,因爲這樣可以讓更多的訪問者能通過搜索引擎找到此網站。爲了讓本網站的網頁更全面地被抓取到,網站管理員可以建立一個網站地圖,即SiteMap。許多搜索引擎爬蟲會把sitemap.htm文件作爲一個網站網頁爬取的入口,網站管理員可以把網站內部所有網頁的鏈接放在這個文件裏面,那麼搜索引擎爬蟲可以很方便地把整個網站抓取下來,避免遺漏某些網頁,也會減小對網站服務器的負擔。
Robots協議的約束力
“Robots的約束力固然僅限於自律,無強制性,但這不等於說它背後反映的精神,沒有法律基礎。”中國社會科學院信息化研究中心祕書長姜奇平表示,美國的電子隱私權法就規定“將決定權交給消費者,讓其切實有效地授權或者拒絕他人採集和使用其個人信息”,可見遵守規則就是要遵守公平競爭,不是沒有強制力就可以不公平競爭。
例子
允許所有的機器人:
User-agent: * Disallow:
另一寫法
User-agent: * Allow:/
僅允許特定的機器人:(name_spider用真實名字代替)
User-agent: name_spider Allow:
攔截所有的機器人:
User-agent: * Disallow: /
禁止所有機器人訪問特定目錄:
User-agent: * Disallow: /cgi-bin/ Disallow: /images/ Disallow: /tmp/ Disallow: /private/
僅禁止壞爬蟲訪問特定目錄(BadBot用真實的名字代替):
User-agent: BadBot Disallow: /private/
禁止所有機器人訪問特定文件類型[2]:
User-agent: * Disallow: /*.php$ Disallow: /*.js$ Disallow: /*.inc$ Disallow: /*.css$
非標準擴展協議
自動發現Sitemaps文件
Sitemap
指令被幾大搜索引擎支持(包括Google、Yahoo、Bing和Ask),指定了網站Sitemaps文件的位置。Sitemaps文件包含了網站頁面所在的URL的一個列表。Sitemap
指令並不受User-agent
指令的限制,所以它可以放在robots.txt文件中的任意位置。[3] 唯一要注意的就是要使用網站地圖指令,<sitemap_location>,並將URL的"location"值換成網站地圖的地址,例如,下面就是一個網站地圖指令的例子:
Sitemap: <http://www.example.com/sitemap.xml>
如何編寫Sitemaps文件,請參考sitemaps.org(英文)上的說明。 12
Crawl-delay指令
幾大抓取工具支持Crawl-delay
參數,設置爲多少秒,以等待同服務器之間連續請求:[4][5]
User-agent: * Crawl-delay: 10
Allow指令
一些大的Crawlers支持一項Allow指令,可以抵消先前Disallow指令。比如Googlebot。[6]
替代
雖然robots.txt是最為廣泛接受的方法,但也可以與robots META標籤一起使用。robots META標籤主要是針對一個獨立的頁面設定,與其他的META標籤(如使用的語言、頁面的描述、關鍵詞等)一樣,robots META標籤也是放在頁面的HEAD標籤中,專門用來告訴搜索引擎robots如何抓取該頁的內容。註
<head> <meta name="robots" content="noindex,nofollow" /> </head>
網站的管理者們通常會有這樣一種心態:一方面期待百度、Google這樣的搜索引擎來抓取網站的內容,另一方面又很厭惡其他來路不明的網絡爬蟲抓取自己的信息。正是因爲這樣,纔有“好爬蟲”、“壞爬蟲”這樣的說法。
提到“好爬蟲”,就不得不提網絡爬蟲與web之間的訪問授權協議——Robots協議了。
Robots協議的定義
Robots協議(也稱爲爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots ExclusionProtocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
根據協議,網站管理員可以在網站域名的根目錄下放一個robots.txt 文本文件,裏面可以指定不同的網絡爬蟲能訪問的頁面和禁止訪問的頁面,指定的頁面由正則表達式表示。網絡爬蟲在採集這個網站之前,首先獲取到這個文件,然後解析到其中的規則,然後根據規則來採集網站的數據。
注意,這個協議的存在更多的是需要網絡爬蟲去遵守,而起不到防止爬蟲的功能。
爲什麼需要Robots協議
互聯網上的網頁是通過超級鏈接互相關聯起來的,從而形成了網頁的網狀結構。爬蟲的工作方式就像蜘蛛在網上沿着鏈接爬來爬去,最基本的流程可以簡化如下:
-
餵給爬蟲一堆url,我們稱之爲種子(seeds);
-
爬蟲抓取seeds,解析html網頁,抽取其中的超級鏈接;
-
爬蟲接着抓取這些新發現的鏈接指向的網頁。
步驟2和步驟3循環往復。
瞭解了上面的流程就能發現:對爬蟲來說網站非常被動,只有老老實實被抓取的份。
所以,對於網站的管理者來說,就存在這樣的需求:
某些路徑下是個人隱私或者網站管理使用,不想被搜索引擎抓取,比如說日本愛情動作片;
不喜歡某個搜索引擎,不願意被他抓取,最有名的就是之前淘寶不希望被百度抓取;
小網站使用的是公用的虛擬主機,流量有限或者需要付費,希望搜索引擎抓的溫柔點;
某些網頁是動態生成的,沒有直接的鏈接指向,但是希望內容被搜索引擎抓取和索引。
網站內容的所有者是網站管理員,搜索引擎應該尊重所有者的意願,爲了滿足以上等等,就需要提供一種網站和爬蟲進行溝通的途徑,給網站管理員表達自己意願的機會。有需求就有供應,robots協議就此誕生。
Robots協議的寫法
既然網絡爬蟲在爬取一個網站之前,要先獲取到這個文件,然後解析到其中的規則,那麼,Robots就必須要有一套通用的語法規則。
最簡單的robots.txt只有兩條規則:
-
User-agent:指定對哪些爬蟲生效
-
Disallow:指定要屏蔽的網址
先說User-agent,爬蟲抓取時會聲明自己的身份,這就是User-agent,沒錯,就是http協議裏的User-agent。robots.txt利用User-agent來區分各個引擎的爬蟲,比如說google網頁搜索爬蟲的User-agent爲Googlebot。
可能有讀者要問了,我怎麼知道爬蟲的User-agent是什麼?你還可以查相關搜索引擎的資料得到官方的數據,比如說百度的爬蟲列表是這樣的:
Disallow 行列出的是要攔截的網頁,以正斜線 (/) 開頭,可以列出特定的網址或模式。要屏蔽整個網站,使用正斜線即可;要屏蔽某一目錄以及其中的所有內容,在目錄名後添加正斜線;要屏蔽某個具體的網頁,就指出這個網頁。
下面我們來看一些Robots的具體寫法:
允許所有的robot訪問
User-agent: *
Disallow:
或者也可以建一個空文件 "/robots.txt" file。
禁止爬蟲訪問所有目錄
User-agent: *
Disallow: /
禁止爬蟲訪問某些目錄
User-agent: *
Disallow: /a/
Disallow: /b/
Disallow: /c/
禁止某些爬蟲訪問
User-agent: BadBot
Disallow: /
只允許某個爬蟲訪問
User-agent: MangCrawler
Disallow:
User-agent: *
Disallow: /
我們再來結合兩個真實的範例來學習一下。先看這個例子:
User-agent: Baiduspider
Disallow: /
User-agent: baiduspider
Disallow: /
這個是淘寶網的Robots協議內容,相信你已經看出來了,淘寶網禁止百度的爬蟲訪問。
再來看一個例子:
User-agent: *
Disallow: /?*
Disallow: /pop/*.html
User-agent: EtaoSpider
Disallow: /
這個稍微複雜點,京東有2個目錄不希望所有的爬蟲來抓。同時,京東完全屏蔽了一淘網的蜘蛛(EtaoSpider是一淘網的蜘蛛)。
Robots協議進階知識
sitemap
前面說過爬蟲會通過網頁內部的鏈接發現新的網頁。但是如果沒有連接指向的網頁怎麼辦?或者用戶輸入條件生成的動態網頁怎麼辦?能否讓網站管理員通知搜索引擎他們網站上有哪些可供抓取的網頁?這就是sitemap,最簡單的 Sitepmap 形式就是 XML 文件,在其中列出網站中的網址以及關於每個網址的其他數據(上次更新的時間、更改的頻率以及相對於網站上其他網址的重要程度等等),利用這些信息搜索引擎可以更加智能地抓取網站內容。
新的問題來了,爬蟲怎麼知道這個網站有沒有提供sitemap文件,或者說網站管理員生成了sitemap,(可能是多個文件),爬蟲怎麼知道放在哪裏呢?
由於robots.txt的位置是固定的,於是大家就想到了把sitemap的位置信息放在robots.txt裏。這就成爲robots.txt裏的新成員了。
節選一段google robots.txt:
Sitemap: http://www.gstatic.com/cultur...
Sitemap: http://www.google.com/hostedn...
插一句,考慮到一個網站的網頁衆多,sitemap人工維護不太靠譜,google提供了工具可以自動生成sitemap。
meta tag
其實嚴格來說這部分內容不屬於robots.txt。
robots.txt的初衷是爲了讓網站管理員管理可以出現在搜索引擎裏的網站內容。但是,即使使用 robots.txt 文件讓爬蟲無法抓取這些內容,搜索引擎也可以通過其他方式找到這些網頁並將它添加到索引中。例如,其他網站仍可能鏈接到該網站。因此,網頁網址及其他公開的信息(如指向相關網站的鏈接中的定位文字或開放式目錄管理系統中的標題)有可能會出現在引擎的搜索結果中。如果想徹底對搜索引擎隱身那咋整呢?答案是:元標記,即meta tag。
比如要完全阻止一個網頁的內容列在搜索引擎索引中(即使有其他網站鏈接到此網頁),可使用 noindex 元標記。只要搜索引擎查看該網頁,便會看到 noindex 元標記並阻止該網頁顯示在索引中,這裏注意noindex元標記提供的是一種逐頁控制對網站的訪問的方式。
要防止所有搜索引擎將網站中的網頁編入索引,在網頁的部分添加:
<meta name="robots" content="noindex">
這裏的name取值可以設置爲某個搜索引擎的User-agent從而指定屏蔽某一個搜索引擎。
除了noindex外,還有其他元標記,比如說nofollow,禁止爬蟲從此頁面中跟蹤鏈接。詳細信息可以參考Google支持的元標記,這裏提一句:noindex和nofollow在HTML 4.01規範裏有描述,但是其他tag的在不同引擎支持到什麼程度各不相同,還請讀者自行查閱各個引擎的說明文檔。
Crawl-delay
除了控制哪些可以抓哪些不能抓之外,robots.txt還可以用來控制爬蟲抓取的速率。如何做到的呢?通過設置爬蟲在兩次抓取之間等待的秒數。
Crawl-delay:5
表示本次抓取後下一次抓取前需要等待5秒。
注意:google已經不支持這種方式了,在webmaster tools裏提供了一個功能可以更直觀的控制抓取速率。
這裏插一句題外話,幾年前曾經有一段時間robots.txt還支持複雜的參數:Visit-time,只有在visit-time指定的時間段裏,爬蟲纔可以訪問;Request-rate: 用來限制URL的讀取頻率,用於控制不同的時間段採用不同的抓取速率。後來估計支持的人太少,就漸漸的廢掉了,目前google和baidu都已經不支持這個規則了,其他小的引擎公司貌似從來都沒有支持過。
防君子不防小人
Robots協議不是什麼技術壁壘,而只是一種互相尊重的協議,好比私家花園的門口掛着“閒人免進”,尊重者繞道而行,不尊重者依然可以推門而入。目前,Robots協議在實際使用中,還存在一些問題。
緩存
robots.txt本身也是需要抓取的,出於效率考慮,一般爬蟲不會每次抓取網站網頁前都抓一下robots.txt,加上robots.txt更新不頻繁,內容需要解析。通常爬蟲的做法是先抓取一次,解析後緩存下來,而且是相當長的時間。假設網站管理員更新了robots.txt,修改了某些規則,但是對爬蟲來說並不會立刻生效,只有當爬蟲下次抓取robots.txt之後才能看到最新的內容。尷尬的是,爬蟲下次抓取robots.txt的時間並不是由網站管理員控制的。當然,有些搜索引擎提供了web 工具可以讓網站管理員通知搜索引擎那個url發生了變化,建議重新抓取。注意,此處是建議,即使你通知了搜索引擎,搜索引擎何時抓取仍然是不確定的,只是比完全不通知要好點。至於好多少,那就看搜索引擎的良心和技術能力了。
ignore
不知是無意還是有意,反正有些爬蟲不太遵守或者完全忽略robots.txt,不排除開發人員能力的問題,比如說根本不知道robots.txt。另外,本身robots.txt不是一種強制措施,如果網站有數據需要保密,必需採取技術措施,比如說:用戶驗證,加密,ip攔截,訪問頻率控制等。
惡意爬蟲
在互聯網世界中,每天都有不計其數的爬蟲在日夜不息地爬取數據,其中惡意爬蟲的數量甚至高於非惡意爬蟲。遵守Robots協議的爬蟲纔是好爬蟲,但是並不是每個爬蟲都會主動遵守Robots協議。
惡意爬蟲可以帶來很多潛在威脅,比如電商網站的商品信息被爬取可能會被競爭對手利用,過多的爬蟲還會佔用帶寬資源、甚至導致網站宕機。
反惡意爬蟲是一件漫長而艱鉅的任務,如果依靠自身實力難以解決,可以藉助業務風險分析平臺來反惡意爬蟲,根據自己的需求來定製功能。
參考文獻
- 使用robots.txt文件阻止或刪除網頁 (HTML). Google網站站長工具幫助. [2012-10-16].
- 完全指南:如何寫好WordPress博客的robots.txt文件 (HTML). The Observing Mind. [2013-02-14].
- Jerri L.Ledord著馬煜譯. 搜索引擎優化寶典. : 257.
- How can I reduce the number of requests you make on my web site? (HTML). Yahoo! Slurp. [2007-02-08].
- MSNBot is crawling a site too frequently (HTML). Troubleshoot issues with MSNBot and site crawling. [2007-02-08].
- 如何攔截Googlebot(谷歌網站站長工具幫助)(簡體中文)