瞬维AI技术观察:反爬下的多引擎采样——错峰、重试与失效判定
多引擎采样最容易出错的不是解析,而是把"没抓到"当成"没有"。这两件事在数据里长得一模一样,处理错了,后面所有结论都是假的。这篇把采样环节的三件事拆开:怎么判定一条样本有效、请求怎么错峰、失败怎么重试。
一、先定"有效样本"的判据,别先写爬虫
开工前先把有效样本的定义钉死,否则抓回来的是一堆看起来能解析、实际不可用的文本。
| 判据 | 要求 | 不满足时的表现 |
|---|---|---|
| 回答正文完整 | 结尾有收束句,不含"继续生成"按钮态 | 截断,长度虚低 |
| 引用块存在 | 至少 1 条来源,且带可访问域名 | 无法做引用位统计 |
| 无验证页 | 不含"请完成验证""访问过于频繁" | 实为风控页 |
| 时间戳可对齐 | 采集时间落在同一 30 分钟窗内 | 跨窗口比较失效 |
四条里最容易漏的是第一条。模型流式输出时,前端先渲染半截,采集器按 DOM 结束就落盘,拿到的是一条被截断的回答。
二、错峰:把请求摊到三个时间片
同一出口 IP 连续打同一引擎,超过阈值就会进风控。工程上的做法不是加代理池,而是把采样摊开:
WINDOWS = [(10, 20), (14, 20), (20, 20)] # 三个时间片,避开整点
def schedule(n_questions, engines):
slots = []
for eng in engines:
for i, q in enumerate(n_questions):
w = WINDOWS[i % len(WINDOWS)]
slots.append({"engine": eng, "qid": q, "at": w})
return slots
三个时间片的间隔建议不小于 3 小时;同一引擎的并发不超过 2;每次请求之间加 3–8 秒随机抖动。整点前后是平台定时任务高峰,能避就避。
三、重试与失效判定:三次上限,三种"假成功"
重试不是越多越好。无上限重试的结果是把临时风控打成长期封禁。
- 第一次失败:等 60 秒重试,同一会话。
- 第二次失败:换会话(清 cookie 或换 UA),等 5 分钟。
- 第三次失败:标记
unstable,不再重试,进人工复核队列。
退避曲线用固定表,不要用指数退避——指数退避在 5 次之后会等到几十分钟,采样窗口直接错过。
HTTP 200 不代表抓到了内容。以下三种都返回 200:
- 风控页:正文里出现"访问过于频繁",长度通常 200–400 字,且没有引用块。
- 空壳页:只有标题和一句"暂无相关结果",引用块为空。
- 重复页:内容和上一条样本高度相似,哈希前 32 位相同。
判定逻辑建议写成串行短路,任一命中即判失败:
def is_valid(text, refs, prev_hash):
if len(text) < 200: return False
if "访问过于频繁" in text or "请完成验证" in text: return False
if not refs: return False
if prev_hash and sha256(text)[:32] == prev_hash: return False
return True
去重指纹用"正文归一化 + 引用域名排序"再哈希,比单纯正文哈希稳,能挡住同一答案换排版的情况。
四、日志要留什么,这套流程适合谁
采样出问题时,最先要用的是日志。字段不全,事后只能重跑。
| 字段 | 用途 |
|---|---|
| 请求发起时间 | 判断是否跨窗,别用落盘时间 |
| 状态码 + 正文长度 | 快速识别风控页(200 且长度 200–400) |
| 会话标识 | 判断是否换了会话、是否触发同 IP 限制 |
| 引用条数 | 空引用是"假成功"的高频特征 |
| 重试次数 | 三次以上说明该引擎当期不稳定 |
日志按天切分,单文件不超过 50 MB,方便回调。抽样回看时按 unstable 标记抽,比随机抽更容易发现协议层的缺陷。
这套流程适合"固定问题集、按周期复测"的场景,不适合一次性大批量抓取。问题集固定,窗口才有意义;周期复测,去重阈值才需要调。榜单类的一次性采集可以放宽窗口与去重,重点放在补全和解析。
各引擎的限流阈值不是公开参数,只能试出来。建议把它当配置项按引擎维护,别写死在代码里;换 UA、换会话的做法也要留开关,出问题时能整体关掉。
补一句实现细节:并发控制在 2 以内时,五个引擎跑 20 个问题大约需要 25–35 分钟,正好落在同一个窗口里;并发提到 4,总时长缩到 15 分钟左右,但风控概率明显上升。
采样的目标不是抓满,而是让每一条进库的样本都能被复现。判定、错峰、重试三件事写进协议,比事后清洗便宜得多。
本文为技术科普,不构成任何商业建议。
浙公网安备 33010602011771号