什麼樣的爬蟲纔是好爬蟲:Robots協議探究

網站的管理者們一般會有這樣一種心態:一方面期待百度、Google這樣的搜索引擎來抓取網站的內容,另外一方面又很厭惡其餘來路不明的網絡爬蟲抓取本身的信息。正是由於這樣,纔有「好爬蟲」、「壞爬蟲」這樣的說法。html

提到「好爬蟲」,就不得不提網絡爬蟲與web之間的訪問受權協議——Robots協議了。web

Robots協議的定義

Robots協議(也稱爲爬蟲協議、機器人協議等)的全稱是「網絡爬蟲排除標準」(Robots Exclusion
Protocol),網站經過Robots協議告訴搜索引擎哪些頁面能夠抓取,哪些頁面不能抓取。正則表達式

根據協議,網站管理員能夠在網站域名的根目錄下放一個robots.txt 文本文件,裏面能夠指定不一樣的網絡爬蟲能訪問的頁面和禁止訪問的頁面,指定的頁面由正則表達式表示。網絡爬蟲在採集這個網站以前,首先獲取到這個文件,而後解析到其中的規則,而後根據規則來採集網站的數據。緩存

注意,這個協議的存在更多的是須要網絡爬蟲去遵照,而起不到防止爬蟲的功能。網絡

爲何須要Robots協議

互聯網上的網頁是經過超級連接互相關聯起來的,從而造成了網頁的網狀結構。爬蟲的工做方式就像蜘蛛在網上沿着連接爬來爬去,最基本的流程能夠簡化以下:ide

  1. 餵給爬蟲一堆url,咱們稱之爲種子(seeds);工具

  2. 爬蟲抓取seeds,解析html網頁,抽取其中的超級連接;學習

  3. 爬蟲接着抓取這些新發現的連接指向的網頁。網站

步驟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是什麼?你還能夠查相關搜索引擎的資料獲得官方的數據,好比說百度的爬蟲列表是這樣的:

robotsxieyi.png

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協議。

惡意爬蟲能夠帶來不少潛在威脅,好比電商網站的商品信息被爬取可能會被競爭對手利用,過多的爬蟲還會佔用帶寬資源、甚至致使網站宕機。

反惡意爬蟲是一件漫長而艱鉅的任務,若是依靠自身實力難以解決,能夠藉助豈安科技的業務風險分析平臺 WARDEN 來反惡意爬蟲,根據本身的需求來定製功能。
反爬蟲
文章來源:http://bigsec.com/

相關文章
相關標籤/搜索