Cloudflare 防采集不能只靠一条 UA 黑名单,正确配置是三层组合:Bot 管控层(Bot Fight Mode / Super Bot Fight Mode)负责拦已知自动化工具,WAF 自定义规则层负责按条件精准拦截,速率限制层(Rate Limiting)负责压制高频抓取,最后用托管质询(Managed Challenge)兜底误伤。只写一条「拦截 python-requests」的规则,任何换个 UA 的采集器都能绕过。
Cloudflare 防采集先开哪几个开关?
结论:先把免费就有的三个开关打开——Bot Fight Mode、Browser Integrity Check、Security Level 设为 Medium,这三个改完不用写一行表达式就能挡掉大部分无脑爬虫。
入口都在控制台的 Security 分类下:Bots 页面开 Bot Fight Mode(免费计划可用,只有开/关两档);Settings 页面勾选 Browser Integrity Check,它会拦掉 UA 或请求头明显异常的流量;Security Level 设为 Medium,会提高访客的威胁评分阈值触发质询。
「I'm Under Attack」模式不要常开。它会给每个访客先展示一个 5 秒的 JS 挑战页,正常用户和搜索引擎都会被拖慢,只适合被打爆的那几小时临时开。同理,质询优先选 Managed Challenge 而不是 Block,它会自动在非交互式挑战和交互式 CAPTCHA 之间选择,误伤真人的概率最低。
WAF 自定义规则怎么写才能拦住采集器?
结论:自定义规则的写法是「多个弱特征组合成一个强条件」,单条件拦截必然误伤或被绕过。免费计划提供 5 条自定义规则,Pro 20 条、Business 100 条,以控制台 Custom rules 页面显示的剩余条数为准。
第一条,拦空 UA 和脚本 UA,动作选 Managed Challenge:
(lower(http.user_agent) contains "python") or
(lower(http.user_agent) contains "scrapy") or
(lower(http.user_agent) contains "curl") or
(lower(http.user_agent) contains "go-http-client") or
(http.user_agent eq "")
第二条,拦「无 Referer + 直连列表接口」的组合,这类流量基本是直接扒数据不是正常浏览:
(http.request.uri.path contains "/api/list" and http.referer eq "")
第三条,白名单要放在规则列表最前面,动作用 Skip,跳过后续所有规则:
(cf.client.bot eq true)
cf.client.bot 是 Cloudflare 基于反向 DNS 验证过的合法爬虫标识,Googlebot、Bingbot 都在列表里。规则按列表从上到下评估,白名单放后面等于没写。
速率限制的阈值设多少合适?
结论:速率限制要绑定单条高频路径而不是全站,计数周期选 10 秒,动作选 Managed Challenge,别一上来就 Block。免费计划提供 1 条 Rate Limiting 规则,Pro 2 条起。
一条可直接用的配置:特征选择 IP,路径匹配 /api/,计数周期 10 秒,阈值 30 次,缓解时长 1 分钟。列表页、搜索接口这类重查询路径阈值可以压到 10 次/10 秒,详情页放到 60 次/10 秒。
动作千万别选 Block。国内大量用户走 CGNAT 共享出口 IP,一个小区可能几十人同一个地址,直接封会让整片人打不开页面。托管质询能拦住脚本但放过真人。
怎么避免把 Googlebot 一起封掉?
结论:只要用了 UA 特征匹配,就必须配套放行已验证爬虫,否则 Search Console 会在几天内冒出大量抓取错误。
除了上面那条 cf.client.bot eq true 的 Skip 规则,还要对 /robots.txt、/sitemap.xml 这类路径单独放行。判断误伤的信号很直接:Search Console 的抓取统计里错误率飙升、已收录页面数连续一周下降。
上线节奏上,新规则先跑 3 到 7 天再收紧。免费版没有 Log 动作(那是 Business 及以上才有),替代办法是动作先用 Managed Challenge 观察——真人是能点过去的,脚本过不去,安全事件页面里能看到命中记录。
只靠 Cloudflare 够不够?
结论:不够。Cloudflare 拦的是网络层特征,绕过它只需要一个能跑无头浏览器的代理池,最后一道墙必须放在服务端和内容层。
三个成本低效果好的补充手段:一是在页面里埋一个 display:none 的蜜罐链接,正常用户点不到,爬虫会跟着抓,命中就拉黑;二是把价格、库存这类核心数据改成带签名和 5 分钟时效 token 的异步接口,静态 HTML 里拿不到真数据;三是在应用层做账号维度和 session 维度的限流,比 IP 限流难绕过得多。
配置时踩得最多的坑是 Bot Fight Mode 不能被 WAF 的 Skip 规则绕过——它独立于 WAF 规则链运行,如果你的 API 需要放行服务器到服务器的调用,得升级到 Super Bot Fight Mode(Pro 计划起)才有细粒度开关。免费版遇到冲突,只能关掉 Bot Fight Mode 改用自定义规则。
一句话收尾:Cloudflare 负责挡掉 90% 的低成本爬虫,剩下的 10% 要靠蜜罐、异步接口和服务端限流联手处理;规则永远先放行已验证爬虫、先用质询代替封禁、先跑够 3 天再收紧。