robots.txt 写了没人看,条款写了没人管,但真出纠纷时这两份文本决定你占不占理。本文用 10 个问答讲清反爬声明 怎么写、robots 怎么配、拦截页与投诉入口怎么设。
Q:对外写一份反爬声明,到底有什么用?
- 先说清楚:它拦不住任何恶意爬虫。指望一份文本挡住采集脚本,方向就错了。
- 它有三个真实作用:意思表示(明确”未经许可不得抓取”,是后续主张权利的前置条件)、合规路径(给搜索引擎和合作方一个”怎么抓才被允许”的说明)、内部口径(客服、法务、技术对同一件事说法一致)。
- 所以定位是:声明管善意,技术手段管恶意。只写不拦是纸老虎,只拦不写是没依据。
Q:robots.txt 怎么写才对?给一份能直接用的模板
- 语法只有几个要点,但每一条都常被写错:
- User-agent 分组:一组规则只对列出的 UA 生效,
User-agent: *是兜底组。 - Disallow 是前缀匹配:写
/admin会连/administrator一起禁掉,想精确到目录记得带结尾斜杠。 - Allow 优先于 Disallow:同长度时 Allow 胜出;不同长度时更长的规则优先。这是放行子目录的唯一正确姿势。
- 支持 * 和 $:
*匹配任意字符,$表示结尾,用来精确匹配带参数的 URL。 - Crawl-delay 基本没人支持:Google 明确忽略,写了也白写。限速要靠服务端。
User-agent: *
# 禁止抓取后台与功能性路径
Disallow: /admin/
Disallow: /wp-admin/
Disallow: /cart/
Disallow: /checkout/
Disallow: /search?
Disallow: /*?s=
Disallow: /*&preview=
# 静态资源必须放行,否则影响渲染与收录
Allow: /wp-admin/admin-ajax.php
Allow: /static/
Allow: /assets/
Sitemap: https://www.example.com/sitemap.xml
# AI 训练类爬虫单独声明
User-agent: GPTBot
Disallow: /
User-agent: CCBot
Disallow: /
Q:为什么说千万不要在 robots 里屏蔽 CSS 和 JS?
- 搜索引擎渲染页面要靠 CSS 和 JS。把它们挡掉,页面在引擎眼里就是一堆没有样式的裸文本,移动端适配、首屏内容、懒加载图片全部判断错误。
- 典型症状:收录正常但排名掉、快照显示排版错乱、移动端友好性检测不通过。很多人以为是”被降权”,其实是自己把资源挡了。
- 正确做法:只挡后台、搜索参数页、购物车、结算这类功能性路径,
/static/、/assets/、*.css、*.js一律放行。
Q:既然 robots 拦不住恶意爬虫,还有必要写吗?
- 有必要,但要摆正预期:它管的是善意爬虫和事后定性。
- 搜索引擎、正规数据服务商、部分 AI 训练爬虫会遵守 robots;恶意采集器不会看,但它看了不遵守这件事本身,就是”明知故犯”的证据。
- 实务上,一份明确的 robots 加上服务条款,能让你在沟通、投诉、甚至法律程序里从”你没说不能抓”变成”我说了不能抓,它违反了”。这个差别很关键。
- 反过来,如果 robots 里什么都没写,或者是默认的空文件,对方一句”未声明禁止”就能把责任推回来。
Q:服务条款里的反爬条款,必须写哪几条?
- 五条必备,少一条就有缺口:
- 禁止行为:明确列出未经书面许可不得批量抓取、镜像、转载、二次分发,并说明”批量”的判断口径(如单位时间请求数、页面覆盖率)。
- 数据权属:站内文字、图片、结构化数据的权利归属,以及数据库整体享有的权利。
- 处置权利:写明”有权对异常访问采取限速、验证、封禁等措施,且无需事先通知”。没有这句,误封就变成你的过错。
- 违约责任:约定赔偿计算方式(如按许可费倍数或单页定价),没有计算口径的条款基本无法执行。
- 变更与通知:条款怎么更新、生效日期、历史版本在哪查。
- 放置位置:页脚可点的《用户协议》《使用条款》各写一份,带版本号与生效日期。别写”禁止一切爬虫”,那会连搜索引擎一起禁掉,还和自家 sitemap 自相矛盾。
Q:拦截页(403 / 429)应该怎么写?
- 三个要素缺一不可:说明发生了什么(触发了访问频率限制或风控规则)、给出申诉或合作通道(邮箱或表单地址)、说明多久自动解除。
- 429 要带
Retry-After头,规范的爬虫会据此退避;不给这个头,对方只会不断重试,把压力放大。 - 403 页不要只返回一个空白页或默认错误页,那既没有信息量,也失去了引导正常用户申诉的机会。
# 限流命中返回 429 并告知退避时间
limit_req_zone $binary_remote_addr zone=api:10m rate=20r/s;
server {
error_page 429 /429.html;
location = /429.html {
internal;
add_header Retry-After 60 always;
add_header Content-Type "text/html; charset=utf-8" always;
}
location /api/ {
limit_req zone=api burst=40 nodelay;
limit_req_status 429;
}
}
Q:投诉 / 申诉入口怎么做才真的有用?
- 先想清楚要收什么:对方域名、抓取 IP、时间范围、User-Agent、抓取用途、联系方式。六个字段缺一个,你就得来回追问三轮。
- 入口要防滥用:加验证码、按 IP 限频、邮箱需验证。否则这个表单本身会成为新的攻击面,被人拿来刷。
- 页面写清响应时效(如 3 个工作日)和不受理情形(明显商业采集),减少无效沟通。
- 数据合作要走单独的申请通道,不要和申诉混在一个表单里。混在一起的结果是真正的误封用户排在商务合作后面等一周。
Q:给爬虫运营方发正式通知,该怎么写?
- 要素五个:身份与站点、抓取证据(IP、时间段、UA、请求量)、具体要求(停止 / 限速到多少 / 申请授权)、期限、逾期后果。
- 证据要能对上日志,别只写”你们在爬我们”。给出具体 IP 和时间点,对方才无法否认。
- 渠道走三路:abuse 邮箱 + 工单 + 站长联系邮箱,保留回执。只发一封邮件等回复,通常没下文。
主题:关于 xxx.com 未经授权抓取的告知函(附访问记录)
您好,
我方为 www.example.com 的运营方。经日志核查,贵方 IP 段
203.0.113.0/24 于 2026-10-20 至 2026-10-26 期间,以 UA
"xxx-spider/2.1" 对我站发起共计 1,284,000 次请求,
其中 92% 集中于列表页与详情页,未请求任何静态资源,
已对我站带宽与源站造成实质压力。
我站 robots.txt 与服务条款均明确禁止未经许可的批量抓取。
请于收到本函后 5 个工作日内:
1) 停止抓取,或
2) 将频率降至 1 次/秒以下并声明用途,申请书面授权。
逾期我方将采取 IP 段封禁、向贵方上游服务商投诉等措施,
并保留追究相应责任的权利。
附件:访问日志摘录(IP / 时间 / 路径 / UA)
联系邮箱:abuse@example.com
Q:想放行正当爬虫,声明怎么做分级?
- 三级分层,别一刀切:
- 完全放行:搜索引擎蜘蛛。按 IP 段 + PTR 反查双重验证后进白名单,不参与频率限制。
- 限量放行:合作方与订阅用户。走 API + 密钥,给明确配额(如 1000 次/小时),超额返回 429 并给退避时间。
- 一律拒绝:其余未声明的批量抓取。
- 关键是给正当需求一个出口:提供 sitemap、RSS、开放 API。没有出口时,本来只想拿一点数据的开发者也只好写爬虫,你等于在批量制造对手。
- AI 训练爬虫单独声明:robots 里按 UA 分组写(GPTBot、CCBot 等),条款里同步写明”站内内容不授权用于模型训练”。
Q:还有什么补充建议?
- 声明要和实际行为一致。页脚写着”禁止抓取”,接口却没有任何鉴权,真出事时站不住脚。文本是门牌,技术是门锁,只挂牌不装锁等于没锁。
- robots 里不要写内部路径。有人把
/internal-tools/、/backup/写进 Disallow,等于公开告诉所有人这里有什么。 - 每年复核一次。站点改版、目录调整后 robots 往往就过期了,旧路径还在禁,新路径没加。
- 最后一条:声明写完之后,用真实爬虫和真实浏览器各测一遍,确认该拦的拦了、该放的放了,别只写在文档里就当完成。