如何防止采集程序通过网站搜索接口批量抓取?
防止搜索接口被批量抓取需叠加限流、配额、签名、行为判定和分级处置,并限制分页深度、增加登录门槛,使采集成本高于数据价值,单一封IP或验证码无效。
结论:防住搜索接口批量抓取,靠的不是单一手段,而是“限流 + 配额 + 签名 + 行为判定 + 分级处置”五层叠加,核心目标是让采集者每抓一条数据的成本高于数据本身的价值。只封 IP 或只加验证码,两头都会失效。
搜索接口为什么是采集的重灾区?
搜索接口返回的是已经结构化的 JSON/HTML,不需要登录即可访问,一次请求就能带走 20 条记录,采集方用 10 行 Python 就能跑起来,成本是所有入口里最低的。而列表页、详情页通常有缓存和懒加载,反而更难啃。
这意味着防御重点要放在“单次请求的信息量”和“单位时间的请求量”这两个变量上,而不是纠结 UA 头是不是 python-requests。
第一层:限流具体怎么配?
结论:按 IP 做 60 秒 30 次的滑动窗口限流,超限返回 429 而不是 403,正常用户几乎无感,脚本必然撞墙。
Nginx 层面最快落地:
limit_req_zone $binary_remote_addr zone=search:10m rate=30r/m;
location /api/search {
limit_req zone=search burst=5 nodelay;
limit_req_status 429;
}
burst=5 允许用户连续点击 5 次不被拦,第 6 次开始拒绝。应用层再用 Redis ZSET 做一次精确的滑动窗口(ZREMRANGEBYSCORE 清理 60 秒前的记录,ZCARD 计数),因为 Nginx 的漏桶是粗粒度的。
注意:纯 IP 限流对住宅代理池无效。行业里住宅代理的成本已经压到每千次请求几美元,所以限流只能挡住 80% 的低成本脚本,剩下 20% 要靠后面的层。
第二层:分页深度和结果条数要不要限制?
结论:必须限。单页返回 20 条、分页最多翻到 50 页、单账号每日搜索配额 500 次,这三条能砍掉绝大部分全量遍历。
采集程序的特征是“深翻页”:正常用户 95% 的搜索行为停留在前 3 页,而采集脚本会从第 1 页翻到第 100 页。把 page > 50 的请求直接返回空列表,并提示“请缩小搜索条件以获得更精确结果”,用户体验上完全说得通。
同时给搜索接口加登录态。未登录只能搜索前 3 页,登录后放开到 50 页,注册账号需要手机号验证。这一步把采集成本从“零成本”抬到“每条数据都要一个实名账号”。
第三层:怎么判断请求是人还是机器?
结论:看关键词多样性和请求节奏,比看 UA 和 Referer 有效一个数量级。
三个可量化的判定指标:
- 关键词多样性:
distinct(keyword) / 总请求数 > 0.8且 60 秒内请求超过 100 次,几乎可以确定是遍历式采集。真人会重复搜索、会改错字、会在一个关键词上停留。 - 请求间隔方差:脚本的间隔标准差通常小于 50 毫秒,真人的间隔在几百毫秒到几十秒之间波动。
- TLS 指纹(JA3):同一 JA3 值在 10 分钟内命中 200 个以上不同关键词,判定为同一采集集群,即使源 IP 一直在换。
再叠加接口签名:sign = HMAC-SHA256(uid + ts + nonce + keyword, secret),ts 有效期 300 秒,nonce 用 Redis SETNX 存 300 秒防重放。签名不能防住逆向,但能挡住 90% 直接调接口的“拿来主义”脚本,因为逆向 JS 的成本远高于写个 requests 循环。
第四层:验证码什么时候弹才不误伤?
结论:不要一命中风控就封,先弹滑块验证,验证通过后放行并降权。误封正常用户的代价远高于漏放一个爬虫。
做法是给每个请求打风险分:同 IP 60 秒内超过 30 次记 20 分,UA 与 JA3 不匹配记 15 分,无签名或签名过期记 25 分,命中蜜罐字段记 100 分。累计 60 分弹滑块,120 分封 24 小时。
蜜罐字段是个便宜好用的补充:搜索表单里放一个 display:none 的输入框,正常用户的浏览器不会填,而不少采集脚本会遍历所有 input 自动填值——填了就直接判定。
怎么判断自己已经中招了?
结论:盯三个数——搜索接口 QPS、单 IP 关键词多样性、429 返回占比,任一异常都说明有采集在跑。
把搜索接口的日志字段补全:时间、IP、UA、JA3、keyword、page、响应码,保留 30 天。跑一个每日离线任务,统计“单 IP 日搜索量 Top 100”和“关键词多样性 > 0.8 的 IP 列表”,比实时规则更容易发现慢速采集(每天只抓 1 万次、分散在 24 小时里的那种)。
对抗是长期过程:封 IP 会催生代理池,加验证码会催生打码平台(现价约每千次 1-3 元)。所以最终的稳态不是“彻底防住”,而是把对方每次请求的成本推到高于数据价值——分页限制、登录配额、签名、验证码四件套叠满,采集一个 10 万条数据的成本会从几十元涨到几千元,绝大多数需求方到这一步就放弃了。
转载请注明出处,版权归原作者所有。