网站的robots.txt是什么文件?有什么用?怎么写?我们先来了解robots协议,从2012-2013的“3B大战”说起。
2013年2月8日北京市第一中级人民法院正式受理了百度诉奇虎360违反“Robots协议”抓取、复制其网站内容的不正当竞争行为一案,索赔金额高达一亿元,这可以看做2012年下半年“3B大战”的继续。在此次索赔案件中,百度称自己的Robots文本中已设定不允许360爬虫进入,而360的爬虫依然对“百度知道”、“百度百科”等百度网站内容进行抓取。
其实早在2012年11月初,针对双方摩擦加剧的情况,在中国互联网协会的牵头下,包括百度、新浪、奇虎360在内的12家互联网公司已共同签署了《互联网搜索引擎服务自律公约》,在公约第七条承诺“遵循国际通行的行业惯例与商业规则,遵守机器人协议(robots协议)。
下面我们就来聊一聊网站的robots.txt文件。
1. 初识robots协议
什么是robots?
要了解robots协议首先要了解robots,本文说的robots不是《I,robot》里的威尔·史密斯,不是《机器人总动员》里的瓦力和伊娃,不是《终结者》系列中的施瓦辛格。什么?这些经典电影你都不知道?好吧,算我想多了。本文的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协议并非是规范,只是行业内一个约定俗成的协议。什么意思呢?Robots协议不是什么技术壁垒,而只是一种互相尊重的协议,好比私家花园的门口挂着“闲人免进”,尊重者绕道而行,不尊重者依然可以推门而入,比如说360。
国内最经典的例子,淘宝:
User-agent: Baiduspider
Disallow: /
User-agent: baiduspider
Disallow: /
程序猿,你懂的。这不就是淘宝不想让百度抓取嘛。
2. robots.txt的作用
我们把允许和不允许搜索引擎抓取的内容,按照robots协议放到纯文本文件robots.txt里,然后放到站点的根目录下。爬虫抓取网站内容前会先抓取robots.txt,据此“自觉地”抓取或者不抓取该网页内容,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。如果没有的话,搜索引擎机器人将对整个网站进行爬行,包括网站根目录的所有数据内容。
具体的工作原理,如图所示
从SEO角度来说,刚上线的网站,由于页面较少,robots.txt做不做都可以,但随着页面的增加,robots.txt的SEO作用就体现出来了,主要表现在以下几个方面。
优化搜索引擎机器人的爬行抓取
阻止恶意抓取,优化服务器资源
减少重复内容出现在搜索结果中
隐藏页面链接出现在搜索结果中
3. robots.txt的位置
一般放在网站根目录下,如果你网站的域名是www.abc.com,robots.txt的查看地址是www.abc.com/robots.txt,如图所示
4. robots.txt的写法
robots.txt没有固定的写法,一般写法包括User-agent,Disallow,Allow和Crawl-delay。
User-agent: 指定对哪些爬虫生效,后面填你要针对的搜索引擎,通配符(*)代表全部搜索引擎
Disallow: 指定要屏蔽的网址,后面填你要禁止抓取的网站内容和文件夹,/做前缀
Allow: 指定允许抓取的网址,后面填你允许抓取的网站内容,文件夹和链接,/做前缀
Crawl-delay: 意思是抓取延迟,后面填数字,小网站不建议使用
下面详细介绍:
(1)User-agent
爬虫抓取时会声明自己的身份,这就是User-agent,没错,就是http协议里的User-agent。robots.txt利用User-agent来区分各个引擎的爬虫。
举例说明:google网页搜索爬虫的User-agent为Googlebot,下面这行就指定google的爬虫。
User-agent:Googlebot
如果想指定所有的爬虫怎么办?不可能穷举啊,可以用符号通配符(*),如下面这一行:
User-agent: *
可能有的同学要问了,我怎么知道爬虫的User-agent是什么?这里提供了一个简单的列表:爬虫列表,百度爬虫列表
(2)Disallow
Disallow 行列出的是要拦截的网页,以正斜线 (/) 开头,可以列出特定的网址或模式。
要屏蔽整个网站,使用正斜线即可:
Disallow: /
要屏蔽某一目录以及其中的所有内容,在目录名后添加正斜线:
Disallow: /目录名/
要屏蔽某个具体的网页,就指出这个网页。
Disallow: /网页.html
Disallow还可以使用前缀和通配符。
关于前缀
要屏蔽目录a1-a100,可以使用上面的方式写100行,或者
Disallow:/a
但是需要注意,这样会把任何以a开头的目录和文件也屏蔽,慎用。
关于通配符
通配符(*)不仅可以屏蔽所有搜索引擎,还可以匹配URL模式。
例如,如果你想阻止搜索引擎访问您网站上参数化的产品类别 URL,可以像这样列出它们:
User-agent: *
Disallow: /products/t-shirts?
Disallow: /products/hoodies?
Disallow: /products/jackets?
…
但这不是很有效。最好用这样的通配符来简化事情:
User-agent: *
Disallow: /products/*?
此示例阻止搜索引擎抓取 /product/ 子文件夹下包含问号的所有 URL。换句话说,任何参数化的产品类别 URL。
使用“$”来指定URL的结尾
如果你想阻止搜索引擎访问您网站上的所有 .pdf 文件,可以这样写:
User-agent: *
Disallow: /*.pdf$
在此示例中,“*”匹配任意个字符,“$”符号以标记URL的结尾,搜索引擎无法访问任何以 .pdf 结尾的 URL。这意味着他们不能访问/file.pdf,但他们可以访问/file.pdf?id=68937586,因为它不以“.pdf”结尾。
关于大小写
提示一下,Disallow的内容区分大小写。例如,Disallow: /junkfile.asp 会屏蔽 junkfile.asp,却会允许Junk_file.asp。
最后,通配符不是所有搜索引擎都支持,使用要小心。没办法,谁让robots.txt没有一个大家都承认的标准呢。
实例 ###
User-agent: Baiduspider
Disallow: /baidu
Disallow: /s?
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
User-agent: Googlebot
Disallow: /baidu
Disallow: /s?
Disallow: /shifen/
Disallow: /homepage/
Disallow: /cpro
Disallow: /ulink?
Disallow: /link?
Disallow: /home/news/data/
Disallow: /bh
...
现在读懂这个应该毫无压力了吧。
(3)allow
接上面的,如果需要屏蔽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
聪明的你一定能发现其中的规律,对吧?谁管的越细就听谁的。
更具体的写法,大家可以参考谷歌robots.txt官方文档,如下图所示。
(4)Crawl-delay
除了控制哪些可以抓哪些不能抓之外,robots.txt还可以用来控制爬虫抓取的速率。如何做到的呢?通过设置爬虫在两次抓取之间等待的秒数。
Crawl-delay:5
表示本次抓取后下一次抓取前需要等待5秒。
Google 不再支持此指令,但Bing 和Yandex支持。
也就是说,设置此指令时要小心,特别是如果您有一个大站点。如果将抓取延迟设置为 5 秒,那么爬虫每天最多抓取 17,280 个 URL。如果你的网站有数百万个页面,这不是很有帮助,但如果只是一个小网站,它可以节省带宽。
(5)sitemap
前面说过爬虫会通过网页内部的链接发现新的网页。但是如果没有连接指向的网页怎么办?或者用户输入条件生成的动态网页怎么办?能否让网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页?这就是sitemap,最简单的 Sitepmap 形式就是 XML 文件,在其中列出网站中的网址以及关于每个网址的其他数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度等等),利用这些信息搜索引擎可以更加智能地抓取网站内容。
标准的格式:
Sitemap: https://www.yourdomain.com/sitemap.xml
至于sitemap文件怎么生成,一般网站CMS系统或者第三方软件都可以生成,可以搜索一下。
(6)工具
分享一个工具:Robots.txt 文件生成器
使用这样的工具的优点是可以最大限度地减少语法错误。这很好,因为一个错误可能会导致您网站的SEO灾难——因此谨慎行事是值得的。
缺点是它们在可定制性方面有些受限。
5. WordPress网站robots.txt最佳写法
虽然上面讲的写法指令看上去很复杂,但只要你使用的是WordPress,就会变的简单许多,毕竟wp是谷歌的亲儿子,就SEO而言,WordPress网站的robots.txt最佳写法如下,
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Sitemap: https://www.yourdomain.com/sitemap.xml
或者是下面这个样子。
User-agent: *
Allow: /
Sitemap: https://www.yourdomain.com/sitemap.xml
两者的区别是要不要禁止抓取/wp-admin/。
关于/wp-admin/,2012年WordPress增加了一个新标记@header( 'X-Robots-Tag: noindex' ),效果和用robots.txt禁止抓取/wp-admin/一样,如果还是不放心的话,可以加上。
至于其它不想被搜索引擎抓取的网站内容和链接,根据自己网站的需求来做就行了。
可以使用robots.txt禁止抓取,也可以使用Meta Robots做Noindex。我个人的看法是wp程序自带链接用Meta Robots,需要隐藏的网站内容页面用robots.txt。
6. Zblog网站robots.txt最佳写法
我们来看看下面几种zblog网站robots.txt的最佳写法,仅供参考
第一种:
User-agent: *
Disallow: /zb_system/
Sitemap:http://www.yourdomain.com/sitemap.xml
第二种:
User-agent: *
Disallow: /zb_users/
Disallow: /zb_system/
Sitemap:http://www.yourdomain.com/sitemap.xml
第三种:
User-agent: *
Allow: /zb_users/upload
Disallow: /zb_users/
Disallow: /zb_system/
Disallow: /search.php
Sitemap:http://www.yourdomain.com/sitemap.xml
如果不是很懂的话,建议选择第一种,最简洁,因为越复杂越容易出错,还起了反作用。
7. 如何审核robots.txt文件
对于新手来说,robots.txt很容易写错,可以在Google robots.txt测试工具检查robots.txt文件是否含有错误,如图所示,
总结
接下来要做的是把写好的robots.txt文件添加到你的网站。
根据我自己的经验,robots.txt的指令越少越好,在我还是小白的时候看了一些大神的文章,把很多文件目录和网站内容都禁止了,直接导致JS和CSS无法正常运行。
最后,要注意的是robots.txt文件里的指令是分大小写的,不要弄错了。