机器人协议是最容易被忽视但致命的小细节。

当前位置: 首页 > 常见问题

淘宝科技博客:机器人协议知识
很久以前,北京市第一中级人民法院正式受理了百度诉奇虎违反“机器人协议”抓取、复制其网站内容的不正当竞争行为一案,索赔金额高达1亿元,可视为明年下半年“B战”的延续。在这起索赔案中,百度称其Robots文本已被设置为不允许爬虫进入,而其他爬虫仍在抓取百度知道、百度百科等百度网站。
其实早在7月初,在中国互联网协会的牵头下,包括百度、新浪、奇虎在内的几家互联网公司签署了《互联网搜索引擎服务自律公约》,并在公约第七条中承诺“遵循国际通行的行业惯例和商业规则,遵守robots协议”。
robots协议的体验
今天找个机会说说一夜成名的robots协议,以及robots协议的完整知识。
第一次了解robots协议
什么是robots
要了解robots协议,首先要了解robots。这篇文章中提到的机器人不是《机器人一号》中的威尔·史密斯,《机器人总动员》中的瓦力和伊娃,也不是《终结者》系列中的施瓦辛格。什么事?这些经典电影你都不知道?好吧,我想太多了。本文中的机器人是指搜索引擎领域的web机器人。这个名字可能很多人都不熟悉,但说到网络漫游者、爬虫、蜘蛛,可能很多人会恍然大悟。在中文中,我们统称为爬虫或网络爬虫,即搜索引擎抓取互联网网页的程序。
同学们都知道网页是通过超链接相互联系的,从而形成了网页的web结构。爬虫的工作原理就像一只蜘蛛在互联网上沿着一个链接爬行,基本过程可以简化如下:
。给爬虫喂一堆URL,我们称之为种子
。Crawler抓取种子,解析html页面并从中提取超链接
。爬虫然后抓取这些新发现的链接指向的网页
互惠
什么是robots协议
了解了上面的过程,可以看到网站对于爬虫来说是非常被动的,只有老老实实的抓取。有这样的诉求:
。有些路径是用于个人隐私或者网站管理,不想被搜索引擎抓取,比如日系爱情动作片
。不喜欢某个搜索引擎,不想被他抓取。著名的就是淘宝之前不想被百度抓取
。小网站使用公共虚拟主机,流量有限或者需要付费。希望搜索引擎轻轻把握
。有些网页是动态生成的,没有直接链接,但是希望内容被搜索引擎抓取和索引
网站内容的所有者是站长,搜索引擎应该尊重所有者的意愿。为了满足以上等等,需要提供一个网站和爬虫沟通的途径,给站长表达意愿的机会。哪里有需求,哪里就有供应,机器人协议就这样诞生了。Robots协议,学名为Robots Exclusion Protocol,对搜索引擎抓取网页内容的范围做了约定,包括网站是否希望被搜索引擎抓取,哪些内容不允许被抓取。将这些内容放在一个纯文本文件robots.txt中,然后放在站点的根目录下。爬虫在抓取网站内容之前会先抓取robots.txt,从而“有意识”抓取或不抓取网页内容。其目的是保护网站数据和敏感信息,确保用户的个人信息和隐私不受侵犯。
需要注意的是,robots协议并不是一个规范,而是行业内的约定性协议。这是什么意思?机器人协议不是技术壁垒,而是相互尊重的协议。比如“闲人免进”挂在私家花园门口。尊重它的人绕道走,不尊重它的人还能推门而入,比如。
说了这么多,我们来看几个著名的例子来感受一下:
例子:淘宝
用户代理:百度蜘蛛
不允许:/
用户代理:百度蜘蛛
不允许:/。这不就是淘宝不希望百度抢的原因吗
例子:JD.COM
用户代理:*
不允许:/?*
不允许:/pop/*。html
user-agent:etaospider
disallow:/
这也不复杂。在JD.COM有一个所有搜索引擎都不想捕捉的目录。同时,etao是完全屏蔽的。
基本玩法
robots.txt
的位置简单明了,把robots . txt放在一个站点的根目录下就可以了。复杂是有点复杂。一个robots.txt只能控制同一协议、同一端口、同一站点的网页抓取策略。这是什么意思?我们来看一个例子说清楚:
百度网页搜索
百度知道
这两个robots.txt的内容是不一样的,也就是说百度网页搜索和百度知道的抓取策略都可以由各自独立的robots.txt来控制..
robots.txt的内容
更简单的robots . txt只有两条规则:
。用户代理:指定哪些爬网程序有效
。不允许:指定要屏蔽的网址
整个文件分为x段,其中一段由Y个用户代理行和Z组成,段表示用户代理行中指定的Y个爬虫被Z个URL屏蔽。这里x >: =,y & gt,z & gt。X=表示空文件,空文件相当于没有robots.txt
下面详细介绍两个规则:
User-agent
爬行时,爬虫会声明自己的身份,就是User-agent,没错,就是http协议中的User-agent。Robots.txt使用用户代理来区分每个引擎的爬虫。
例如,google Web搜索爬虫的用户代理是googlebot,google的爬虫在下面一行中指定。
用户代理:Google bot
想指定所有爬虫怎么办?不可能面面俱到。可以用下面一行:
User-agent: *
有些同学可能会问,我怎么知道爬虫的User-agent是什么?这里简单列举一下:爬虫列表
当然你也可以查看相关搜索引擎的信息来获取官方数据,比如google爬虫列表,百度爬虫列表
Disallow
Disallow list列出了要屏蔽的网页,你可以列出以正斜杠(/)开头的具体网站或模式。
要屏蔽整个网站,就用正斜杠:
Disallow: /
要屏蔽一个目录及其所有内容,在目录名后加正斜杠:
Disallow: /无用的目录名/
要屏蔽某个特定的网页,指出这个网页。
Disallow:/web page . html
Disallow也可以使用前缀和通配符。
要阻塞目录a-a,可以按照上面的方式写行,或者
disallow:/a
。但是,需要注意的是,任何以A开头的目录和文件都会被阻止,所以要小心。如果我需要屏蔽a-a,但我不屏蔽A怎么办?同学们可以考虑一下。我们将把这个问题留到下一节。
阻止某些类型的文件(如gif),请使用以下内容:
Disallow: /*。gif$
*匹配任意字符,$匹配网址,不具体解释。不知道的同学可以自学通配符。
提醒一下,Disallow的内容区分大小写。例如,Disallow: /junkfile.asp将阻止junkfile.asp,但允许junkfile.asp。
然而,并不是所有的搜索引擎都支持通配符,所以使用时要小心。我没办法。robots.txt没有一个大家都认可的标准。
实例# #
百度网页搜索
用户代理:百度蜘蛛
不允许:/Baidu
不允许:/s?
用户代理:Googlebot
不允许:/baidu
不允许:/s?
Disallow:/shifen/
Disallow:/home page/
Disallow:/cpro
User-agent:MSNBot
Disallow:/Baidu
Disallow:/s?
Disallow:/shifen/
Disallow:/home page/
Disallow:/cpro
& #;
现在看这个应该没有压力。对了,百度的robots.txt比较啰嗦,有兴趣的同学可以简化一下。
高级玩法
首先,高级玩法并不是所有引擎的爬虫都支持的。总的来说,谷歌作为搜索引擎技术的领头羊,对它的支持是比较好的。
例:Google robots . txt
Allow
还记得上面的问题吗?如果我需要屏蔽a-a,但我不屏蔽A怎么办?
方案:
不允许:/a/
不允许:/a/
& #;
Disallow:/a/
Disallow:/a/
& #;
disallow:/a/
Scheme:
disallow:/a
allow:/a/
OK,大家都可以用allow。
顺便问一下,如果我想屏蔽A下的文件private.html,我该怎么做?
disallow:/a
allow:/a/
disallow:/a/private . html
聪明的你一定找到规则了吧?听负责人的话。
sitemap
如前所述,爬虫会通过网页内部的链接发现新的网页。但是如果没有网页链接呢?或者用户输入条件生成的动态网页呢?站长能否告知搜索引擎其网站上有哪些页面可供抓取?这是网站地图。Sitemap更简单的形式是XML文件,它列出了网站中的网站以及关于每个网站的其他数据(上次更新的时间、更改的频率、相对于网站上其他网站的重要性等。).有了这些信息,搜索引擎可以更智能地抓取网站内容。【/br/】sitemap是另外一个话题,足够打开一篇新文章来讲了,这里就不展开了。感兴趣的同学可以参考sitemap
。新问题来了。爬虫怎么知道有没有这个网站提供的sitemap文件,或者站长有没有生成sitemap文件(可能是多个文件)?爬虫怎么知道放在哪里?
因为robots.txt的位置是固定的,所以大家就想到了把sitemap的位置信息放在robots.txt中,这样就会成为robots.txt中的新成员
摘自Google robots . txt:
Sitemap:http://www.gstatic.com/Cultural学院/Sitemaps/www _ Google _ com _ Cultural Institute/Sitemap-index . XML
Sitemap:http://www.google.com/hosted新闻/sitemap _ index.xml
顺便考虑到一个网站的页面比较多,手工维护Sitemap
meta标签
其实严格来说,这部分不属于robots.txt,但是挺有关系的,不知道放哪里。暂时放在这里吧。
robots . txt的初衷是让站长管理可以出现在搜索引擎中的网站内容。但是,即使爬虫无法通过使用robots.txt文件抓取内容,搜索引擎也可以通过其他方式找到这些页面,并将其添加到索引中。例如,其他网站可能仍然链接到此网站。因此,网站地址和其他公共信息(如相关网站链接中的定位词或开放目录管理系统中的标题)可能会出现在引擎的搜索结果中。如果你想完全不被搜索引擎发现怎么办?答案是:meta标签,也就是元标签。
例如,要完全阻止某个网页的内容被列在搜索引擎索引中(即使其他网站链接到该网页),可以使用noindex meta标签。只要搜索引擎查看网页,就会看到noindex meta标签,阻止网页在索引中显示。请注意,noindex meta标记提供了一种方法来控制对网站的逐页访问。
例:
为了防止所有搜索引擎对网站中的网页进行索引,添加:

此处name的值可以设置为某个搜索引擎的User-agent,从而指定应该屏蔽某个搜索引擎。
除了noindex之外,还有其他meta标记,如nofollow,它禁止crawler跟踪来自该页面的链接。详情请参考Google支持的meta标签。这里有一个词:noindex和nofollow在HTML中有描述。规范,但是不同的引擎在不同程度上支持其他标签。也请自行参考各引擎的文档。
Crawl-delay
robots . txt还可以用来控制爬虫的爬行速度,除了控制什么能抓,什么不能抓。你是怎么做到的?设置爬网程序在爬网程序之间等待的秒数。
Crawl-delay:
表示您需要在本次抓取后等待秒钟才能进行下一次抓取。
注意:google不再支持这种方法。站长工具中提供了一个功能,可以更直观的控制抓取率。
这里有个题外话。几年前我记得有一段时间robots.txt也支持复杂参数:visit-time,只有在Visit-time指定的时间段内,爬虫才能访问;Request-rate:用于限制URL的读取频率,用于控制不同时间段不同的抓取速率。后来估计是支持者太少了,渐渐就过时了。有兴趣的同学可以自行谷歌一下。我了解到的情况是,谷歌和百度目前已经不再支持这个规则,其他的小引擎公司似乎也从来不支持。如有支持,我是无知的。请留言。
真的有用吗?
好了,到目前为止,robots.txt相关的东东介绍是7788。我可以坚持说,这里的学生都跃跃欲试。不幸的是,我不得不泼冷水。我能完全指望robots.txt保护我们网站的内容吗?不一定。不然百度和百度就不用对簿公堂了。
协议一致性
第一个问题是robots.txt没有一个正式的标准,各搜索引擎都在不断的扩展robots.txt的功能,导致各引擎对robots.txt的支持程度不同,更不要说某个功能的具体实现不同了。
缓存
第二个问题是robots.txt本身需要抓取。出于效率考虑,一般爬虫在抓取网站页面之前,不会每次都抓取robots.txt。况且robots.txt更新不频繁,内容需要解析。通常爬虫抓取一次,解析一次,缓存一次,需要相当长的时间。假设站长更新了robots.txt,修改了一些规则,但是对于爬虫来说不会马上生效。只有爬虫下次抓取robots.txt时,才能看到更新的内容。不好意思,下一次爬虫抓取robots.txt不受站长控制。当然,一些搜索引擎提供web工具,允许网站管理员通知搜索引擎url已更改,并建议重新抓取。注意,这里是一个建议。即使通知了搜索引擎,搜索引擎什么时候抓取还不确定,但总比根本不通知好。至于好多少,就看搜索引擎的良心和技术能力了。
忽略
第三个问题,不知道是无意还是有意。反正有些爬虫不遵守robots.txt或者完全无视,不排除开发者的能力,比如根本不了解robots.txt。另外,robots.txt本身并不是强制措施。如果网站上有需要保密的数据,必须采取技术措施,如用户认证、加密、ip拦截、访问频率控制等。

第四个问题,即使采取了各种限制,还是有一些恶意抢的行为可以突破这些限制,比如一些用肉鸡抢。悲观地说,只要普通用户能够访问,这种恶意抓取行为就无法完全杜绝。然而,抓取的成本可以通过各种手段增加到不可接受的程度。比如:Captcha,Ajax用户行为驱动的异步加载等。这超出了本文的范围。
泄露
robots.txt本身还是有泄露的风险的。比如某网站的robots.txt中突然增加了一个新条目:Disallow /map/,你会怎么想?是时候推出地图服务了吗?于是好奇的同学们就会开始尝试各种文件名来访问这个路径中的文件,希望能看到惊喜。好像谷歌地图提前被爆了。这个我不确定。就当八卦听吧。
来源:淘宝搜索科技博客

淘宝搜索技术博客-- : 回复

作者:徐州百都网络 | 来源: | 发布于:2022-02-28 01:17:11