AI训练爬虫该不该拦?GPTBot拦截配置实战

越来越多站长发现访问日志里冒出了 GPTBot、Bytespider、CCBot 这些名字:内容被抓走训练大模型,却一分流量都不带回。本文用 9 个问答讲清 AI训练爬虫 怎么识别、robots.txt 为什么不够用、Nginx 里怎么按 UA 与 IP 段拦截、拦了会不会掉搜索排名,以及怎么做到「拦训练、放引用」。

Q:AI训练爬虫和搜索引擎爬虫有什么本质区别?

区别不在「是不是机器人」,而在抓完之后你能不能拿到回报:

  • 搜索引擎爬虫:抓取是为了建索引,索引结果会带来自然流量,抓取和你的利益方向一致。
  • AI训练爬虫:抓取是为了变成模型参数,多数情况下不给回链、不带流量,抓完就与你的站点无关。
  • 按用途分三类:训练类(GPTBot、CCBot、Bytespider)、引用类(ChatGPT-User、OAI-SearchBot、PerplexityBot)、混合类(ClaudeBot 等既参与训练也参与回答)。

所以第一个结论是:不是所有 AI 爬虫都该拦,训练类和引用类必须分开处理。

Q:常见的 AI 爬虫有哪些,怎么从 UA 识别?

  • GPTBot:OpenAI 训练用途,UA 里含 GPTBot/1.x,官方明确说明可以阻止。
  • OAI-SearchBot:为搜索与回答建立索引,UA 含 OAI-SearchBot。
  • ChatGPT-User:用户在对话里点开你链接时的即时抓取,UA 含 ChatGPT-User,这类更接近真实用户,拦了会直接影响被引用。
  • ClaudeBot:Anthropic 的爬虫,UA 含 ClaudeBot。
  • PerplexityBot:UA 含 PerplexityBot。
  • Bytespider:字节跳动系,UA 含 Bytespider,对 robots.txt 的遵守度历来较差。
  • CCBot:Common Crawl,UA 含 CCBot,它的公开语料被大量开源模型间接使用。
  • Google-Extended:注意,它不是 UA,而是 robots.txt 的专用标记,控制的是 Gemini 训练,和搜索排名无关。
  • meta-externalagent、Amazonbot、ImagesiftBot:同为训练类,一并纳入观察名单。

动手之前先用自己的日志跑出「真实到访名单」,不要照抄网上的清单——每个站点的实际访客结构差别很大。

Q:robots.txt 能不能拦住 AI 爬虫?

分两层看:对遵守规则的爬虫有效,对不守规则的完全无效。robots.txt 是君子协定,没有任何强制力。

# robots.txt:拒绝训练类
User-agent: GPTBot
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: Bytespider
Disallow: /

User-agent: Google-Extended
Disallow: /

# 放行引用类,保住被 AI 回答引用的机会
User-agent: ChatGPT-User
Allow: /

User-agent: OAI-SearchBot
Allow: /

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

关键提醒:Google-Extended 只影响 Gemini 训练,不影响 Google 搜索收录;要动 Google 搜索那是拦 Googlebot,属于另一件事,别混为一谈。结论是:robots.txt 管守规矩的,UA 与 IP 层管不守规矩的,两套都要有。

Q:动手拦截之前,怎么先「只记录不拦截」?

最稳的做法是先用 map 识别、用条件日志单独落盘,观察一到两周再决定:

# http 块:把 AI 爬虫 UA 归一化成变量
map $http_user_agent $ai_bot {
    default                0;
    "~*GPTBot"             1;
    "~*OAI-SearchBot"      1;
    "~*ChatGPT-User"       1;
    "~*ClaudeBot"          1;
    "~*PerplexityBot"      1;
    "~*Bytespider"         1;
    "~*CCBot"              1;
    "~*meta-externalagent" 1;
    "~*Amazonbot"          1;
    "~*ImagesiftBot"       1;
}

# server 块:不拦截,只把命中的请求额外记一份
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/ai-bot.log main if=$ai_bot;

为什么必须先生察:很多站点以为是 AI 爬虫在刷,实际是自己的监控探针、合作方接口或 CDN 回源在跑。看名单的命令:

# 统计来源 UA 分布(combined 格式下 UA 是第 6 个引号字段)
awk -F'"' '{print $6}' /var/log/nginx/ai-bot.log | sort | uniq -c | sort -rn | head

Q:决定拦截后,Nginx 里具体怎么配?

