2015/09/19

robots协议


2013年2月8日北京市第一中级人民法院正式受理了百度诉奇虎360违反"Robots协议"抓取、复制其网站内容的不正当竞争行为一案,索赔金额高达一亿元, 这可以看做2012年下半年"3B大战"的继续。在此次索赔案件中,百度称自己的Robots文本中已设定不允许360爬虫进入,而360的爬虫依然对 “百度知道”“百度百科”等百度网站内容进行抓取。其实早在2012年11月初,针对双方摩擦加剧的情况,在中国互联网协会的牵头下,包括百度、新浪、 奇虎360在内的12家互联网公司已共同签署了《互联网搜索引擎服务自律公约》,在公约第七条承诺遵循国际通行的行业惯例与商业规则,遵守机器人协议(robots协议)


什么是robots

要了解robots协议首先要了解robots。本文的robots特指搜索引擎领域的web robots,这个名字可能很多人不熟悉,但是提到Web Wanderers,Crawlers和 Spiders很多人可能就恍然大悟了,在中文里我们统称为爬虫或者网络爬虫,也就是搜索引擎抓取互联网网页的程序。

同学们都知道网页是通过超级链接互相关联起来的,从而形成了网页的网状结构。爬虫的工作方式就像蜘蛛在网上沿着链接爬来爬去,最基本的流程可以简化如下:

1.喂给爬虫一堆url,我们称之为种子(seeds)
2.爬虫抓取seeds,解析html网页,抽取其中的超级链接
3.爬虫接着抓取这些新发现的链接指向的网页
2,3循环往复

什么是robots协议

了解了上面的流程就能看到对爬虫来说网站非常被动,只有老老实实被抓取的份。存在这样的需求:

1.某些路径下是个人隐私或者网站管理使用,不想被搜索引擎抓取,比如说日本爱情动作片
2.不喜欢某个搜索引擎,不愿意被他抓取,最有名的就是之前淘宝不希望被百度抓取
3.小网站使用的是公用的虚拟主机,流量有限或者需要付费,希望搜索引擎抓的温柔点
4.某些网页是动态生成的,没有直接的链接指向,但是希望内容被搜索引擎抓取和索引

网站内容的所有者是网站管理员,搜索引擎应该尊重所有者的意愿,为了满足以上等等,就需要提供一种网站和爬虫进行沟通的途径,给网站管理员表达自己 意愿的机会。有需求就有供应,robots协议就此诞生。Robots协议,学名叫:The Robots Exclusion Protocol,就搜索引擎抓取网站内容的范围作了约定, 包括网站是否希望被搜索引擎抓取,哪些内容不允许被抓取,把这些内容放到一个纯文本文件robots.txt里,然后放到站点的根目录下。爬虫抓取网站内容前 会先抓取robots.txt,据此“自觉地”抓取或者不抓取该网页内容,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。

需要注意的是robots协议并非是规范,只是行业内一个约定俗成的协议。什么意思呢? Robots协议不是什么技术壁垒,而只是一种互相尊重的协议,好比 私家花园的门口挂着“闲人免进”,尊重者绕道而行,不尊重者依然可以推门而入,比如说360。


查看淘宝主页下的robots: https://www.taobao.com/robots.txt

User-agent: Baiduspider
Disallow: /

User-agent: baiduspider
Disallow: /

这就是淘宝不想让百度抓取


基本用法

最简单的robots.txt只有两条规则:

1.User-agent:指定对哪些爬虫生效
2.Disallow:指定要屏蔽的网址

User-agent

爬虫抓取时会声明自己的身份,这就是User-agent,没错,就是http协议里的User-agent。robots.txt利用User-agent来区分各个引擎的爬虫。 举例说明:google网页搜索爬虫的User-agent为Googlebot,下面这行就指定google的爬虫。

User-agent:Googlebot

如果想指定所有的爬虫怎么办?不可能穷举啊,可以用下面这一行:

User-agent: *

我们可以查相关搜索引擎的资料得到官方爬虫的User-agent是什么。

