在 robots.txt 里对 AI 爬虫表态之前,先把问题问准:你要挡的是「搜索展示」「模型训练」,还是「用户当次提问时的即时读取」?这三个目标对应不同的 token,写错一个位置,很可能挡住的是你不介意的那件事,而真正想限制的那件事没有变。
三组 token,影响三件不同的事
谷歌这一侧要用两个身份来理解。Googlebot 是搜索抓取的入口,它决定你的内容能不能被抓去用于 Google 搜索;Google-Extended 是另外的 robots.txt 控制 token,谷歌文档写明它没有独立的请求 User-Agent,抓取沿用现有标识,token 只起控制作用,管的是内容能否用于训练后续 Gemini 模型以及为 Gemini 应用、Vertex AI 提供 grounding。同一份文档也给了明确的边界:Google-Extended 不影响站点在 Google 搜索中的收录,也不是排名信号。所以「我想让页面留在搜索里、但不希望被拿去训练」这种需求,靠的是两个不同的 token。
OpenAI 把两件事明确分成两个设置:允许 OAI-SearchBot 是为了让站点出现在搜索功能的结果里,禁止 GPTBot 表示内容不希望用于训练基础模型,两者互相独立。文档里还有一句值得记住的后果说明:被排除在 OAI-SearchBot 之外,站点不会出现在 ChatGPT 的搜索回答里,但仍可能作为导航链接出现。另外,站点的 robots.txt 更新之后,搜索侧大约需要 24 小时调整。
Anthropic 现在给出三个身份:ClaudeBot 与训练有关,Claude-User 处理用户提问时的页面读取,Claude-SearchBot 用于改善搜索结果质量。Perplexity 这一侧,PerplexityBot 负责在搜索结果中呈现并链接网站,文档写明它不用于抓取训练基础模型的内容;Perplexity-User 是用户提问时的即时访问,并明确提示:因为请求由用户发起,这个抓取器通常会忽略 robots.txt 规则。
拿一份真实的 robots.txt 逐行看
空谈配置不如看一个实际文件。下面是光算官网当前对外提供的 robots.txt,任何人都可以直接访问同一路径核对。它的策略是全部允许,包括训练类、索引类和用户触发类爬虫,只保留后台路径不允许抓取。
逐行看下来,有三点值得注意,也适用于任何一份同类文件:
- 默认组
User-agent: *只写了Allow: /与后台路径的Disallow,没有针对 AI 的通用规则;后面的每一个名字都是单独一条 Allow。 - 文件里出现了 Claude-Web、anthropic-ai 这两个名字。它们在 Anthropic 当前的爬虫文档里已经不再作为受支持的 token 列出,现在文档给出的是 ClaudeBot、Claude-User、Claude-SearchBot。写旧名字不报错,但不等于按预期生效。
- 文件里没有 Claude-SearchBot 这一条。按「只写需要的例外、其余交给默认组」的思路,这不一定是问题;但如果当初写那些 Allow 的用意是「明确表态允许 AI 抓取」,那么名字需要跟着官方文档更新。
这份文件说明的是「允许」这一侧的写法。反过来,如果你决定限制某一类抓取,需要知道 robots.txt 的匹配规则:谷歌的爬虫会在文件里找与自身 User-Agent 最匹配的那一组规则,其他组被忽略;路径匹配时使用最长路径的那条规则,遇到互相冲突的规则(包括带通配符的)则采用限制最少的一条。也就是说,组写重复、顺序随意、路径写得太宽,都会让实际结果和你以为的相反。
写了 Disallow 不等于对方一定不来
robots.txt 的性质要先摆清楚。谷歌文档写着两句话值得原样记住:robots.txt 里的规则可能不被所有搜索引擎支持;robots.txt 里的指令无法强制爬虫行为,是否遵守取决于爬虫自己。同一份文档也提醒不要把 robots.txt 当成从搜索结果里隐藏页面的手段:被 robots.txt 拦下的网页,URL 仍可能出现在搜索结果里,只是不会带描述。
再叠加一层:用户触发类的抓取器(ChatGPT-User、Perplexity-User)官方都说明由用户请求发起,其中 Perplexity 明确写了通常会忽略 robots.txt。也就是说,想靠 robots.txt 完全控制「用户在 AI 里问一句、系统去读你页面」这件事,方向就不对。这类访问更适合在服务端按来源 IP 段和 User-Agent 组合判断,Anthropic 还提示过:只封 IP 可能不可靠,因为那会妨碍系统读取你的 robots.txt。
Crawl-delay 要不要写:先看谁支持
谷歌的 robots.txt 规格页写得很直接:支持的字段是 user-agent、allow、disallow、sitemap,其他字段例如 crawl-delay 不受支持。Anthropic 的文档则明确表示,为限制抓取频率,支持非标准的 Crawl-delay 扩展,并给出 User-agent: ClaudeBot 加 Crawl-delay: 1 的示例。在 OpenAI、Perplexity、Bing 的爬虫文档里没有看到 crawl-delay 的相关说明,所以不要把它当成跨平台的通用频率控制手段;真要限速,服务器侧的速率限制和 CDN/WAF 规则更可靠。
一个可以照着走的取舍顺序
- 先确认业务目标:站点要靠自然搜索和 AI 答案获得海外询盘,还是内容本身是资产、不希望被训练使用。两者的配置方向不同。
- 按目标给 token 分组:搜索索引类(Googlebot、OAI-SearchBot、Claude-SearchBot、PerplexityBot、bingbot)与训练类(Google-Extended、GPTBot、ClaudeBot)分开处理。
- 核对名字是否为官方当前版本,把已经改名的旧 token 换成文档里的现名。
- 写完先取一次实际响应确认,再等生效:影响搜索侧的时间不由你决定,OpenAI 说明搜索侧大约 24 小时,谷歌没有承诺固定时长。
- 留意 CDN 与 WAF:入口层拦截、缓存旧文件,都可能让配置文件看起来「写了没用」。
如果抓取已经放开,下一个要判断的问题往往不是权限,而是文件本身值不值得被读。关于 llms.txt 这类提案文件的现状和边界,我们在llms.txt 到底有没有用里单独说明;想先回到爬虫身份本身,可以看主流 AI 爬虫的身份与用途盘点。索引与摘要相关的冲突处理,另有一篇HTML 写了 index、响应头却有 noindex 可以直接对照。光算的 GEO 服务会把抓取检查放进具体项目范围里确认,不把它当作独立的效果承诺。
如果正在处理这类情况,下面两篇可以对照着看:WordPress站内搜索页被收录:先查noindex有没有真正输出、抓取量下滑先看哪儿?用GSC主机状态区分DNS、连接与robots问题。
参考来源
- Robots.txt Specifications / Introduction to robots.txt — robots.txt 指令不能强制爬虫行为,是否遵守取决于爬虫本身,且并非所有搜索引擎都支持。
- Robots.txt Specifications — 谷歌只支持 user-agent、allow、disallow、sitemap 四个字段,crawl-delay 不受支持。
- Google common crawlers — Google-Extended 是独立的 robots.txt 控制 token,没有单独的请求 User-Agent,也不影响搜索收录与排名。
- Overview of OpenAI Crawlers — OAI-SearchBot 与 GPTBot 是两个独立设置,前者影响是否出现在搜索回答,后者影响训练用途。
- Does Anthropic crawl data from the web, and how can site owners block the crawler? — Anthropic 支持非标准的 Crawl-delay 扩展,并给出 ClaudeBot 示例。
- Perplexity Crawlers — Perplexity-User 由用户请求触发,通常会忽略 robots.txt 规则。