抓取日志里状态码全是 200,3 万条记录里有 1.1 万条正文不到 20 个字,内容是「请完成安全验证后访问」,任务没报错,入库才发现一半是脏数据。乍看像缓存或者权限的锅,追下去往往不是。
if r.status_code == 200 and len(r.text) < 500:
print('suspect', len(r.text), r.text[:40])
追下去是这么回事:反爬把拦截页的状态码改成了 200,只在正文里塞一段提示,脚本按状态码判断成功就一路入库。拦截页体积通常很小,正文关键词和正常页完全不同。
碰到「软拦截识别」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
具体做法是,用正文字数设下限过滤;匹配拦截页的固定特征词;命中后暂停任务并切换出口;把拦截率单独打点做监控。
验收就看一点,加上长度和关键词双判断后,脏数据从 1.1 万条降到 0,拦截率打点后 5 分钟内就能发现封禁。