Disallow

Disallow 行列出的是要拦截的网页,以正斜线 (/) 开头,可以列出特定的网址或模式。

要屏蔽整个网站,使用正斜线即可:

Disallow: /

要屏蔽某一目录以及其中的所有内容,在目录名后添加正斜线:

Disallow: /屏蔽的目录名/

要屏蔽某个具体的网页,就指出这个网页:

Disallow: /网页.html

要屏蔽a1-a100,但是不屏蔽a50,怎么办?

方案1:
Disallow:/a1/
Disallow:/a2/
...
Disallow:/a49/
Disallow:/a51/
...
Disallow:/a100/

方案2:
Disallow:/a
Allow:/a50/

ok,allow大家会用了吧。 顺便说一句,如果想屏蔽a50下面的文件private.html,咋整?

Disallow:/a
Allow:/a50/
Disallow:/a50/private.html

聪明的你一定能发现其中的规律,对吧?谁管的越细就听谁的。

要阻止特定类型的文件(如 .gif),请使用以下内容:

Disallow: /*.gif$

提示一下,Disallow的内容区分大小写。例如,Disallow: /junkfile.asp 会屏蔽 junkfile.asp,却会允许Junk_file.asp。

通配符不是所有搜索引擎都支持,使用要小心。没办法,谁让robots.txt没有一个大家都承认的标准呢。所以尽量只使用*和$完成配置最好。

Baiduspider支持使用通配符"*"和"$"来模糊匹配url

"$" 匹配行结束符。
"*" 匹配0或多个任意字符。

sitemap

前面说过爬虫会通过网页内部的链接发现新的网页。但是如果没有链接指向的网页怎么办?或者用户输入条件生成的动态网页怎么办?能否让网站管理员通知搜 索引擎他们网站上有哪些可供抓取的网页?这就是sitemap,最简单的 Sitepmap 形式就是 XML 文件,在其中列出网站中的网址以及关于每个网址的其 他数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度等等),利用这些信息搜索引擎可以更加智能地抓取网站内容。sitemap是另一 个话题,足够开一篇新的文章聊的,这里就不展开了。

新的问题来了,爬虫怎么知道这个网站有没有提供sitemap文件,或者说网站管理员生成了sitemap,(可能是多个文件),爬虫怎么知道放在哪里呢?

由于robots.txt的位置是固定的,于是大家就想到了把sitemap的位置信息放在robots.txt里。这就成为robots.txt里的新成员了。

节选一段google robots.txt:

Sitemap: http://www.gstatic.com/culturalinstitute/sitemaps/www_google_com_culturalinstitute/sitemap-index.xml
Sitemap: http://www.google.com/hostednews/sitemap_index.xml

当前市面上很少会用到sitemap,大家的通用做法是将动态网站伪静态化,意思是访问链接固定,但内容是根据实际情况动态改变的。


robots meta

robots.txt的初衷是为了让网站管理员管理可以出现在搜索引擎里的网站内容。但是,即使使用 robots.txt 文件让爬虫无法抓取这些内容,搜索引擎也 可以通过其他方式找到这些网页并将它添加到索引中。例如,其他网站仍可能链接到该网站。因此,网页网址及其他公开的信息(如指向相关网站的链接中的 定位文字或开放式目录管理系统中的标题)有可能会出现在引擎的搜索结果中。

如果想彻底对搜索引擎隐身那咋整呢?答案是:利用html下meta标签。

Robots META标签则主要是针对一个个具体的页面。和其他的META标签(如使用的语言、页面的描述、关键词等)一样,Robots META标签也是放在页面 的<head></head>中,专门用来告诉搜索引擎ROBOTS如何抓取该页的内容。

Robots META标签的写法:

Robots META标签中没有大小写之分,name="Robots"表示所有的搜索引擎,可以针对某个具体搜索引擎写为name="BaiduSpider"。 content部分有四 个指令选项:index、noindex、follow、nofollow,指令间以","分隔。

index 指令告诉搜索机器人抓取该页面;
follow 指令表示搜索机器人可以沿着该页面上的链接继续抓取下去
robots Meta标签的缺省值是index和follow

这样,一共有四种组合:

<meta name="robots" content="index,follow">
<meta name="robots" content="noindex,follow">
<meta name="robots" content="index,nofollow">
<meta name="robots" content="noindex,nofollow">

其中 <meta name="robots" content="index,follow">可以写成<meta name="robots" content="all">

<meta name="robots" content="noindex,nofollow">可以写成<meta name="robots" content="none">

目前看来,绝大多数的搜索引擎机器人都遵守robots.txt的规则,而对于Robots META标签,目前支持的并不多,但是正在逐渐增加,如著名搜索引擎GOOGLE 就完全支持,而且GOOGLE还增加了一个指令“archive”,可以限制GOOGLE是否保留网页快照。例如:

<meta name="googlebot" content="index,follow,noarchive">

表示抓取该站点中页面并沿着页面中链接抓取,但是不在GOOLGE上保留该页面的网页快照。

由此可知要完全阻止一个网页的内容列在搜索引擎索引中(即使有其他网站链接到此网页),可使用 noindex 元标记。只要搜索引擎查看该网页,便会看到 noindex 元标 记并阻止该网页显示在索引中。


robots安全相关问题

好吧,到此为止robots.txt相关的东东介绍的也七七八八了,能坚持看到这里的同学估计都跃跃欲试了,可惜,我要泼盆冷水,能完全指望robots.txt保护 我们网站的内容吗?不一定。否则百度和360就不用打官司了。

协议一致性

第一个问题是robots.txt没有一个正式的标准,各个搜索引擎都在不断的扩充robots.txt功能,这就导致每个引擎对robots.txt的支持程度各有不同,更 不用说在某个功能上的具体实现的不同了。


缓存

第二个问题是robots.txt本身也是需要抓取的,出于效率考虑,一般爬虫不会每次抓取网站网页前都抓一下robots.txt,加上robots.txt更新不频繁,内容 需要解析。通常爬虫的做法是先抓取一次,解析后缓存下来,而且是相当长的时间。假设网站管理员更新了robots.txt,修改了某些规则,但是对爬虫来说并 不会立刻生效,只有当爬虫下次抓取robots.txt之后才能看到最新的内容。尴尬的是,爬虫下次抓取robots.txt的时间并不是由网站管理员控制的。当然, 有些搜索引擎提供了web 工具可以让网站管理员通知搜索引擎那个url发生了变化,建议重新抓取。注意,此处是建议,即使你通知了搜索引擎,搜索引擎何 时抓取仍然是不确定的,只是比完全不通知要好点。至于好多少,那就看搜索引擎的良心和技术能力了。


ignore

第三个问题,不知是无意还是有意,反正有些爬虫不太遵守或者完全忽略robots.txt,不排除开发人员能力的问题,比如说根本不知道robots.txt。另外, 本身robots.txt不是一种强制措施,如果网站有数据需要保密,必需采取技术措施,比如说:用户验证,加密,ip拦截,访问频率控制等。


偷偷的抓

第四个问题,即使采用了种种限制,仍然存在某些恶意的抓取行为能突破这些限制,比如一些利用肉鸡进行的抓取。悲观的说,只要普通用户可以访问,就不能 完全杜绝这种恶意抓取的行为。


泄密

最后,robots.txt本身还存在泄密的风险。举例,如果某一个网站的robots.txt里突然新增了一条:Disallow /map/,你想到了什么?是不是要推出地图 服务了?于是有好奇心的同学就会开始尝试各种文件名去访问该路径下的文件,希望能看到惊喜。貌似当初google的地图就是这么被提前爆出来的,关于这点 我不太确定,大家就当八卦听听好了。


本文参考:

http://lusongsong.com/reed/732.html

http://www.cnblogs.com/yuzhongwusan/archive/2008/12/06/1348969.html