# http 块:在识别变量基础上增加动作变量
map $ai_bot $ai_action {
    1  403;
    0  0;
}

# server 或 location 块:单条件 return,不要把复杂逻辑写进 if
if ($ai_action = 403) {
    return 403;
}
  • 单条件 return 是 if 的合法用法,但 nginx 的 if 不是通用流程控制,不要在里面塞多条指令。
  • 只拦训练类、保留引用类时,把 map 拆成 $ai_train 与 $ai_cite 两个变量,只对训练类返回 403,引用类照常放行。
  • 先挑低风险位置拦:图片、附件、下载接口这类「抓走就彻底没了」的资源优先处理,HTML 页面可以再观察一段时间。
  • 返回码建议用 403;如果只是想降速而不是拒绝,用 429 更合适,也方便和真实故障区分。

Q:UA 可以伪造,只靠 UA 够不够?

不够。需要三道补充校验:

# 反向 DNS:正规爬虫的 PTR 记录应落在服务商自有域名下
dig +short -x 203.0.113.7
# 再用得到的域名做正向解析,必须指回同一批 IP
dig +short 上一步返回的域名
# 官方 IP 段同步:拉取公开前缀清单生成 ipset
curl -s https://openai.com/gptbot.json | jq -r '.prefixes[] | .ipv4Prefix // empty' > /tmp/gptbot.txt
wc -l /tmp/gptbot.txt

ipset create gptbot hash:net timeout 0
while read net; do ipset add gptbot "$net"; done < /tmp/gptbot.txt
# 按需下发:iptables -I INPUT -m set --match-set gptbot src -j DROP
  • 行为特征:训练类爬虫通常只拉 HTML 正文,不解析 CSS、JS 和图片;单 IP 请求节奏均匀、路径发散但深度浅。
  • IP 段会变,不能只靠 IP 拦,UA、反向 DNS、行为三者交叉判断才可靠。
  • 自建反向校验一定要加缓存,否则每个请求都做一次 DNS 查询,等于给对方免费提供一次 DNS 放大。

Q:拦了 AI 爬虫,会不会影响搜索排名?

  • 不会,前提是没有拦到搜索引擎:Googlebot、Bingbot、Baiduspider 与训练爬虫是两套独立身份,拦 GPTBot 不影响搜索结果收录。
  • Google-Extended 是 robots.txt 标记,只影响 Gemini 训练,与搜索排名无关,这一点经常被误读。
  • 但有一个真实代价:拦掉引用类会减少被 AI 回答引用的机会,而 AI 回答的引用链接正在成为一条新的流量入口。
  • 建议做法:训练类拦、引用类放,并在拦截前后对比搜索引擎抓取量,确认没有异常波动。

Q:「拦训练、放引用」的分层策略怎么落地?

map $http_user_agent $ai_class {
    default                "unknown";
    "~*GPTBot"             "train";
    "~*CCBot"              "train";
    "~*Bytespider"         "train";
    "~*meta-externalagent" "train";
    "~*ChatGPT-User"       "cite";
    "~*OAI-SearchBot"      "cite";
    "~*PerplexityBot"      "cite";
}
  • 训练类 → 403,直接拒绝。
  • 引用类 → 放行,甚至可以主动优化结构化数据,提高被引用的概率。
  • 未知档 → 降速 429 加记录,不要直接封,给新出现的正规爬虫留观察期。
  • 内容层再补三道兜底:未登录只给正文摘要、图片加时间戳水印、关键数据走接口鉴权。
  • 要清醒认识到:能拦的是抓取行为,拦不住的是「抓走之后的用途」;内容价值高的站点还应做「内容指纹 + 定期检索」的抽查,发现侵权再走投诉与法律路径。

Q:还有什么补充建议?

  • 先观察再拦,别照抄黑名单:先跑两周日志,看自己站的真实到访名单。
  • robots.txt 与 UA 拦截同时上:一个管守规矩的爬虫,一个管执行。
  • 不要把 403 当默认答案:身份不明的一律先降速记录,避免误伤。
  • 白名单要维护:自家监控、CDN 回源、合作方接口,别被新规则一起封掉。
  • 定期复核:AI 爬虫名单变化极快,建议每季度重新跑一次日志核对。

一句话总结:拦不拦取决于「抓完之后你能不能拿到回报」;训练类拦、引用类放、未知的先降速观察,再用 robots.txt 加 UA 加反向 DNS 三层兜住,才是一套能长期维护的做法。