一、背景
亲爱的朋友,当前看到这篇文章时,估计大多数已经遇到过阿里系产品的滑块验证码很难通过问题,本人也遇到此问题并尝试了很久的解决方案,以下是我近期实战总结出的通过滑块验证码技术解析供参考。
二、分析
阿里系的产品(闲鱼,淘宝,高德等)这些产品的滑块验证码均是一样,也就是从左滑到右的形式,这个看起来最简单的验证码却让无数爬虫爱好者头疼,因为只要你使用程序代码访问url不管怎么滑都不会验证成功。
例如如下场景:
1、访问阿里系的某个接口服务:触发反爬机制后,接口会提示反爬
2、如果使用代码打开浏览器来伪装模拟操作页面时,同样会出现验证码
2.1、分析浏览器检测原理
淘宝是怎么知道我们是用代码访问的网站呢?用户代理和浏览器指纹,它们都与普通 Chrome 浏览器完全相同,但是浏览器还是能检测到你是非正常访问。
猜测:本质上都是网站,所以大概率是在前端通过js判断
基本上,Selenium 检测的工作方式是测试使用 Selenium 运行时出现的预定义 JavaScript 变量。机器人检测脚本通常会查找任何变量(在窗口对象上)中包含单词“selenium”/“webdriver”的任何内容,以及名为 $cdc_
和 $wdc_
的文档变量。当然,所有这一切都取决于您使用的浏览器。所以不同的浏览器可能会暴露不同的参数。
也就是说selenium在运行时会预定义$cdc
等变量,然后浏览器上的网站应用则通过前端js获取windows对象中的参数判断有没有$cdc
变量,最终检测出你本次访问是通过驱动chromeDriver来访问的。
https://stackoverflow.com/questions/33225947/can-a-website-detect-when-you-are-using-selenium-with-chromedriver
接下来继续看回答,只需要替换chromedriver
中的cdc_
变量即可,使用vim或perl等编辑chromedriver
二进制代码即可。
2.2、修改chromedriver二进制文件
从以上链接知道了检测原理,修改方案后,我们尝试下载一个chromedriver然后修改二进制文件中变量,然后再进行测试。
chromedriver下载请自行搜索
我这里使用的MacOS系统,以下是MacOS中使用vim修改二进制文件的操作步骤:
1、vim以二进制格式打开需要编辑或查看的文件
vim -b chromedriver
-b
选项告诉 vim 预先将文件作为二进制文件打开,这样它就不会弄乱诸如(丢失)行结尾(尤其是在文件末尾)之类的问题。
使用vim命令打开后,文件内容如下,类似乱码效果。
2、进入vim的命名模式,然后用xxd把文件转换成十六进制格式
:%!xxd
转化后显示类似如下,这个格式就比较熟悉了
3、像对待普通文本一样查看和编辑二进制文件即可
输入 :%s/cdc_/dog_/g
将 cdc_
的所有实例替换为 dog_
注意:确保替换字符串(例如 dog_
)与搜索字符串(例如 cdc_
)具有相同的字符数,否则 chromedriver
将失败。
4、修改完成使用xxd把十六进制转换回二进制
:%!xxd -r
只有十六进制的修改会生效。
5、最后:wq!
保存退出vim
6、修改完后可以通过搜索cdc是否还在二进制文件中来验证修改是否成功
grep "cdc_" /path/to/chromedriver
如果没有返回输出,则替换成功。
三、编码实战
通过以上操作后,我们把chromedriver二进制文件进行了修改,接下来我们找个url来测试,是否可以通过滑块验证。
代码就暂时不贴了,比较简单,随便找个url用Requests访问即可。
当我们通过py使用chromedriver驱动访问url时,打开chrome后,页面会提示这么一句话Chrome正受到自动测试软件的控制
那出现这个提示说明Chrome浏览器还是检测到了使用驱动访问,那怎么办呢?修改cdc参数难道不可行?
接下来我们再研究下这句Chrome正受到自动测试软件的控制
这个相对简单,网上一搜,大部分都是调整参数,网上现成的内容就不展开细说了,那我们就听他们的,加个参数试试。
options.add_experimental_option("excludeSwitches", ['enable-automation'])
# 取消“Chrome正受到自动测试软件的控制”和“请停用以开发者模式运行的扩展程序”
options.add_argument('--disable-blink-features')
options.add_argument('--disable-blink-features=AutomationControlled')
# 去除浏览器selenium监控
options.add_argument('--disable-gpu')
# 禁用GPU加速
总体来说我主要设置了如上参数,
再次代码运行访问时,页面就不会提示Chrome正受到自动测试软件的控制
了
然后测试验证码,我们找个url地址,然后测试
这里我们不写js代码获取滑块来模拟滑动了,直接先手动滑动测试
经过测试发现,一般情况下需要滑动2-3次即可验证通过
滑动注意事项:
1、滑动别太快
2、滑动到最后时最好模拟上下抖动,缓慢滑过
最后完整测试代码运行
改完代码运行后,会提示加载的chromedriver
程序实现自动翻页请求数据
效果动图展示
以上,我们就完美的解决了滑块验证码问题。
总结
本文通过大量搜索实现后得出结论经验,文章内容仅供学习交流。请自行学习代码实现以及chromedriver驱动修改。
免责申明
由于信息安全问题,本文章内容及代码只做学习交流使用,作者不负责任何由此引起的任何直接或间接法律责任。您在引用该文章任何内容时均代表您已同意该协议,由此引起的任何法律责任由您承担。
最后
如果你是准备学习Python或者正在学习(想通过Python兼职),下面这些你应该能用得上:
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/07d9060a01354823888273c0b0a471b7.jpeg#pic_center
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/c5c5e4621a0e46d6949dd89a389eb1a0.jpeg#pic_center