OP 从 2018 年开始做了一个爬虫项目,从 2018 年持续维护到现在。 爬虫项目里面使用 tensorflow 训练了一个验证码识别器,从 2018 年以来,验证码识别器一直保持很高的准确率(>99%),但是从 2024 年 10 月 17 日开始,被爬的系统开始频繁报错“验证码错误”异常,最开始我以为是被爬系统加强了反爬策略,于是重新采集了 2w 张验证码,打上标记之后重新训练了一个模型,验证集成功率>99%之后将新的模型部署上去了,但是被爬系统依旧频繁报错“验证码错误”。 于是我开始具体的分析整个请求链路,发现这个事情似乎没有这么简单。
出现大量的“验证码错误”报错的当天,代理服务器 B 、业务服务器 C 均没有任何改动,网络环境也没有任何改动,大量报错是突然开始出现的。
从表现来看,似乎是业务系统 A 增加了反爬的相关验证;但是我花了几个小时的时间对业务系统 A 在浏览器环境中请求的接口进行分析,并没有找到明显的痕迹证明业务系统 A 有过变更,依旧是使用“获取页面”、“获取公钥”、“获取验证码”、“识别验证码”、“登录”这些接口就完成了用户账号的登录。
我在另外一台 Windows 服务器上使用 Atrust 登录了相同的 VPN 账号,因为将程序对接过来需要处理网络相关的问题,所以我在服务器的 Edge 浏览器上直接进行人肉测试,打开页面、输入账号密码、登录,整个过程和以前一样,没有出现任何问题,直接登录上了。此时,原来通过 Docker 部署的 Atrust 依旧在处理来自线上的请求,并且持续报错“验证码错误”。
然后我调整了网络,将 Windows 云服务器直接在公网开放端口,并运行了 CCProxy 来暴露代理,在云服务器安全组中将代理服务器 B 加入到白名单中,这样代理服务器能够使用 Windows 云服务器的公网 ip 加上 CCProxy 的代理端口(808)就能实现与 Docker-Atrust 相似的功能。
接着,我调整了灰度设置,将线上的流量从原来的 Docker-Atrust 中全部切换到 Windows 云服务器。观察业务服务 C 一段时间后,业务服务 C 依旧在报错“验证码错误”。此时,我再次打开 Windows 云服务器的 Edge 浏览器,重新运行之前测试过、正常的流程:打开页面、输入账号密码、登录,奇怪的现象出现了,网页报错“验证码错误”、“用户名或密码错误”
这个奇怪的现象令我十分困惑,具体原因如下:
带着上面的疑惑,我测试了多次 Edge 浏览器的登录,大多数情况下报错“验证码错误”、“用户名或密码错误”,如果我在提前输入好账号密码之后,快速多次点击验证码(触发验证码刷新),然后快速输入验证码并点击登录,就能够正确的登录进去。但是在登录后自动跳转的主页中报错“用户会话已注销”之类的提示。
此时夜已经很深了,我就将线上流量切回了 Docker-Atrust ,然后再次在 Windows 云服务器上 Edge 浏览器测试登录,此时它正常了。
😢
这几天的时间里面,我每天都在想这个奇怪的现象,Edge 浏览器与爬虫程序的交叉点是从 Atrust 开始的,如果爬虫程序有问题应该不会影响 Edge 浏览器的 Cookie 与会话,既然影响了说明问题不是出在代理服务器 B 以及业务服务器 C ,而是 Atrust 往上的东西。
我甚至怀疑是 Atrust 存在 bug 导致了不同 Cookie 的请求被混合然后返回了错误的数据,或者是 Atrust 存在一个类似“连接复用”的功能?将不同 Cookie 的请求强行使用了相同的连接然后导致串会话?
我已经尝试修改了爬虫程序,在业务服务器 C 中,每次调用代理服务器 B ,都加上一个时间戳参数,用来确保每次请求的 Uri 均不相同(同一时间请求同一个接口有很小概率相同),问题没有得到解决,也没有肉眼看出来有任何的改善。
也花了时间翻了 Atrust 的一些功能说明和论坛,没有明确找到 Atrust 有这种“连接复用”的功能。
感谢大家花了这么多的时间看到这里,希望大家能够帮我分析分析,看看是不是我的排查思路哪里有问题?或者是 Atrust 的什么相关功能防止了我这种请求方式?
我已经实在是没辙了😢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.