是否可以在 robots.txt 中向多个机器人发出一条指令,而无需重复提及?
示例:
User-agent: googlebot yahoobot microsoftbot
Disallow: /boringstuff/
注意:自从这个答案最初被写出来以来,Google的描述已经被大幅重写,并且在这个主题上不再有任何歧义。此外,终于有了RFC 9309形式的正式标准。
下面的结论是:有一种公认的对用户代理进行分组的方法,但您可能希望在不复杂的爬虫程序中使用尽可能简单的格式。
原答案如下。
实际上很难给出明确的答案,因为 robots.txt 没有一个非常明确的标准,而且很多文档都含糊不清或相互矛盾。
谷歌机器人能理解的格式描述相当全面,包括这个稍微乱码的句子:
多个紧随其后的组开始线将遵循最后一个组开始线之后的组成员记录。
这似乎是在摸索以下示例中所示的内容:
user-agent: e
user-agent: f
disallow: /g
根据下面的解释,这构成了一个“组”,不允许两个不同的用户代理使用相同的 URL。
因此,您想要的正确语法(对于与 Google 的工作方式相同的任何机器人)将是:
User-agent: googlebot
User-agent: yahoobot
User-agent: microsoftbot
Disallow: /boringstuff/
但是,正如 Jim Mischel 指出的那样,robots.txt 文件中没有任何意义,一些机器人会正确解释,但其他机器人可能会窒息,因此最好采用重复的“最低公分母”块,也许通过使用简单的“配方”和更新脚本动态生成文件。
我认为原始robots.txt规范明确地定义了它:one
User-agent
行只能有one值。
一条记录(又名:一个块、一组)由行组成。每条行都有形式
<field>:<optionalspace><value><optionalspace>
User-agent
是一个字段。这是价值:
此字段的值是记录描述其访问策略的机器人的名称。
它是单数(“机器人的名称”),而不是复数(“机器人的名称”)。
机器人应该自由地解释这个领域。建议对不带版本信息的名称进行不区分大小写的子字符串匹配。
如果允许多个值,解析器怎么可能是自由的?无论分隔字符是(
,
、
、;
、...),它都可以是机器人名称的一部分。
记录以一行或多行用户代理开始
如果您
可以在一行中提供多个值,为什么要使用多行
User-agent
?
另外:
Disallow
所以而不是
User-agent: googlebot yahoobot microsoftbot
Disallow: /boringstuff/
你应该使用
User-agent: googlebot
User-agent: yahoobot
User-agent: microsoftbot
Disallow: /boringstuff/
或者(可能更安全,因为您无法确定是否所有相关解析器都支持不那么常见的方式,即为一条记录包含几行
User-agent
行)
User-agent: googlebot
Disallow: /boringstuff/
User-agent: yahoobot
Disallow: /boringstuff/
User-agent: microsoftbot
Disallow: /boringstuff/
(当然
User-agent: *
)
用户代理
此字段的值是记录描述其访问策略的机器人的名称。
如果存在多个用户代理字段,则该记录描述了多个机器人的相同访问策略。每条记录至少需要存在一个字段。
机器人应该自由地解释这个领域。建议对不带版本信息的名称进行不区分大小写的子字符串匹配。
如果值为“*”,则该记录描述未与任何其他记录匹配的任何机器人的默认访问策略。 “/robots.txt”文件中不允许有多个这样的记录。
我从未见过在一行中列出多个机器人。我的网络爬虫很可能无法正确处理这样的事情。但根据上面的规范,应该是合法的。
还要注意,即使 Google 在单个指令中支持多个用户代理,或者 IMSoP 的答案中描述的多个用户代理(顺便说一句,有趣的发现......我不知道那个),也不是所有其他爬虫会。您需要决定是否要使用很可能只有 Google 和 Bing 机器人支持的便捷语法,或者使用所有礼貌机器人都支持的更麻烦、更简单的语法。
你必须将每个机器人放在不同的线上。
正如已接受的答案中提到的,最安全的方法是为每个机器人添加一个新条目。
这个仓库有一个很好的 robots.txt 文件,可以阻止很多坏机器人:https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/blob/master/robots.txt/robots.txt