網絡爬蟲的君子協議
網絡爬蟲的尺寸
小規模,數量小,爬去速度不敏感,requests庫 | 中規模,數據規模較大,爬取速度敏感scrapy庫 | 大規模,搜索引擎,爬取速度關鍵定制開發 |
---|---|---|
爬取網頁 玩轉網頁 | 爬取網站 爬取系列網站 | 爬取全網 |
網絡爬蟲引發的問題
- 性能騷擾
- 法律風險
- 隱私泄露
網絡爬蟲的"性能騷擾"
web服務器默認接受人類訪問,受限于編寫水平和目的,網絡爬蟲將會為web服務器帶來巨大的資源的開銷。
網絡爬蟲的法律風險
服務器上的數據有產權歸屬,網絡爬蟲獲取數據后牟利將會帶來法律的風險。
網絡爬蟲的隱私泄露
網絡爬蟲可能具備突破簡單訪問的控制能力,獲取被保護的數據,從而泄露個人隱私。
網絡爬蟲的限制
- 來源審查:判斷
User-Agent
進行限制,檢查來訪者HTTP協議頭的User-Agent域,只響應瀏覽器或友好爬蟲的訪問 - 發布公告:
Robots
協議, 告知所有的爬蟲網站的爬蟲策略,要求爬蟲遵守。
Robots協議
Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots ExclusionProtocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取.
根據協議,網站管理員可以在網站域名的根目錄下放一個robots.txt 文本文件,里面可以指定不同的網絡爬蟲能訪問的頁面和禁止訪問的頁面,指定的頁面由正則表達式表示。網絡爬蟲在采集這個網站之前,首先獲取到這個文件,然后解析到其中的規則,然后根據規則來采集網站的數據。
注意,這個協議的存在更多的是需要網絡爬蟲去遵守,而起不到防止爬蟲的功能。
為什么需要Robots協議
互聯網上的網頁是通過超級鏈接互相關聯起來的,從而形成了網頁的網狀結構。爬蟲的工作方式就像蜘蛛在網上沿著鏈接爬來爬去,最基本的流程可以簡化如下:
- 喂給爬蟲一堆url,我們稱之為種子(seeds);
- 爬蟲抓取seeds,解析html網頁,抽取其中的超級鏈接;
- 爬蟲接著抓取這些新發現的鏈接指向的網頁。
步驟2和步驟3循環往復。
了解了上面的流程就能發現:對爬蟲來說網站非常被動,只有老老實實被抓取的份。
所以,對于網站的管理者來說,就存在這樣的需求:
某些路徑下是個人隱私或者網站管理使用,不想被搜索引擎抓取,比如說日本愛情動作片;
不喜歡某個搜索引擎,不愿意被他抓取,最有名的就是之前淘寶不希望被百度抓取;
小網站使用的是公用的虛擬主機,流量有限或者需要付費,希望搜索引擎抓的溫柔點;
某些網頁是動態生成的,沒有直接的鏈接指向,但是希望內容被搜索引擎抓取和索引。
網站內容的所有者是網站管理員,搜索引擎應該尊重所有者的意愿,為了滿足以上等等,就需要提供一種網站和爬蟲進行溝通的途徑,給網站管理員表達自己意愿的機會。有需求就有供應,robots協議就此誕生。
案例
京東的Robots協議
https://www.jd.com/robots.txt
User-agent: *
Disallow: /?*
Disallow: /pop/*.html
Disallow: /pinpai/*.html?*
User-agent: EtaoSpider
Disallow: /
User-agent: HuihuiSpider
Disallow: /
User-agent: GwdangSpider
Disallow: /
User-agent: WochachaSpider
Disallow: /
百度的Robots協議
https://www.baidu.com/robots.txt
User-agent: Baiduspider
Disallow: /baidu
Disallow: /s?
Disallow: /ulink?
Disallow: /link?
User-agent: Googlebot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: MSNBot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: Baiduspider-image
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: YoudaoBot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: Sogou web spider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: Sogou inst spider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: Sogou spider2
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: Sogou blog
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: Sogou News Spider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: Sogou Orion spider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: ChinasoSpider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: Sosospider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: yisouspider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: EasouSpider
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
User-agent: *
Disallow: /
上面,*
代表所有,/
代表根目錄
Robots協議的寫法
既然網絡爬蟲在爬取一個網站之前,要先獲取到這個文件,然后解析到其中的規則,那么,Robots就必須要有一套通用的語法規則。
最簡單的robots.txt只有兩條規則:
User-agent:指定對哪些爬蟲生效
Disallow:指定要屏蔽的網址
先說User-agent,爬蟲抓取時會聲明自己的身份,這就是User-agent,沒錯,就是http協議里的User-agent。robots.txt利用User-agent來區分各個引擎的爬蟲,比如說google網頁搜索爬蟲的User-agent為Googlebot。
可能有讀者要問了,我怎么知道爬蟲的User-agent是什么?你還可以查相關搜索引擎的資料得到官方的數據,比如說百度的爬蟲列表是這樣的:
產品名稱 | 對應User-Agent |
---|---|
網頁搜索 | Baiduspider |
移動搜索 | Baiduspider |
圖片搜索 | Baiduspider-image |
視頻搜索 | Baiduspider-video |
新聞搜索 | Baiduspider-news |
百度搜索 | Baiduspider-favo |
百度聯盟 | Baiduspider-cpro |
商務搜索 | Baiduspider-ads |
Disallow 行列出的是要攔截的網頁,以正斜線 (/) 開頭,可以列出特定的網址或模式。要屏蔽整個網站,使用正斜線即可;要屏蔽某一目錄以及其中的所有內容,在目錄名后添加正斜線;要屏蔽某個具體的網頁,就指出這個網頁。
下面介紹一些實例:
允許所有的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協議的遵守方式
網絡爬蟲:
自動或人工識別rotbots.txt,再進行內容爬取
約束性:
Robots協議是建議但非約束性,網絡爬蟲可以不遵守,但存在法律風險。
對Robots協議的理解
訪問量小:可以遵守 訪問量較大:建議遵守 |
非商業且偶爾:建議遵守 商業利益:必須遵守 |
必須遵守 |
---|---|---|
爬取網頁 玩轉網頁 | 爬取網站 爬取系列網站 | 爬取全網 |
原則
:類人行為可以不參考Robots協議。
防君子不防小人(君子協議)
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 來反惡意爬蟲,根據自己的需求來定制功能。
感謝你的閱讀