越来越多站长发现访问日志里冒出了 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 三层兜住,才是一套能长期维护的做法。