这两天发现抖音分享页面 用户视频数据获取不到了
目前用户信息还是可以正常获取的:抖音用户信息爬取案例
之前的sign生成方法: 抖音视频分享页面_signature
我简单检查了一遍发现是sign值错误。
一开始我以为是抖音更新了sign的生成方法,经过检查和与之前的代码对比,生成方法还是与之前一样。
于是我猜测应该是我的程序被识别出来,导致被ban掉。
我用selenium打开了链接:https://www.iesdouyin.com/share/user/102064772608
一经对比果然发现是selenium被识别到了。 (右图为正常浏览)
查看下接口。返回的数据是空的,这说明我们该驱动生成的sign值不正确。
为了进一步追踪导致生成错误的原因,我选择了一个固定的抖音ID下 的 tac 和 dytk,放到了本地执行生成sign的代码。
经过对比,发现在相同的可见参数下,生成的sign值 其中只有9位是不一样的。
我们接下来就可以一个一个排除干扰因素。
这样大致就有了方向,我查看了下两个浏览器的 navigator。
除了基本的 webdriver = True 之外,还有 languages 不大相同 (其他的指纹信息太难对比了)。
按照以往的经验,直接给了一个开发者模式的options,访问之后,webdriver还是为True。
在网上搜索后,发现是谷歌浏览器自 79.0.3945.36版本开始,修复了非无头模式下“自动化” navigator.webdriver是未定义的问题。
这里有几个解决方法:
- 1 将Chrome回滚一个版本,ChromeDriver回滚对应Chrome的版本即可。(pass,对于我来说在服务器调试太过繁琐)
- 2 启用mitmproxy拦截请求,在请求发送到服务端之前修改js文件,来掩盖webdriver指纹信息。(pass,目前并无法判断服务短是否只根据navigator.webdriver来进行ban选)
3: 最新检索出来的结果,也是目前我正在使用的方法,可以在linux 运行。
使用 driver.execute_cdp_cmd 命令。代码如下:
代码语言:javascript复制driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
""" })
接下来我们启动一个 使用execute_cdp_cmd命令的界面。
虽然navigator.webdriver 已经变成未定义了,但是可以看到 接口返回的数据还是为空。
不要着急。我再次选择一个固定的抖音ID下 的 tac 和 dytk,放到了本地执行生成sign的代码。
好像距离真相又近了一步,这已经可以发现,我们目前模拟生成的sign值 只和真实的值 在ASCII上差了1位。
我没有继续去查询还有哪些driver指纹被识别出来,实在太劳民伤财了。
这里经过我大约有200多次的测试。我组合出来所有字符的变换规则,基本上是固定的。
代码语言:javascript复制# less_list:如果我们生成的sign值 倒数第二位字符(X)在该列表中,那么真实的值需要用值(X)的ASCII减去1。比如m要换成l。
less_list = ['d','V','J','t','m','L','R','l','X','b','Z','B','r','3','v','N','D','P','9','1','H','7','T','z','j','f','x','p','h','5','F','.']
# add_list: 和less相反,真实值需要用假X的ASCII 1,比如假值为M,真值则为n。
add_list = ['a','K','W','M','u','Q','S','A','e','U','O','Y','I','0','k','E','y','c','w','2','s','8','4','6','C','o','g','q','-','i','G','n',]
这样就解决问题了,可以正常的去抓取数据。
通过ASCII - sign值切换代码:
代码语言:javascript复制sig = '我们初次生成出来的值'
less_list = ['d','V','J','t','m','L','R','l','X','b','Z','B','r','3','v','N','D','P','9','1','H','7','T','z','j','f','x','p','h','5','F','.']
add_list = ['a','K','W','M','u','Q','S','A','e','U','O','Y','I','0','k','E','y','c','w','2','s','8','4','6','C','o','g','q','-','i','G','n',]
if sig[-2] in less_list:
flag = '-1'
sig = sig[:-2] chr(ord(sig[-2])-1) sig[-1:]
elif sig[-2] in add_list:
flag = ' 1'
sig = sig[:-2] chr(ord(sig[-2]) 1) sig[-1:]
else:
print("新字符:",sig) # 可能会出现新字符, 新字符默认取 ASCII 1
sig = sig[:-2] chr(ord(sig[-2]) 1) sig[-1:]
访问更多内容可查看专栏:爬虫案例合集