/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
昨天凌晨我照例打开服务器Nginx日志,本来只是想看一眼有没有异常报错,结果翻到一条访问记录:24小时内,同一个UA标识的爬虫,陆陆续续访问了36次。如果是个普通网友,这个频率再正常不过,但真切到访问路径和时间规律,我一眼就认出来——这是AI训练爬虫,而且是那种最“教科书级”的数据采集行为。没隔两天,我又看到某社交平台创始人在公开场合抱怨“高质量文本数据不够用了”,那一刻我突然意识到,我服务器日志里那36次记录,根本不是孤立事件,而是整个行业“数据荒”的一个缩影。
这些AI爬虫不像传统搜索引擎那样“扫一眼就走”,它们是在把整站内容当成训练语料“打包搬走”。作为站长,你可能每天都在被AI爬,只是没细看日志。这篇文章我想用一次真实的日志分析经历,把AI爬虫的动机、识别方法、拦截方案,以及“要不要拦”这门生意经讲透。不管你是独立博客主、内容平台运维,还是只是好奇AI公司怎么搞数据,看完就能自己动手排查一遍。
1. 一分钟找到入侵者:服务器日志里的AI爬虫痕迹
1.1 先看懂一条请求日志
很多人一听“爬虫识别”就觉得要上机器学习,其实不用。第一步永远是看自家服务器日志。Nginx默认的combined格式大概是这样的:
192.168.1.10 – – [17/Oct/2025:23:51:23 +0800] "GET /column/ai-training/ HTTP/2.0" 200 3821 "https://www.example.com/" "Mozilla/5.0 (compatible; GPTBot/1.0; +https://openai.com/gptbot)"
这里面最关键的不只是IP,而是最后一串User-Agent(UA)。UA是爬虫的“身份证”,绝大多数AI公司的爬虫都会用固定格式的UA标明身份,比如GPTBot、ClaudeBot、PerplexityBot、CCBot这类。如果一个IP在短时间内反复访问你的正文页、专题页,而且UA又对得上这些标识,那基本可以断定它是在为模型训练抓语料了。
有人会问:36次算多吗?搜索引擎爬虫一天可能抓几百上千次,36次似乎不痛不痒。但你要看它抓的是什么页面。我那次日志里的36次,全部集中在长文正文和目录页,没有任何图片、CSS、JS请求,也没有登录和评论动作。这说明它不是来“逛网站”的,而是精准地挑文本密度最高的页面下口。这种“克制”反而更危险,因为它说明采集方对你的站点结构做过分析,是在按计划抽数据。
1.2 三条命令把爬虫从几百条日志里揪出来
查AI爬虫不需要商业监控工具,Linux命令行就够用。前提是你得开启访问日志。我一般先用按UA统计的方式,把“来客名单”拉出来:
grep -iE "GPTBot|ClaudeBot|CCBot|PerplexityBot|Bytespider|Amazonbot|Google-Extended" /var/log/nginx/access.log | awk '{print $12}' | sort | uniq -c | sort -nr | head -30
这条命令会把包含AI爬虫UA的请求行按UA种类聚合,并统计数量。如果你用的是Apache,日志路径换成
/var/log/apache2/access.log
即可,命令逻辑不变。
更通用一点,先按IP聚合看谁最活跃:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
拿到IP之后再用
whois
或者在线IP库查归属,大概率会命中云服务商。AI公司很少用自家机房跑爬虫,更多是租用公有云的大段IP,所以IP归属那一栏写的是某某云平台,而不是某个AI公司。
我个人的习惯是每周跑一次“UA画像”,把新出现的陌生UA单独截出来看看。很多AI爬虫的名字并不在“知名榜单”里,得靠这种笨办法才能在早期发现。等到你的日志里每天稳定出现几十条陌生UA,再想去拦截就已经慢半拍了。
2. 为什么你的网站被AI盯上:训练数据荒的内幕
2.1 “万亿token”到底有多缺
你可能看过一个说法:AI公司训练一次大模型要用几万亿个token。token可以粗略理解成词元,一个中文词大概对应一到两个token。几万亿个token是什么概念?如果把中文互联网所有公开的长文都算上,可能也就刚好喂饱一两次训练。更麻烦的是,AI要学的不是零散碎片,而是“有上下文、有逻辑结构、干净”的整篇文档。
这就有意思了。普通网页看起来遍地都是内容,但真正能进训练集的没多少。社交平台上的短消息缺乏上下文,图片里的文字没法直接读,论坛中的对话夹杂大量噪声。真正高质量的长文、教程、研究笔记、产品文档,恰恰集中在个人博客、垂直社区和公司知识库里。这些内容规模不大,却被爬虫视为“富矿”。所以那些日均IP只有几千的小站,反而更容易被AI爬虫按需精准扫荡。
那位社交平台创始人的抱怨,本质不是“互联网没数据了”,而是“能合法拿到的、干净的高质量文本不够了”。大厂自己手里有海量UGC,但拿来训练模型有隐私和法律风险,不能全用。于是大家都把目光投向公开互联网——这就有了你服务器日志里那些不请自来的AI爬虫。
2.2 别把锅都甩给搜索引擎
很多站长习惯把“所有爬虫”都当成SEO标配,分不清搜索爬虫和AI爬虫的区别。传统搜索爬虫的逻辑是“发现、抓取、建索引”,它抓完页面会存快照,但本质上是在为检索服务,用户点进来还能给你的网站带流量。AI爬虫的逻辑完全不同,它抓完内容是为了“消化理解”,最后生成一个答案直接展示给用户,用户不会再点进你的网站。
这两种爬虫从请求行为上也能区分。搜索引擎爬虫一般会遵守robots协议,抓取频率相对稳定,而且会主动识别结构化数据。AI爬虫虽然名义上也说“遵守robots”,但有些实现早就把robots当空气了。它们更倾向于绕过登录、尝试抓取分页参数,甚至会用无头浏览器伪装成普通用户。用搜索引擎的思路去防AI爬虫,方向就错了。
还有一点容易被忽略:部分AI搜索产品会伪装成普通搜索引擎UA。最典型的是名字里带“Google-Extended”的那类标识,它不是谷歌搜索主爬虫,而是谷歌用来训练AI模型的独立爬虫。配置robots的时候如果不区分清楚,很容易把真正的搜索引擎流量误伤,却把AI爬虫放得干干净净。这件事我们后面详细说。
3. 三个动作搞定AI爬虫管控
3.1 robots.txt写对一半的常见错误
最基础的管控手段是robots.txt,但绝大多数站长都只写了个寂寞。很多人以为放上
Disallow: /
就能挡住AI爬虫,实际上这个文件只对“愿意遵守”的爬虫有效,而且你得把UA名写准。我见过太多把
GPTBot
拼成
GPTbot
,或者把
ClaudeBot
漏掉的配置,等于白写。
这里给一份可以直接抄的模板:
User-agent: GPTBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: PerplexityBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: Bytespider
Disallow: /
User-agent: Amazonbot
Disallow: /
User-agent: *
Disallow: /private/
Allow: /
注意最后两行:对“其他所有爬虫”我只是禁止
/private/
目录,而不是全站封禁。原因很简单,你不能把所有搜索引擎都挡在门外,否则收录量和自然流量都会崩。正确的姿势是“精准打击AI训练类爬虫,放过搜索类爬虫”,而不是一刀切。
但这里有个残酷的现实:robots.txt没有强制执行力。合规做法的AI公司会遵守,但总有人无视。所以robots.txt更像是一道“法律声明的门槛”,真正的技术防线还得靠服务器层面的拦截。
3.2 Nginx和Apache封UA的实操配置
在Nginx里封UA算是最快的止血方案。在
server
块里加一段判断,命中就返回444,444是Nginx特有的语义,代表“直接断开连接且不返回任何内容”。对爬虫来说,这种“沉默”比403更有威慑力,因为它连“为什么不行”都拿不到。
if ($http_user_agent ~* "(GPTBot|ClaudeBot|CCBot|PerplexityBot|Bytespider|Amazonbot|Google-Extended)") {
return 444;
}
配置完记得
nginx -t
检查语法,然后
nginx -s reload
重载。Apache用户则可以用
.htaccess
:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} .*(GPTBot|ClaudeBot|CCBot).* [NC]
RewriteRule ^(.*)$ – [F,L]
这样会返回403状态码。实测下来对比很明显:Nginx的444会让部分不严谨的爬虫以为服务器崩了,直接放弃抓取;而403依然会告诉对方“这里有人”,碰上暴力型爬虫反而会刺激它换UA再来。
不过单纯封UA有一个致命问题:AI爬虫的UA列表更新太快,你上周封完这周人家就换了个新马甲。所以我更推荐把UA封禁当成“基线策略”,在它上面再叠加一层更聪明的防抓取逻辑。
3.3 动态挑战与分布式爬虫的对抗
当我发现单一UA封禁挡不住那些“隐身模式”的爬虫后,我开始引入更主动的防护:频率限制和动态挑战。思路很简单:正常人不会在1分钟内连续访问20个完全不同的正文页,但爬虫会,因为它没有阅读成本。
在Nginx层面可以用
limit_req
限制单IP的请求速率:
limit_req_zone $binary_remote_addr zone=ai_limit:10m rate=5r/s;
location / {
limit_req zone=ai_limit burst=10 nodelay;
}
这个配置的意思是每IP每秒最多处理5个请求,突发可以放行10个。对真实读者来说完全够用,但爬虫一旦发起高并发抓取,就会立刻被限流。需要注意,这只能治标。AI公司的爬虫IP池通常遍布好几个公有云机房,换个IP就能绕过去,所以更靠谱的做法是配合CDN层的“托管挑战”机制。
所谓托管挑战,就是让访问者先通过一次JavaScript计算或浏览器环境检测,通过后才放行。真实浏览器几秒钟就能过,无头爬虫往往直接卡在挑战页。但这里有个度的问题:挑战会消耗访客耐心,设置得太激进会误伤正常用户。我的经验是只对怀疑对象启用挑战,而不是全站强制。识别的依据包括“无cookie、无JS执行痕迹、请求路径过于规整”这几个特征,这些在日志和CDN里都能看到。
4. 封禁之外的流量生意:数据授权与开放策略
4.1 允许AI爬虫的收益与风险
聊完拦截,再聊一个反直觉的问题:对AI爬虫,你有必要全部封死吗?我的答案是“不一定”。封禁的代价是未来AI搜索产品如果成为主流,你的内容会从它们的答案里直接消失。允许的代价则是模型可能“记住”你的内容,用户以后不再点你的链接,流量归零。这是个两难题。
我见过两类站长:一类是断然拒绝型,觉得内容就是身家性命,AI凭什么白拿走;另一类是开放派,他们认为未来AI搜索会保留参考链接,能被AI引用反而是新流量入口。这两种选择都有道理,但都忽略了最核心的一点——你得先“分清楚来的到底是哪只爬虫”。
比如有些AI搜索爬虫抓你的页面是为了在答案里附上来源链接,这和训练爬虫完全不同。训练爬虫抓完就进模型参数,搜索爬虫抓完还会把流量导给你。所以不要把“AI爬虫”当成一个整体来处理,而是要区分用途。我现在的策略是:训练类爬虫一律Disallow,搜索类AI爬虫按白名单放行。具体操作就是上面那份robots模板再加一行Allow。
4.2 如何设计自己的数据开放协议
如果你决定“可以爬,但要有条件”,光靠robots.txt是不够的,因为它只声明“能不能抓”,说不清楚“抓了能不能用”。比较务实的做法是在网站的页面底部加一段版权声明,明确“本网站内容可用于非商业性AI训练,商业用途需另行授权”。虽然这类声明不可能挡得住所有爬虫,但在后续法律纠纷里,它是你主张权利的重要证据。
有条件的站长还可以把自己的内容打包成数据许可协议,挂到对外合作的入口。国内很多内容方已经开始做这件事——与其被动挨爬,不如主动把语料授权变成收入。技术实现不复杂:建一个
/data-license/
页面,说明可授权的数据范围、格式、计价方式和联系方式,然后在robots.txt里把训练类爬虫的路径指向这个页面。
这里要提醒一句:授权数据的格式最好选JSON或Markdown明文,不要给PDF和HTML。一方面方便对方解析,另一方面也能在授权协议里写清楚“仅限指定用途”。勒索式授权没有意义,AI公司买不买单取决于你的内容是否足够稀缺。如果你写的是行业内独一份的实测数据、案例复盘或专业指南,那谈判空间大得多。
5. AI爬虫防护踩坑速查表
5.1 误伤、失效、隐身,六个常见坑
我在处理自家站点和帮朋友排查的过程中,踩过不少坑,挑六个最典型的说。
第一个坑是封UA误伤真实用户。现在很多AI爬虫喜欢把UA伪装成Chrome,如果你看到日志里有个Chrome UA在疯狂抓取,直接按UA封禁,就会把真正用Chrome的访客也封掉。我的做法是不要单独用UA做封禁依据,至少要结合“无cookie、无JS执行、请求频率”这三个维度综合判分。
第二个坑是只封IP不封UA。对方IP池巨大,今天封一个明天换个地段继续来。正确做法是“UA封禁+ASN段封禁+频率限制”三件套,让对手每换一次IP都要付出更高成本。第三个坑是CDN缓存模式下日志看不到爬虫。如果你开了CDN,很多爬虫请求在边缘节点就返回了,源站日志根本见不到。要查真实情况,得去看CDN提供的访问日志,而不是Nginx的。
第四个坑是把Google-Extended当成Googlebot放行。Google-Extended是训练模型专用爬虫,不是搜索收录爬虫,两者会在robots里分别声明。想继续吃谷歌自然搜索流量,就要把Googlebot放进白名单,把Google-Extended拉进黑名单,很多人恰恰搞反了。第五个坑是蜜罐目录误伤。有些教程教你放一个“肉眼看不见但robots禁止”的链接,谁访问谁就是爬虫。理论上很聪明,实际做起来很容易把一些安全扫描器、预览工具也骗进来,误杀率极高。我建议谨慎使用,至少要等人被拦截后再做人工确认。
第六个坑最隐蔽:有些AI爬虫会挑“零点”时段低峰抓取,而且频率压得很低,你在白天看日志根本发现不了。这种爬虫单看每个IP都不像异常,但把所有UA相同、时间段集中的请求汇总起来看,狐狸尾巴就露出来了。所以监控AI爬虫不能只看“最近一小时”,要看“24小时UA聚合趋势”。
5.2 一套可持续运行的监控体系
既然AI爬虫的UA名单经常变,那我建议建一个简单的监控脚本,每周自动跑一次。逻辑很简单:从日志里提取陌生UA,跑一个定时任务,在
/usr/local/bin/check_ai_bots.sh
里写几行脚本,统计UA出现次数和IP数,然后通过Webhook推到你的企业微信、钉钉或者邮箱。
#!/bin/bash
LOG="/var/log/nginx/access.log"
YESTERDAY=$(date -d "yesterday" +%d/%b/%Y)
grep "$YESTERDAY" $LOG | \\
awk -F'"' '{print $6}' | \\
sort | uniq -c | sort -nr | \\
head -20
这个脚本输出的就是昨天访问量最高的UA排行,每周发一次,用不了两分钟就能扫完一遍。排在自己网站前面的如果出现了不认识的UA,再回头去robots和搜索引擎查一下,新人“报到”一般都能在这个时间窗口内发现。比起买商业防护墙,这套笨办法成本极低,但对中小站长来说足够用了。
我个人现在的底线策略是:robots.txt管“君子”,Nginx封禁管“无赖”,CDN挑战管“技术流”,每周日志巡检管“漏网之鱼”。至于那些完全不理会任何协议、疯狂抓取的爬虫,保留日志证据是王道,别在服务器上跟它硬耗性能。最后再补一句,互联网内容开放与版权保护还会持续拉扯,现在封得痛快不等于永远正确,每半年重新审视一次自己的策略,可能比你想象的更重要。
网硕互联帮助中心


评论前必须登录!
注册