robots.txt 怎么写才管得住 AI 爬虫

robots.txt 怎么写才管得住 AI 爬虫?难点不在语法,在一条规则:爬虫找到自己的名字后就不再看 User-agent: * 那一段。附 16 个 UA 的三档判断表和一段可直接粘的配置。

抓取与收录5 分钟读完1962 次阅读
robots.txt 怎么写才管得住 AI 爬虫

robots.txt 怎么写才管得住 AI 爬虫,难点不在语法,在一条几乎没人提的匹配规则:一个爬虫只要在文件里找到了自己的名字,就彻底不看你那段 User-agent: * 了。你为 GPTBot 单独加一行,之前给"所有人"写的规则,对它就全部失效——文件照样能通过校验,没有任何地方会提醒你。

读这篇之前

这一章默认 AI 爬虫已经能连到你的服务器。要是还没确认过,先去确认——一个写满 Allow 的文件,在拦截发生在你网站上一层的时候什么都证明不了。两分钟的查法在怎么查网站能不能被 AI 抓取

robots.txt 管得了什么,管不了什么

它表达的是意愿。爬虫愿不愿意读、读完认不认,是它的事,这个文件本身拦不住任何请求。守规矩的 AI 爬虫会认。但真正决定字节回不回得来的是你的 CDN、防火墙和源站,它们三个谁都不看这个文件。

robots.txt 决定你允许什么,从来不决定你实际吐出去什么。

robots.txt 怎么写会写坏:只生效一组

一个爬虫只遵守一组规则——名字指得最具体的那一组。指名的那组里没写到的,它不会退回去看你的通用规则。Google 的规范原文说得很直接:"Only one group is valid for a particular crawler",以及"User agent specific groups and global groups (*) are not combined."(指名分组和通配分组不合并。)

所以下面这个文件,做的不是它看起来在做的事:

User-agent: *
Disallow: /admin/
Disallow: /cart/

User-agent: GPTBot
Disallow: /drafts/

你当人读,是 GPTBot 被挡在三个目录外面。GPTBot 自己读,全文只有一行:/drafts/。后台和购物车那两个路径,在你敲下第二组的那一刻就重新对它开放了。

robots.txt 里有两组规则,GPTBot 只读指名自己的那一组,通配的那组从不读取

改法是把共用的规则在每个指名分组里重抄一遍。看着啰嗦,但这是对的。

User-agent: GPTBot
Disallow: /admin/
Disallow: /cart/
Disallow: /drafts/

动笔前先把爬虫分成三档

要决定的不是"这个爬虫放不放",是"这类活儿要不要"。搜索类爬虫喂的是用户这周就能看到的答案,挡掉它等于从那个答案里消失;训练类喂的是明年的模型;还有一类是用户当场提问才去抓的,你基本管不住。

名字干什么的挡掉的代价
放行OAI-SearchBot给 ChatGPT 搜索建索引从 ChatGPT 的取材池里消失
放行PerplexityBot给 Perplexity 建索引从 Perplexity 结果里消失
放行Claude-SearchBot改善 Claude 的搜索结果从 Claude 的取材池里消失
放行Meta-WebIndexer改善 Meta AI 搜索结果从 Meta AI 答案里消失
放行GooglebotGoogle 索引,AI 概览也吃它整个 Google 都没了
放行bingbotBing 索引,Copilot 吃它Bing 和 Copilot 都没了
看情况GPTBot训练 OpenAI 模型不影响今天的答案
看情况ClaudeBot训练 Anthropic 模型不影响今天的答案
看情况Meta-ExternalAgent训练模型,也做内容索引两头都沾,自己权衡
看情况CCBotCommon Crawl 公开档案从一个公开数据集里退出
看情况Google-ExtendedGemini 训练,不是爬虫Google 搜索里没有代价
看情况Applebot-ExtendedApple 模型训练,不是爬虫Apple 搜索结果里没有代价
管不住ChatGPT-User用户当场提问才去抓见下一节
管不住Perplexity-User用户当场提问才去抓见下一节
管不住Claude-User用户当场提问才去抓见下一节
管不住Meta-ExternalFetcher按用户请求抓单个链接见下一节

名字和用途全部来自各家自己的文档:OpenAIPerplexityAnthropicGoogleAppleMetaCommon Crawl。抄之前自己去核一遍,包括下面这段——这份名单一直在变。

