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如何抓取該頁的內容。註
网站的管理者们通常会有这样一种心态:一方面期待百度、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。