網(wǎng)絡(luò)爬蟲的君子協(xié)議
網(wǎng)絡(luò)爬蟲的尺寸
小規(guī)模,數(shù)量小,爬去速度不敏感况褪,requests庫 | 中規(guī)模锣笨,數(shù)據(jù)規(guī)模較大,爬取速度敏感scrapy庫 | 大規(guī)模碎罚,搜索引擎,爬取速度關(guān)鍵定制開發(fā) |
---|---|---|
爬取網(wǎng)頁 玩轉(zhuǎn)網(wǎng)頁 | 爬取網(wǎng)站 爬取系列網(wǎng)站 | 爬取全網(wǎng) |
網(wǎng)絡(luò)爬蟲引發(fā)的問題
- 性能騷擾
- 法律風險
- 隱私泄露
網(wǎng)絡(luò)爬蟲的"性能騷擾"
web服務(wù)器默認接受人類訪問会傲,受限于編寫水平和目的锅棕,網(wǎng)絡(luò)爬蟲將會為web服務(wù)器帶來巨大的資源的開銷。
網(wǎng)絡(luò)爬蟲的法律風險
服務(wù)器上的數(shù)據(jù)有產(chǎn)權(quán)歸屬淌山,網(wǎng)絡(luò)爬蟲獲取數(shù)據(jù)后牟利將會帶來法律的風險裸燎。
網(wǎng)絡(luò)爬蟲的隱私泄露
網(wǎng)絡(luò)爬蟲可能具備突破簡單訪問的控制能力,獲取被保護的數(shù)據(jù)泼疑,從而泄露個人隱私德绿。
網(wǎng)絡(luò)爬蟲的限制
- 來源審查:判斷
User-Agent
進行限制,檢查來訪者HTTP協(xié)議頭的User-Agent域退渗,只響應(yīng)瀏覽器或友好爬蟲的訪問 - 發(fā)布公告:
Robots
協(xié)議移稳, 告知所有的爬蟲網(wǎng)站的爬蟲策略,要求爬蟲遵守会油。
Robots協(xié)議
Robots協(xié)議(也稱為爬蟲協(xié)議个粱、機器人協(xié)議等)的全稱是“網(wǎng)絡(luò)爬蟲排除標準”(Robots ExclusionProtocol),網(wǎng)站通過Robots協(xié)議告訴搜索引擎哪些頁面可以抓取翻翩,哪些頁面不能抓取.
根據(jù)協(xié)議都许,網(wǎng)站管理員可以在網(wǎng)站域名的根目錄下放一個robots.txt 文本文件,里面可以指定不同的網(wǎng)絡(luò)爬蟲能訪問的頁面和禁止訪問的頁面嫂冻,指定的頁面由正則表達式表示胶征。網(wǎng)絡(luò)爬蟲在采集這個網(wǎng)站之前,首先獲取到這個文件桨仿,然后解析到其中的規(guī)則睛低,然后根據(jù)規(guī)則來采集網(wǎng)站的數(shù)據(jù)。
注意服傍,這個協(xié)議的存在更多的是需要網(wǎng)絡(luò)爬蟲去遵守暇昂,而起不到防止爬蟲的功能。
為什么需要Robots協(xié)議
互聯(lián)網(wǎng)上的網(wǎng)頁是通過超級鏈接互相關(guān)聯(lián)起來的伴嗡,從而形成了網(wǎng)頁的網(wǎng)狀結(jié)構(gòu)。爬蟲的工作方式就像蜘蛛在網(wǎng)上沿著鏈接爬來爬去从铲,最基本的流程可以簡化如下:
- 喂給爬蟲一堆url瘪校,我們稱之為種子(seeds);
- 爬蟲抓取seeds,解析html網(wǎng)頁阱扬,抽取其中的超級鏈接泣懊;
- 爬蟲接著抓取這些新發(fā)現(xiàn)的鏈接指向的網(wǎng)頁。
步驟2和步驟3循環(huán)往復麻惶。
了解了上面的流程就能發(fā)現(xiàn):對爬蟲來說網(wǎng)站非常被動馍刮,只有老老實實被抓取的份。
所以窃蹋,對于網(wǎng)站的管理者來說卡啰,就存在這樣的需求:
某些路徑下是個人隱私或者網(wǎng)站管理使用,不想被搜索引擎抓取警没,比如說日本愛情動作片匈辱;
不喜歡某個搜索引擎,不愿意被他抓取杀迹,最有名的就是之前淘寶不希望被百度抓韧隽场;
小網(wǎng)站使用的是公用的虛擬主機树酪,流量有限或者需要付費浅碾,希望搜索引擎抓的溫柔點;
某些網(wǎng)頁是動態(tài)生成的续语,沒有直接的鏈接指向垂谢,但是希望內(nèi)容被搜索引擎抓取和索引。
網(wǎng)站內(nèi)容的所有者是網(wǎng)站管理員绵载,搜索引擎應(yīng)該尊重所有者的意愿埂陆,為了滿足以上等等,就需要提供一種網(wǎng)站和爬蟲進行溝通的途徑娃豹,給網(wǎng)站管理員表達自己意愿的機會焚虱。有需求就有供應(yīng),robots協(xié)議就此誕生懂版。
案例
京東的Robots協(xié)議
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協(xié)議
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協(xié)議的寫法
既然網(wǎng)絡(luò)爬蟲在爬取一個網(wǎng)站之前躯畴,要先獲取到這個文件民鼓,然后解析到其中的規(guī)則,那么蓬抄,Robots就必須要有一套通用的語法規(guī)則丰嘉。
最簡單的robots.txt只有兩條規(guī)則:
User-agent:指定對哪些爬蟲生效
Disallow:指定要屏蔽的網(wǎng)址
先說User-agent,爬蟲抓取時會聲明自己的身份嚷缭,這就是User-agent饮亏,沒錯耍贾,就是http協(xié)議里的User-agent。robots.txt利用User-agent來區(qū)分各個引擎的爬蟲路幸,比如說google網(wǎng)頁搜索爬蟲的User-agent為Googlebot荐开。
可能有讀者要問了,我怎么知道爬蟲的User-agent是什么?你還可以查相關(guān)搜索引擎的資料得到官方的數(shù)據(jù)简肴,比如說百度的爬蟲列表是這樣的:
產(chǎn)品名稱 | 對應(yīng)User-Agent |
---|---|
網(wǎng)頁搜索 | Baiduspider |
移動搜索 | Baiduspider |
圖片搜索 | Baiduspider-image |
視頻搜索 | Baiduspider-video |
新聞搜索 | Baiduspider-news |
百度搜索 | Baiduspider-favo |
百度聯(lián)盟 | Baiduspider-cpro |
商務(wù)搜索 | Baiduspider-ads |
Disallow 行列出的是要攔截的網(wǎng)頁晃听,以正斜線 (/) 開頭,可以列出特定的網(wǎng)址或模式砰识。要屏蔽整個網(wǎng)站能扒,使用正斜線即可;要屏蔽某一目錄以及其中的所有內(nèi)容,在目錄名后添加正斜線;要屏蔽某個具體的網(wǎng)頁仍翰,就指出這個網(wǎng)頁赫粥。
下面介紹一些實例:
允許所有的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: /
我們再來結(jié)合兩個真實的范例來學習一下予借。先看這個例子:
User-agent: Baiduspider
Disallow: /
User-agent: baiduspider
Disallow: /
這個是淘寶網(wǎng)的Robots協(xié)議內(nèi)容越平,相信你已經(jīng)看出來了,淘寶網(wǎng)禁止百度的爬蟲訪問灵迫。
再來看一個例子:
User-agent: *
Disallow: /?*
Disallow: /pop/*.html
User-agent: EtaoSpider
Disallow: /
這個稍微復雜點秦叛,京東有2個目錄不希望所有的爬蟲來抓。同時瀑粥,京東完全屏蔽了一淘網(wǎng)的蜘蛛(EtaoSpider是一淘網(wǎng)的蜘蛛)挣跋。
Robots協(xié)議進階知識
sitemap
爬蟲會通過網(wǎng)頁內(nèi)部的鏈接發(fā)現(xiàn)新的網(wǎng)頁。但是如果沒有連接指向的網(wǎng)頁怎么辦?或者用戶輸入條件生成的動態(tài)網(wǎng)頁怎么辦?能否讓網(wǎng)站管理員通知搜索引擎他們網(wǎng)站上有哪些可供抓取的網(wǎng)頁?這就是sitemap狞换,最簡單的 Sitepmap 形式就是 XML 文件避咆,在其中列出網(wǎng)站中的網(wǎng)址以及關(guān)于每個網(wǎng)址的其他數(shù)據(jù)(上次更新的時間、更改的頻率以及相對于網(wǎng)站上其他網(wǎng)址的重要程度等等)修噪,利用這些信息搜索引擎可以更加智能地抓取網(wǎng)站內(nèi)容查库。
新的問題來了,爬蟲怎么知道這個網(wǎng)站有沒有提供sitemap文件黄琼,或者說網(wǎng)站管理員生成了sitemap樊销,(可能是多個文件),爬蟲怎么知道放在哪里呢?
由于robots.txt的位置是固定的脏款,于是大家就想到了把sitemap的位置信息放在robots.txt里围苫。這就成為robots.txt里的新成員了。
節(jié)選一段google robots.txt:
Sitemap: http://www.gstatic.com/cultur...
Sitemap: http://www.google.com/hostedn...
插一句撤师,考慮到一個網(wǎng)站的網(wǎng)頁眾多剂府,sitemap人工維護不太靠譜,google提供了工具可以自動生成sitemap剃盾。
meta tag
其實嚴格來說這部分內(nèi)容不屬于robots.txt周循。
robots.txt的初衷是為了讓網(wǎng)站管理員管理可以出現(xiàn)在搜索引擎里的網(wǎng)站內(nèi)容强法。但是,即使使用 robots.txt 文件讓爬蟲無法抓取這些內(nèi)容湾笛,搜索引擎也可以通過其他方式找到這些網(wǎng)頁并將它添加到索引中。例如闰歪,其他網(wǎng)站仍可能鏈接到該網(wǎng)站嚎研。因此,網(wǎng)頁網(wǎng)址及其他公開的信息(如指向相關(guān)網(wǎng)站的鏈接中的定位文字或開放式目錄管理系統(tǒng)中的標題)有可能會出現(xiàn)在引擎的搜索結(jié)果中库倘。如果想徹底對搜索引擎隱身那咋整呢?答案是:元標記临扮,即meta tag。
比如要完全阻止一個網(wǎng)頁的內(nèi)容列在搜索引擎索引中(即使有其他網(wǎng)站鏈接到此網(wǎng)頁)教翩,可使用 noindex 元標記杆勇。只要搜索引擎查看該網(wǎng)頁,便會看到 noindex 元標記并阻止該網(wǎng)頁顯示在索引中饱亿,這里注意noindex元標記提供的是一種逐頁控制對網(wǎng)站的訪問的方式蚜退。
要防止所有搜索引擎將網(wǎng)站中的網(wǎng)頁編入索引,在網(wǎng)頁的部分添加:
<meta name="robots" content="noindex">
這里的name取值可以設(shè)置為某個搜索引擎的User-agent從而指定屏蔽某一個搜索引擎彪笼。
除了noindex外钻注,還有其他元標記,比如說nofollow配猫,禁止爬蟲從此頁面中跟蹤鏈接幅恋。詳細信息可以參考Google支持的元標記,這里提一句:noindex和nofollow在HTML 4.01規(guī)范里有描述泵肄,但是其他tag的在不同引擎支持到什么程度各不相同捆交,還請讀者自行查閱各個引擎的說明文檔。
Crawl-delay
除了控制哪些可以抓哪些不能抓之外腐巢,robots.txt還可以用來控制爬蟲抓取的速率品追。如何做到的呢?通過設(shè)置爬蟲在兩次抓取之間等待的秒數(shù)。這種操作可以進行緩解服務(wù)器壓力系忙。
Crawl-delay:5
表示本次抓取后下一次抓取前需要等待5秒诵盼。
注意:google已經(jīng)不支持這種方式了,在webmaster tools里提供了一個功能可以更直觀的控制抓取速率银还。
這里插一句題外話风宁,幾年前曾經(jīng)有一段時間robots.txt還支持復雜的參數(shù):Visit-time,只有在visit-time指定的時間段里蛹疯,爬蟲才可以訪問;Request-rate: 用來限制URL的讀取頻率戒财,用于控制不同的時間段采用不同的抓取速率。后來估計支持的人太少捺弦,就漸漸的廢掉了饮寞,目前google和baidu都已經(jīng)不支持這個規(guī)則了孝扛,其他小的引擎公司貌似從來都沒有支持過。
Robots協(xié)議的遵守方式
網(wǎng)絡(luò)爬蟲:
自動或人工識別rotbots.txt幽崩,再進行內(nèi)容爬取
約束性:
Robots協(xié)議是建議但非約束性苦始,網(wǎng)絡(luò)爬蟲可以不遵守,但存在法律風險慌申。
對Robots協(xié)議的理解
訪問量小:可以遵守 訪問量較大:建議遵守 |
非商業(yè)且偶爾:建議遵守 商業(yè)利益:必須遵守 |
必須遵守 |
---|---|---|
爬取網(wǎng)頁 玩轉(zhuǎn)網(wǎng)頁 | 爬取網(wǎng)站 爬取系列網(wǎng)站 | 爬取全網(wǎng) |
原則
:類人行為可以不參考Robots協(xié)議陌选。
防君子不防小人(君子協(xié)議)
Robots協(xié)議不是什么技術(shù)壁壘,而只是一種互相尊重的協(xié)議蹄溉,好比私家花園的門口掛著“閑人免進”咨油,尊重者繞道而行,不尊重者依然可以推門而入柒爵。目前役电,Robots協(xié)議在實際使用中,還存在一些問題棉胀。
緩存
robots.txt本身也是需要抓取的法瑟,出于效率考慮,一般爬蟲不會每次抓取網(wǎng)站網(wǎng)頁前都抓一下robots.txt膏蚓,加上robots.txt更新不頻繁瓢谢,內(nèi)容需要解析。通常爬蟲的做法是先抓取一次驮瞧,解析后緩存下來氓扛,而且是相當長的時間。假設(shè)網(wǎng)站管理員更新了robots.txt论笔,修改了某些規(guī)則采郎,但是對爬蟲來說并不會立刻生效,只有當爬蟲下次抓取robots.txt之后才能看到最新的內(nèi)容狂魔。尷尬的是蒜埋,爬蟲下次抓取robots.txt的時間并不是由網(wǎng)站管理員控制的。當然最楷,有些搜索引擎提供了web 工具可以讓網(wǎng)站管理員通知搜索引擎那個url發(fā)生了變化整份,建議重新抓取。注意籽孙,此處是建議烈评,即使你通知了搜索引擎,搜索引擎何時抓取仍然是不確定的犯建,只是比完全不通知要好點讲冠。至于好多少,那就看搜索引擎的良心和技術(shù)能力了适瓦。
ignore
不知是無意還是有意竿开,反正有些爬蟲不太遵守或者完全忽略robots.txt谱仪,不排除開發(fā)人員能力的問題,比如說根本不知道robots.txt否彩。另外疯攒,本身robots.txt不是一種強制措施,如果網(wǎng)站有數(shù)據(jù)需要保密列荔,必需采取技術(shù)措施卸例,比如說:用戶驗證,加密肌毅,ip攔截,訪問頻率控制等姑原。
惡意爬蟲
在互聯(lián)網(wǎng)世界中悬而,每天都有不計其數(shù)的爬蟲在日夜不息地爬取數(shù)據(jù),其中惡意爬蟲的數(shù)量甚至高于非惡意爬蟲锭汛。遵守Robots協(xié)議的爬蟲才是好爬蟲笨奠,但是并不是每個爬蟲都會主動遵守Robots協(xié)議。
惡意爬蟲可以帶來很多潛在威脅唤殴,比如電商網(wǎng)站的商品信息被爬取可能會被競爭對手利用般婆,過多的爬蟲還會占用帶寬資源、甚至導致網(wǎng)站宕機朵逝。
反惡意爬蟲是一件漫長而艱巨的任務(wù)蔚袍,如果依靠自身實力難以解決,可以借助豈安科技的業(yè)務(wù)風險分析平臺 WARDEN 來反惡意爬蟲配名,根據(jù)自己的需求來定制功能啤咽。
感謝你的閱讀