一段可以直接粘的 robots.txt

放行搜索、自己决定训练。把两个私有路径换成你自己的;愿意被拿去训练,就把训练那组整段删掉。

# 搜索与答案类爬虫 —— 放行,私有路径除外
User-agent: Googlebot
User-agent: bingbot
User-agent: OAI-SearchBot
User-agent: PerplexityBot
User-agent: Claude-SearchBot
User-agent: Meta-WebIndexer
Disallow: /admin/
Disallow: /cart/

# 模型训练 —— 拒绝。愿意被训练就删掉这一组。
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: CCBot
User-agent: Meta-ExternalAgent
User-agent: Google-Extended
User-agent: Applebot-Extended
Disallow: /

# 其余所有
User-agent: *
Disallow: /admin/
Disallow: /cart/

Sitemap: https://example.com/sitemap.xml

连着写的多行 User-agent 共用下面那套规则,所以上面每一块是一组,不是六组。私有路径故意写了两遍——就是上一节要求的那种重抄。

文件里有两行根本不是爬虫

Google-ExtendedApplebot-Extended 从不向你的服务器发请求。它们是控制令牌:改变的是"别的爬虫已经抓走的内容可以拿去做什么"。没有流量可看,也没有任何实测能验证你这行设置生效了。

搜索爬虫发请求并遵守 robots.txt,控制令牌从不发请求,用户触发的抓取绕过 robots.txt

这两个被当成排名风险的次数特别多,而两家都白纸黑字写了不是。Google:Google-Extended "does not impact a site's inclusion in Google Search nor is it used as a ranking signal in Google Search"(不影响网站在 Google 搜索里的收录,也不是排名信号)。Apple:Applebot-Extended "does not crawl webpages",而且"webpages that disallow Applebot-Extended can still be included in search results"(禁止它的页面照样能进搜索结果)。

robots.txt 拦不住的那一类

用户当场提问才触发的抓取是另一码事,而且至少有一家明说了它不看这个文件。Perplexity 关于 Perplexity-User 的原文:"Since a user requested the fetch, this fetcher generally ignores robots.txt rules."(因为是用户发起的抓取,它一般会忽略 robots.txt 规则。)

老实说,表格最下面那一档,靠这个文件是管不住的。真有页面不能被当场抓走,该上的是登录态,不是 robots.txt。至于这几类抓取实际来得多不多,我们没有自己的日志数据,也不打算拿一个没测过的数字来充数。

三种常见的写错

三个都是静默的:文件有效、工具不报错,代价要等流量不来了才看得见。

  1. 挡了 GPTBot,以为 ChatGPT 就搜不到自己了。GPTBot 是训练爬虫。决定 ChatGPT 今天能不能把你端出来的是 OAI-SearchBot。只挡训练、放行搜索是个说得通的选择;把两者当成一回事不是。
  2. 加了指名分组,把共用规则弄丢了。就是第三节那个坑。每次改完,按每个指名爬虫的视角把文件重读一遍,问一句:只看这一组,它能看到什么。
  3. 改错了域名下的文件。规则只对提供这个文件的主机名、协议和端口生效,所以 https://example.com/robots.txt 管不到 https://www.example.com。两个域名都能打开,就得各放一份。

常见问题

屏蔽 Google-Extended 会掉 Google 排名吗

不会,Google 自己写着:"does not impact a site's inclusion in Google Search nor is it used as a ranking signal in Google Search"。它只管 Gemini 的模型训练。

加了 Disallow,之前被拿去训练的内容会被删掉吗

不会。这些指令全部是往后生效的,管的是以后还抓不抓,不管你写下这行之前已经收走的数据。

这个文件多久该回头看一次

出现新爬虫的时候——Meta-WebIndexer 就新到多数公开示例里都还没有它;以及每次换托管平台之后,因为新平台会带一份自己的默认文件。

下一步

文件现在说的是你的真实意思了。你的服务器认不认是另一个问题,而最常见的不认,就是 CDN 把你 robots.txt 里欢迎的爬虫挡在了外面。那是下一章,也是"文件写得完美却依然不被收录"最常见的单一原因。

改一个文件是便宜的那一半。把改动写完、发出去、再推送收录,才是大部分网站真正卡住的地方。

本文属于 QueryWin 实操手册 · 第 1 阶

robots.txt 怎么写才管得住 AI 爬虫