网站防采集规则怎样测试拦截率才准确?
准确测试防采集规则拦截率应采用双样本对照,每组至少1000条异常和正常请求,分别计算拦截率与误杀率,优先用生产日志回放或真实爬虫流量,按灌异常、灌正常、看双指标、调规则循环验证,避免手工点击和纯压测模拟。
准确的拦截率只能靠「双样本对照测试」得出:准备至少 1000 条标注好的异常请求和 1000 条正常请求,分别打向装了同一套规则的目标,同时算出拦截率和误杀率两个数字——只报其中任何一个,都不算测准。
为什么在浏览器里点几下测不出拦截率?
结论:手工点击只能验证「规则会不会触发」,测不出拦截率,因为拦截率是一个带分母的比率。
拦截率的定义是:被规则拦下的异常请求数 ÷ 异常请求总数。手工点 5 次、被拦 5 次,你得到「100%」,但分母只有 5,这个数字的 95% 置信区间大约在 55%~100% 之间,等于没测。
真实采集流量的行为特征和手工点击完全不同:请求头顺序、TLS 指纹(JA3,客户端握手时的一组特征值)、Cookie 复用方式、并发节奏、Referer 缺失率。你手工测出来的「命中」,往往是规则对真人有效,而不是对爬虫有效。
拦截率和误杀率分别怎么算?
结论:拦截率的分母是异常样本,误杀率的分母是正常样本,两个必须一起报。
- 拦截率 = 被拦的异常请求数 ÷ 异常请求总数
- 误杀率 = 被拦的正常请求数 ÷ 正常请求总数
判定「被拦」的口径要统一:状态码 403 / 429、跳转到验证码页、返回空 JSON、连接被重置,都算拦截。建议在测试脚本里做响应特征匹配,不要只看状态码。
样本量建议每组至少 1000,理想 5000。1000 样本下,拦截率 90% 的 95% 置信区间约 ±1.9 个百分点;样本降到 100,误差会放大到 ±6 个百分点以上,这个精度没法用来做规则取舍。误杀率目标线:面向正常用户的站点压到 0.1% 以内(1000 次正常访问最多误拦 1 次),风控可以放宽的站点,0.5% 是常见上限。
测试流量从哪来才真实?
结论:优先用生产日志回放,其次用真实爬虫脚本,最差才是压测工具模拟——纯模拟流量测出的拦截率通常偏高。
三种来源的靠谱程度从高到低:
- 生产 access log 回放。从 Nginx 日志导出带 IP、UA、URL、Referer 的原始请求,用 GoReplay 或自写 Python 脚本按原时间间隔重放,重放时改目标域名,别真打到线上。
- 真实采集器样本。用 curl_cffi(模拟浏览器 TLS 指纹)和 Playwright 无头浏览器各跑一遍,这才是爬虫的真实行为。
- 压测工具模拟。
hey -n 5000 -c 50或wrk -t4 -c100 -d60s,请求头几乎是空的,很容易被规则一刀切全拦,测出来的拦截率虚高。
具体怎么跑一轮测试?
结论:按「灌异常 → 灌正常 → 看两个数 → 调规则 → 再跑」循环,一轮控制在 10 分钟内。
- 单独部署一份目标环境,关掉 CDN 缓存和前置 WAF,否则你测的是 CDN 的策略而不是自己的规则。
- 确认测试机 IP 不在白名单里,UA 白名单、内网 IP 豁免要先临时关掉,否则流量根本不进规则。
- 先灌异常样本记录被拦数,再灌正常样本记录被拦数。两组之间间隔至少 60 秒,避免频率类规则的计数窗口被前一组污染。
- 频率类规则要按阈值设计节奏。规则是「同一 IP 60 秒内超过 100 次请求触发」,就用两档验证:90 次/分(不该触发)和 120 次/分(该触发)。
wrk -t2 -c10 -d60s --rate=2就是 2 req/s 的匀速压测。 - 异常组和正常组不要用同一个出口 IP,至少隔开 5 分钟再换组。
为什么测试结果经常和线上对不上?
结论:因为测试环境少了缓存、CDN、真实 IP 透传这三层,线上拦截率通常和测得值差 10 个百分点以上。
三个最常见的偏差来源:一是源站拿不到真实 IP,没配 X-Forwarded-For 透传或 real_ip 模块时,所有请求在规则眼里都是 CDN 节点 IP,基于 IP 的规则会全量命中或全量放过;二是静态资源被缓存,HTML 走规则、图片走 CDN,测试时全打到源站,分母就虚高了;三是没有灰度观察,规则上线后至少盯 7 天,每天看一次拦截率和误杀率,误杀率超过 0.5% 就该回滚或加白名单。
一句话收束:拦截率不是测「规则灵不灵」,而是测「两组样本在同一套规则下的通过比例」,异常样本决定拦截率,正常样本决定误杀率,样本量决定这个数字能不能信,灰度期决定它是不是真的成立。
转载请注明出处,版权归原作者所有。