如何防止恶意爬虫批量抓取网站数据?
爬虫不是一个问题——搜索爬虫、竞品比价、批量数据提取需要完全相反的处置方式。如何区分它们,以及 Cloudflare 每道控制背后真实的套餐门槛。
直接回答: 爬虫不是一个问题:搜索爬虫是你想要的、竞品比价是你可能容忍的、批量数据提取是必须拦的,三者需要完全相反的处置方式,所以先分类再处置。Cloudflare 这边,Bot Fight Mode 免费,只处置已知恶意客户端;Super Bot Fight Mode(Pro)增加基于 bot score 的自动化判定;能让你把 bot score 与 JA3/JA4 指纹写进自定义规则的是 Enterprise 的 Bot Management。另外要清楚:robots.txt 只声明意图,不提供任何强制力。
三种爬虫,需要相反的处置
把所有自动化流量都当敌人,是损害自身分发最快的方式。先分类:
| 类型 | 是谁 | 你想要的处置 |
|---|---|---|
| 搜索与 AI 爬虫 | Googlebot、Bingbot,以及给问答引擎供稿的 AI 爬虫 | 放行——它们是获客渠道,对 AI 搜索可见性尤其重要 |
| 合法聚合 | 比价、合作方集成、监控 | 允许,但限速并观察 |
| 批量提取 | 竞品、数据转售商、模型训练方 | 阻断,或让它变得不划算 |
第三类才是真正要处理的对象;而代价最高的错误,是把第三类的控制用到第一类流量上。给已验证爬虫限速,是一次自伤式的 SEO 事故。
区分批量提取与真实流量的信号
- 不请求资源文件。抓取程序只取 HTML,跳过 CSS、JS、图片。真实浏览器不会这样。
- 有深度但没有行为递进。成千上万个详情页,没有搜索、没有加购、没有会话连续性。
- 机器式规律节奏。固定间隔或完美并行的 worker;人类是不规律的。
- 标识集中。同一个 ASN、同一个 UA、同一族指纹。
- 参数遍历。顺序 ID、游标枚举,或系统性地组合筛选条件。
前两项只要有边缘日志就能看到;后两项通常需要 bot 信号,而不是你自己的分析系统。
控制措施的正确施加顺序
1. 用 robots.txt 声明立场,同时清楚它做不到什么。 Cloudflare 自己的文档写得很直白:robots.txt 的合规是自愿的,它在技术层面并不能阻止爬虫。要真正拦住,必须靠控制措施。托管 robots.txt 全套餐可用,但只有当你开启 Bot Preference Sync、且至少有一项策略不是 Allow 时,Cloudflare 才会注入它管理的版本。
2. 明确制定 AI 爬虫策略。 AI 爬虫控制让你可以按用途分别设定立场——Search、Agent、Training——每项三种选择:全站阻断、仅在含广告页面阻断、允许;这些在所有套餐都可用,包括 Free。它的意义是战略性的而非技术性的:允许 Search 而阻断 Training,可以让你在 AI 答案里保持可见,同时不把内容无偿交给训练集。文档说明,新接入域名的默认值是在含广告页面阻断 Training 与 Agent,而允许 Search。
3. 用好你套餐里的 bot 能力。 套餐差异主要就在这里:
| 档位 | 检测范围 | 你能拿到的控制 | 分析能力 |
|---|---|---|---|
| Bot Fight Mode(Free) | 云主机来源的简单 bot 与无头浏览器 | 一种计算成本高的挑战,作用于整个域名 | 基础 |
| Super Bot Fight Mode(Pro) | 简单 bot 与无头浏览器 | 允许/阻断/挑战、静态资源保护、JS 检测。「Likely automated」在 Pro 不可用 | 仅 Bot Report |
| Business / 未购 BM 的 Enterprise | 许多复杂 bot | 增加 Likely automated 与确定自动化 | 专用 Bot Analytics |
| Bot Management(Enterprise 订阅) | 增加可用于规则的评分与指纹 | bot score、ja3_hash / ja4、检测 ID、bot 标签、按路径与按 IP 限定 |
完整 |
两个细节值得记住。bot score 为 1–99:1 表示确定是自动化,99 表示确定是人,0 表示未评估——文档明确指出这并不代表请求是安全的或来自真人。 另外,只有 Bot Management 订阅者才能在自定义规则里使用 score,其他套餐只能基于流量分组来写规则。官方模板使用 score lt 30,并说明低于 30 的分值通常与 bot 流量相关。
4. 对剩下的流量限速。 规则条数按套餐为 1 / 2 / 5 / 100;Free 的表达式仅限路径与已验证 bot 特征。计数器按数据中心独立累计,所以绝对上限仍然要放在应用层。
5. 在值得守的路径上加摩擦。 Turnstile 免费,服务端校验是强制的,token 有效期 300 秒且一次性使用。把它放在搜索、导出、登录、注册上——不要放在落地页上。
6. 在应用层让提取变得不划算。 分页上限、按账号配额、水印或延迟数据,以及蜜罐端点。AI Labyrinth 把这个思路搬到了边缘:注入带 nofollow 的不可见陷阱链接。但要注意它不是阻断动作——只在 Security Analytics 里记录 AI Labyrinth Served/Crawls,且关闭后旧链接在短期内仍然有效。
纵深防御
Cloudflare 能力 vs 应用层职责
| 事项 | Cloudflare 提供的 | 你的应用必须做的 |
|---|---|---|
| 立场声明 | 托管 robots.txt;全套餐可用的 AI 爬虫策略 | 按用途决定立场并保持更新 |
| bot 检测 | 按套餐三档;Bot Management 起提供评分与指纹 | 按路径选择动作;接受低档位的粗粒度 |
| 速率控制 | 限流规则(条数受套餐限制) | 按账号与按 Key 的配额;绝对上限 |
| 真人校验 | Turnstile,服务端校验强制 | 接进关键流程;永远不要只信客户端 |
| 陷阱与遥测 | AI Labyrinth;Security Analytics 记录 | 应用层蜜罐端点与分页上限 |
| 数据经济性 | — | 判断什么值得保护,并让提取无利可图 |
边界与不适用情况
- robots.txt 不是强制手段。Cloudflare 明确说明合规是自愿的,该文件在技术层面不阻止抓取。它是声明,不是围栏。
- Hotlink Protection 不能防抓取。文档明写它对抓取没有影响,它防的是图片资源被外站嵌入。
- 分值为 0 不等于安全。它表示请求未被评估——内部流量以及被重定向规则提前处理的请求都会落在这里。不要设计「分值不低就放行」的逻辑,尤其不要写成
score > 0。 - 静态资源保护可能误伤好 bot。文档说明它可能阻断邮件客户端之类有用的代理。要限定范围,并在上线后检查什么坏了。
- 给已验证爬虫限速是有分发成本的。你限掉的流量,就是不会出现在搜索结果里的流量。要有意识地排除已验证 bot,而不是误伤。
- 单一全局计数器是反模式。Cloudflare 的 Durable Objects 指南指出,单个全局对象通常被视为反模式,建议按 IP 或用户分片;并建议在不需要自定义逻辑时优先使用 WAF 限流规则。
FAQ
免费套餐能防住抓取吗? 部分能。Free 有 Bot Fight Mode,会对来自云主机和无头浏览器的简单 bot 在全域施加成本较高的挑战,此外还有 robots.txt 与 AI 爬虫策略。复杂抓取程序挡不住,也无法像高档位那样按路径限定动作。
为什么我不能用 bot score 写规则? 因为在自定义规则中使用 cf.bot_management.score 需要 Bot Management 订阅。其他套餐只能基于流量分组写规则——automated、likely automated、likely human、verified bot——粒度粗一些但仍然有用。
阻断 AI 爬虫会影响我的可见性吗? 取决于你阻断的是哪一类用途。阻断 Training 保护内容不被模型吸收;阻断 Search 则会让你从 AI 答案里消失。这是两个业务后果相反的独立决策,而控制项允许你分别设定。
抓取既然违法,发律师函不就行了? 有时可以,对可识别的商业主体也确实有效。但维权周期长、受司法辖区限制,对匿名操作者毫无作用。技术控制能立刻改变经济账,法律行动是补充而不是替代。
相关阅读
参考来源
以下为 Cloudflare 官方文档页面,本文涉及的功能可用性、配额与限制以此为准;功能会随产品更新变化,以控制台实际可见项为准。
- developers.cloudflare.com/bots/plans/free/
- developers.cloudflare.com/bots/plans/pro/
- developers.cloudflare.com/bots/plans/biz-and-ent/
- developers.cloudflare.com/bots/plans/bm-subscription/
- developers.cloudflare.com/bots/concepts/bot-score/
- developers.cloudflare.com/bots/additional-configurations/block-ai-bots/
- developers.cloudflare.com/bots/additional-configurations/managed-robots-txt/
- developers.cloudflare.com/turnstile/get-started/
- developers.cloudflare.com/waf/rate-limiting-rules/