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.v 1.482007/10/1605:3l:15 gerald Exp$
#
#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(谷歌网站站长工具帮助)(简体中文)