robots.txt 对 AI 爬虫能管住什么、管不住什么:一份不用猜的边界清单

0 阅读3分钟

短答案

robots.txt 能表达的只有一件事:「这些路径,请你不要抓。」

它是一个公示,不是一道门。管得住的是「愿意遵守的爬虫的抓取范围」,管不住的是「不遵守的爬虫、伪造的 UA、已经流出的内容、抓取频率与成本,以及内容被拿走之后怎么用」。

先快速看一眼你现在给了谁什么权限:

curl -s https://example.com/robots.txt | grep -iE 'user-agent|allow|disallow|sitemap'

一、它能管住什么

  1. 路径级授权。 目录、具体文件、后缀,配合 * 通配和 $ 结尾锚,粒度能做到单个 URL。
  2. 按爬虫分群。 同一个站可以对不同 UA 给不同答案,这是它最有用的能力。
  3. 声明 sitemap 位置。 这属于辅助发现,不是限制。
  4. 对公开承诺遵守的爬虫有实际约束力。 注意这句话的重心在「承诺遵守」——全部效力都建立在这里。协议本身没有技术执行手段,也没有惩罚机制。

二、它管不住什么

1. 不遵守的爬虫

这一条决定了其他所有条。任何爬虫都可以无视 robots.txt 直接抓取,你的文件对它没有任何技术约束力。它只是一个「礼貌请求」。

2. 伪造的 UA

UA 是请求方自己写的一句话,不是身份。想被放行的可以自称搜索爬虫,想绕过拦截的也可以随时换一个。真正的爬虫身份校验(例如反向 DNS 正查)成本高得多,一般站点不会做。

3. 已经流出的内容

搜索快照、聚合站、镜像、他人转载、第三方数据集——这些都不经过你的 robots.txt。内容一旦被公开抓取过一次,事后收紧规则收不回来。

4. 频率、并发、带宽成本

robots.txt 里没有速率语义。Crawl-delay 不是通用字段,主流搜索爬虫不以它为准,部分爬虫读、部分不读,你不能把限速押在它上面。真正可控的限速只能在网关/WAF 做。

5. 「可检索、不可训练」这种粒度

少数厂商把不同用途拆成了独立 token,你可以只拦其中一个而不影响另一个;但多数情况下,一个 UA 同时承担索引与模型用途,而 robots.txt 的语法里没有任何方式表达「可以为了搜索结果抓,不可以为了训练抓」。你能做的只有整段放或者整段拦。

6. 抓走之后的使用

引用、摘要、训练、再分发,全部发生在抓取之后。robots.txt 管的是「抓」,管不到「用」。

三、那要靠什么补

你想达到靠什么能做到什么程度
知道谁在抓访问日志按 UA 聚合只能看见愿意自报家门的
按爬虫放行/拦截并且可观测日志 + 规则化拦截UA 未伪造时有效
控制频率与成本网关 / WAF 限速有效,但可能误伤共享出口 IP
控制内容暴露面内容分级、登录墙、摘要代替全文最根本,也最费工
表达「欢迎抓什么」llms.txt 一类提案文件引导性,无强制力
事后追责服务条款、版权投诉视法域而定

先把日志这一段跑起来,至少知道现在发生了什么:

# combined 格式下,UA 是第 6 个双引号字段
awk -F'"' '{print $6}' /var/log/nginx/access.log \
  | awk '{print $1}' \
  | sort | uniq -c | sort -rn | head -20
# 某个 UA 打了哪些路径
awk -F'"' '$6 ~ /GPTBot|CCBot|ClaudeBot/ {print $2}' /var/log/nginx/access.log \
  | awk '{print $2}' | sort | uniq -c | sort -rn | head -20

要把「看得见」和「拦得住」连起来,可以用 AumCrawl,它解决的就是按爬虫看进站、并按爬虫分别放行或拦截这一段。

四、网关层怎么写

nginx 里按 UA 拒绝 + 按 IP 限速,两段可以一起用:

map $http_user_agent $blocked_bot {
    default 0;
    ~*GPTBot      1;
    ~*CCBot       1;
    ~*ClaudeBot   1;
    ~*Bytespider  1;
}

limit_req_zone $binary_remote_addr zone=perip:10m rate=30r/m;

server {
    if ($blocked_bot) {
        return 403;
    }

    location / {
        limit_req zone=perip burst=20 nodelay;
        # ...
    }
}

几个经验点:

  • 返回明确的 403 / 429,不要返回 200 的空页面。返回 200 会被缓存、会被当成正常抓取,日志里更难分辨,对方也学不到「这里不让抓」;
  • 限速按 IP 做,共享出口(办公网、云函数、代理池)会误伤,先用宽松阈值观察一周再收紧;
  • 拦截规则和 robots.txt 保持同一份名单,否则两边会慢慢漂移。

五、一份分层决策表

内容类型robots.txt网关内容策略
公开博客、文档放行搜索引擎不限速,设阈值告警无需额外处理
商品页、价格页放行搜索引擎,训练型按策略对高频 UA 限速关键信息用图/接口渲染需权衡
会员内容、付费内容仅作辅助限速真正靠登录态与鉴权
后台、内部接口不要依赖它统一拒绝靠鉴权,robots.txt 里也别写路径

最后一行值得单独说:robots.txt 是公开文件,往里写 /admin-xxx/ 之类的路径,等于给所有人一份目录提示。不要用它来隐藏任何东西。

六、三个常见误区

  1. 「写了 Disallow: / 内容就不会被用」——只对愿意遵守的爬虫成立,而且已经抓走的收不回来。
  2. 「robots.txt 能防采集」——它没有执行能力。防采集要靠限速、鉴权和内容分级。
  3. 「拦了训练爬虫就没有 AI 流量了」——搜索型抓取、用户触发的实时抓取是另一回事。把「所有带 AI 字样的 UA」混在一起拦,往往连带损失掉本来想要的流量。

七、最小可执行清单

  1. 拉一次线上 robots.txt,逐条列出「谁被给了什么权限」;
  2. 跑一遍日志,看实际到访的 UA 和你以为的是否一致;
  3. 定拓扑:默认放行 + 点名拦,还是默认拒绝 + 点名放(后者会误伤监控和预览,慎用);
  4. 网关加阈值,先用观察模式跑一周;
  5. 每月复盘一次日志——UA 名单会变,策略也得跟着变;
  6. 内容分级优先于任何 header 和任何规则文件。

把顺序理清楚就不会拧巴:robots.txt 负责表达意愿,日志负责提供证据,网关负责执行,内容策略负责根本的暴露面。四件事各管一段,谁也替代不了谁。


如果你想把「哪些 AI 爬虫在抓、抓了什么、要不要放行」变成一张能看懂的清单,可以从 AumCreate 的免费插件列表 里挑合适的那个开始。