当前位置:首页 > 焦点

python 爬虫authorization每天都在变怎么办

早上九点,爬虫我照常打开那个数据监控后台,天都准备抓取竞品价格。变办脚本跑起来还不到三分钟,爬虫日志里就甩出一行刺眼的天都红字:401 Unauthorized。我盯着屏幕骂了一句,变办这已经是爬虫本周第三次了。

对方网站的天都Authorization字段,每天凌晨四点准时更换。变办像闹钟一样准。爬虫我试过硬编码token,天都第二天准失效;试过用session保持登录,变办撑不过六小时。爬虫最气人的天都是,他们的变办token不是简单的base64拼接,而是带着时间戳和随机数的加密串,肉眼根本看不出规律。

后来我抓了几天包,把每天的请求头拉出来对比。发现token分三段,中间那段像是HMAC签名,末尾跟着一串毫秒级时间戳。但光看没用,你得找到生成算法。于是我把目标转向他们的前端JS文件,用Chrome的Sources面板逐个翻。找了两个下午,终于在一个压缩得只剩一行的auth.js里,看到了crypto-js的调用痕迹——他们用AES加密,密钥藏在另一个接口的响应头里。

破解思路一下就通了。我写了个预请求,先访问他们的/api/config,从响应头里取出那个动态密钥,再配合当前时间戳,用Python的pycryptodome库现场生成token。整个过程不到800毫秒,但每次请求前都得刷新一次。代价是请求速度慢了,但至少不用每天凌晨爬起来改代码。

这事的本质,是爬虫和反爬的军备竞赛。他们换token,不是防脚本,是防那些懒得动脑子的初级爬虫。真正麻烦的是那些把token绑定在设备指纹或者IP段上的网站——那种情况,你光破解算法没用,还得模拟浏览器指纹。我上次遇到一个,token里嵌着Canvas渲染的哈希值,我愣是花了一周用playwright无头浏览器去复现。最后发现他们居然用WebGL的显卡信息做盐,气得我差点砸键盘。

但话说回来,动态token不是死局。你只要抓住三个关键点:第一,找到token生成依赖的变量——时间、随机数、固定密钥,缺一不可;第二,观察token是否和用户行为挂钩,比如鼠标轨迹或者点击频率;第三,如果实在破解不了,就绕道——很多网站对移动端接口的防护松得多,换个User-Agent伪装成App请求,往往能直接拿到长期有效的token。

现在我的爬虫脚本里放了个定时任务,每十分钟自动拉一次密钥,预生成一批token存到内存里,用完就丢。虽然偶尔还是会遇到临时加盐的情况,但至少不用每天和authorization死磕了。说到底,动态验证防的是懒人,不是有心人。你只要愿意多翻几行JS代码,多抓几次包,总能找到那个藏在角落里的规律。

分享到: