简单的说 Robot 协议是用于告诉网络爬虫(主要是搜索引擎爬虫)本域名下的网页中, 那些部分是不应该爬取的,具体来说就是在网站的域名根目录下添加一份robots.txt
文件, 并在文件中声明对应的规则. 由于 Url 对大小写敏感, 所以 robots.txt
文件名要求全部小写.
搜索引擎爬虫在爬取一个网站时, 首先检查是否存在 robots.txt
文件, 如果存在, 则在爬取该网站下其他网页时, 应遵循文件所定义的范围进行爬取.
需要注意的是 Robots 协议是一个共同遵循的"道德约定", 但是不具有法律效应, 同时也不保证所有搜索引擎都会遵守这个约定
文件由多行组成, 每一行都按照 <Field> ":" <value>
的格式, 表示一条规则, '#' 开头的行表示注释
其中, Field 包括3种类型: User-agent, Allow/Disallow 和 Sitemap
语法: User-agent: agent name
说明: 指定一种爬虫, 表示从此行开始, 到下一个 User-agernt 的内容, 是针对该爬虫的, 这一段内容暂且称之为"节"
常见的 User-agent 设置如下:
User-agent: * // 通用爬虫, 即如果没有指定, 则所有爬虫都应遵守本节规则
User-agent: Baiduspider // 百度爬虫
User-Agent: Googlebot // 谷歌爬虫
User-agent: Bingbot // Bing 爬虫
User-Agent: 360Spider // 360 爬虫
User-Agent: Yahoo! Slurp // 雅虎爬虫
User-Agent: Sogouspider // 搜狗爬虫
User-Agent: Yisouspider // 神马搜索爬虫
User-agent: Twitterbot // twitter 爬虫
语法:
- allow:
Allow: rpath
- disallow:
Disallow: path
rpath = '/' + path 也就是说, allow 的规则必须以
/
开头,/
表示网站根目录 此规则, 在 bing 的文档中声明, 所有的规则都必须以/
开头,而不仅仅是 disallow .Note that each URL pattern starts with the forward slash, representing the root of the current site.
如果自己写 robots.txt 文件,建议按照 bing 的规则书写,即均以
/
开头
说明: 表示允许/拒绝 爬取的规则, 具体的规则如下:
- 保留字:
*
: 通配符, 表示任意字符, 如 /*.jpg$
: 表示匹配的字符串在末尾~
: 表示通配符, 与 * 类似,在一层文件夹内的路径名匹配, 如: /~path, 可以匹配 /apath, /bpath 等
例如:
规则 | 测试路径 | 是否匹配 |
---|---|---|
/tmp | /tmp | ✅ |
/tmp | /tmp.html | ✅ |
/tmp | /tmp/a.html | ✅ |
/tmp | /tmp | ❌ |
/tmp | /tmphoho | ❌ |
/tmp | /tmp/a.html | ✅ |
/Hello* | /Hello.html | ✅ |
/He*lo | /Hello,lolo | ✅ |
/Heap*lo | /Hello,lolo | ❌ |
html$ | /tmpa.html | ✅ |
/a.html$ | /a.html | ✅ |
htm$ | /a.html | ❌ |
值得注意的是, 对于以上语法规则, 并不是所有的搜索引擎都会支持, 在 RFC 文佳定义中, 除了以上三中那个外, 作为保留字的还有以下字符: 但是, 并不会所有的搜索都会支持所有关键字, 例如在谷歌的相关文档中只说明了
*
和$
两个特殊字符, 也就是说其他字符不保证支持。 如果需要了解, 需要去看各家搜索引擎的相关文档
safe = "$" | "-" | "_" | "." | "+"
extra = "!" | "*" | "'" | "(" | ")" | ","
- 举例: (来自RFC文件中例子)
假设一个网站的 robots.txt 定义如下:
User-agent: *
Disallow: /org/plans.html
Allow: /org/
Allow: /serv
Allow: /~mak
Disallow: /
则对于以下路径, 爬取规则如右边所示
http://www.fict.org/ ❌
http://www.fict.org/index.html ❌
http://www.fict.org/robots.txt ✅
http://www.fict.org/server.html ✅
http://www.fict.org/services/fast.html ✅
http://www.fict.org/services/slow.html ✅
http://www.fict.org/orgo.gif ❌
http://www.fict.org/org/about.html ✅
http://www.fict.org/org/plans.html ❌
http://www.fict.org/%7Ejim/jim.html ❌
http://www.fict.org/%7Emak/mak.html ✅
Sitemap 指令用于说明网站 sitemap 文件地址, 语法为: Sitemap: path
, 在一个 robots.txt 文件中可以存在多条 sitemap 指令, 表示不同板块下的 sitemap.
如:
Sitemap: http://www.gstatic.com/s2/sitemaps/profiles-sitemap.xml
Sitemap: http://www.google.com/hostednews/sitemap_index.xml
各家搜索引擎会遵循基本的语法规则, 如 User-agent, Allow/Disallow 解析规则等, 但是对于同一节下面所有规则的解释逻辑(优先级) , 各个搜索引擎却不尽相同, 下面具体说明.
在 RFC 文件中, 对于同一节下面的所有规则, 按照顺序从上往下依次读取, 越靠前的规则优先级越高,比如有两条规则:
Disallow: /a/
Allow: /a/b
则对于网站路径 /a/b
不应该被抓取, 因为在先读到的规则中, /a 下的缩影路径都是 disallow 的。 如果想要让 /a/b
可以抓取二 /a 下的其他路径不被抓取, 正确的做法是调换以上两条路径的顺序。
如果没有特殊的文档说明, 那么一般的搜索引擎或者爬虫引擎, 都应该按照 RFC 文档的定义来解析相关规则, 也就是说,假设我开发了一款爬虫引擎, 如果要公开发布, 并支持 robots 协议的话, 应该按照 RFC 约定来解析, 否则应该同时发布自定义解析规则的相关文档。
与 RFC 规则不一样,谷歌的对于同一节下的优先级判断,是由规则的长短, 也就是路径的详细程度来决定的。长度越长, 优先级越高。 这里的“长短”不是字符数的长短, 而应该理解成路径的长短, 比如路径成绩深度, 路径具体程度等。
最直接的理解来说: 路径越具体, 优先级越高。
例如对于下面的规则:
Allow: /p
Disallow: /
那么对于所有 /p
开头的路径, 都允许抓取, 除此之外其他路径都不允许抓取, 并且无论以上两条规则顺序如何, 都是这样。
另外 谷歌关于robots的文档 还介绍了 robot.txt 文件放置的位置及其所影响的范围, 文件格式, 以及上文所提到的基本语法, 这些在所有搜索引擎下都是通用的,并且可读性很好, 建议阅读了解。
在百度关于 robots 协议的公告中有这么一段话:
最后需要说明的是:百度会严格遵守robots的相关协议,请注意区分您不想被抓取或收录的目录的大小写,百度会对robots中所写的文件和您不想被抓取和收录的目录做精确匹配,否则robots协议无法生效。
以及在公告的前面语法部分, 百度直接引用了RFC 文档的截图, 所以我理解为: 百度对于 robot.txt 的解析逻辑, 与 RFC 文档一致
- 淘宝: http://www.taobao.com/robots.txt
- 京东: https://www.jd.com/robots.txt (好狠啊)
- 微博: https://www.weibo.com/robots.txt (好像被压缩工具误杀了, 全部写在一行里面了)
- B站: https://www.bilibili.com/robots.txt (简简单单一视同仁)
首先知道, robots 协议是一个互联网对于搜索引擎或者爬虫引擎爬取网站的协议, 具体表现为, 通过在网站根路径下添加 robots.txt
文件来声明网站中哪些内容允许抓取, 哪些内容不允许抓取, 并且有以下几点需要注意:
- robots 协议以及 robots.txt 文件内容仅仅是一个道德约定, 不具有法律效力, 即对于网络爬虫来说, 可以选择是否遵守协议。
- robots.txt 的语法和解析规则在 RFC 文档中有明确的定义,但是基于这是个非强制性的协议,所以搜索引擎或者网络爬虫在具体实现时可以选择性修改相关的语法和规则, 但是原则上还是以 RFC 定义为准。
- 由于URL是对大小写敏感的,所以 robots.txt 文件名称需要全部小写