短答案
robots.txt 能表达的只有一件事:「这些路径,请你不要抓。」
它是一个公示,不是一道门。管得住的是「愿意遵守的爬虫的抓取范围」,管不住的是「不遵守的爬虫、伪造的 UA、已经流出的内容、抓取频率与成本,以及内容被拿走之后怎么用」。
先快速看一眼你现在给了谁什么权限:
curl -s https://example.com/robots.txt | grep -iE 'user-agent|allow|disallow|sitemap'
一、它能管住什么
- 路径级授权。 目录、具体文件、后缀,配合
*通配和$结尾锚,粒度能做到单个 URL。 - 按爬虫分群。 同一个站可以对不同 UA 给不同答案,这是它最有用的能力。
- 声明 sitemap 位置。 这属于辅助发现,不是限制。
- 对公开承诺遵守的爬虫有实际约束力。 注意这句话的重心在「承诺遵守」——全部效力都建立在这里。协议本身没有技术执行手段,也没有惩罚机制。
二、它管不住什么
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/ 之类的路径,等于给所有人一份目录提示。不要用它来隐藏任何东西。
六、三个常见误区
- 「写了
Disallow: /内容就不会被用」——只对愿意遵守的爬虫成立,而且已经抓走的收不回来。 - 「
robots.txt能防采集」——它没有执行能力。防采集要靠限速、鉴权和内容分级。 - 「拦了训练爬虫就没有 AI 流量了」——搜索型抓取、用户触发的实时抓取是另一回事。把「所有带 AI 字样的 UA」混在一起拦,往往连带损失掉本来想要的流量。
七、最小可执行清单
- 拉一次线上
robots.txt,逐条列出「谁被给了什么权限」; - 跑一遍日志,看实际到访的 UA 和你以为的是否一致;
- 定拓扑:默认放行 + 点名拦,还是默认拒绝 + 点名放(后者会误伤监控和预览,慎用);
- 网关加阈值,先用观察模式跑一周;
- 每月复盘一次日志——UA 名单会变,策略也得跟着变;
- 内容分级优先于任何 header 和任何规则文件。
把顺序理清楚就不会拧巴:robots.txt 负责表达意愿,日志负责提供证据,网关负责执行,内容策略负责根本的暴露面。四件事各管一段,谁也替代不了谁。
如果你想把「哪些 AI 爬虫在抓、抓了什么、要不要放行」变成一张能看懂的清单,可以从 AumCreate 的免费插件列表 里挑合适的那个开始。