Skip to content

Instantly share code, notes, and snippets.

@zhaokuohaha
Last active June 15, 2023 05:38
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zhaokuohaha/fa386d2996f978334fd55094609d6c89 to your computer and use it in GitHub Desktop.
Save zhaokuohaha/fa386d2996f978334fd55094609d6c89 to your computer and use it in GitHub Desktop.
robots.txt基本语法, 以及robots协议的各家搜索引擎实现。

文件简介

简单的说 Robot 协议是用于告诉网络爬虫(主要是搜索引擎爬虫)本域名下的网页中, 那些部分是不应该爬取的,具体来说就是在网站的域名根目录下添加一份robots.txt文件, 并在文件中声明对应的规则. 由于 Url 对大小写敏感, 所以 robots.txt 文件名要求全部小写.

搜索引擎爬虫在爬取一个网站时, 首先检查是否存在 robots.txt 文件, 如果存在, 则在爬取该网站下其他网页时, 应遵循文件所定义的范围进行爬取.

需要注意的是 Robots 协议是一个共同遵循的"道德约定", 但是不具有法律效应, 同时也不保证所有搜索引擎都会遵守这个约定

内容和语法

文件由多行组成, 每一行都按照 <Field> ":" <value> 的格式, 表示一条规则, '#' 开头的行表示注释

其中, Field 包括3种类型: User-agent, Allow/Disallow 和 Sitemap

User-agent

语法: 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 / Disallow

语法:

  • 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 的规则书写,即均以 / 开头

说明: 表示允许/拒绝 爬取的规则, 具体的规则如下:

  1. 保留字:
    1. * : 通配符, 表示任意字符, 如 /*.jpg
    2. $ : 表示匹配的字符串在末尾
    3. ~ : 表示通配符, 与 * 类似,在一层文件夹内的路径名匹配, 如: /~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       = "!" | "*" | "'" | "(" | ")" | ","
  1. 举例: (来自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 文件地址, 语法为: 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) 约定

在 RFC 文件中, 对于同一节下面的所有规则, 按照顺序从上往下依次读取, 越靠前的规则优先级越高,比如有两条规则:

Disallow: /a/
Allow: /a/b

则对于网站路径 /a/b 不应该被抓取, 因为在先读到的规则中, /a 下的缩影路径都是 disallow 的。 如果想要让 /a/b 可以抓取二 /a 下的其他路径不被抓取, 正确的做法是调换以上两条路径的顺序。

如果没有特殊的文档说明, 那么一般的搜索引擎或者爬虫引擎, 都应该按照 RFC 文档的定义来解析相关规则, 也就是说,假设我开发了一款爬虫引擎, 如果要公开发布, 并支持 robots 协议的话, 应该按照 RFC 约定来解析, 否则应该同时发布自定义解析规则的相关文档。

Google规则

与 RFC 规则不一样,谷歌的对于同一节下的优先级判断,是由规则的长短, 也就是路径的详细程度来决定的。长度越长, 优先级越高。 这里的“长短”不是字符数的长短, 而应该理解成路径的长短, 比如路径成绩深度, 路径具体程度等。

最直接的理解来说: 路径越具体, 优先级越高。

例如对于下面的规则:

Allow: /p
Disallow: /

那么对于所有 /p 开头的路径, 都允许抓取, 除此之外其他路径都不允许抓取, 并且无论以上两条规则顺序如何, 都是这样。

另外 谷歌关于robots的文档 还介绍了 robot.txt 文件放置的位置及其所影响的范围, 文件格式, 以及上文所提到的基本语法, 这些在所有搜索引擎下都是通用的,并且可读性很好, 建议阅读了解。

Baidu

百度关于 robots 协议的公告中有这么一段话:

最后需要说明的是:百度会严格遵守robots的相关协议,请注意区分您不想被抓取或收录的目录的大小写,百度会对robots中所写的文件和您不想被抓取和收录的目录做精确匹配,否则robots协议无法生效。

以及在公告的前面语法部分, 百度直接引用了RFC 文档的截图, 所以我理解为: 百度对于 robot.txt 的解析逻辑, 与 RFC 文档一致

robots.txt 文件示例:

小结

首先知道, robots 协议是一个互联网对于搜索引擎或者爬虫引擎爬取网站的协议, 具体表现为, 通过在网站根路径下添加 robots.txt 文件来声明网站中哪些内容允许抓取, 哪些内容不允许抓取, 并且有以下几点需要注意:

  • robots 协议以及 robots.txt 文件内容仅仅是一个道德约定, 不具有法律效力, 即对于网络爬虫来说, 可以选择是否遵守协议。
  • robots.txt 的语法和解析规则在 RFC 文档中有明确的定义,但是基于这是个非强制性的协议,所以搜索引擎或者网络爬虫在具体实现时可以选择性修改相关的语法和规则, 但是原则上还是以 RFC 定义为准。
  • 由于URL是对大小写敏感的,所以 robots.txt 文件名称需要全部小写

参考链接

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment