Python爬虫实战系列12:阿里系淘宝滑块验证码通过技术解析!

在这里插入图片描述

一、背景

亲爱的朋友,当前看到这篇文章时,估计大多数已经遇到过阿里系产品的滑块验证码很难通过问题,本人也遇到此问题并尝试了很久的解决方案,以下是我近期实战总结出的通过滑块验证码技术解析供参考。

二、分析

阿里系的产品(闲鱼,淘宝,高德等)这些产品的滑块验证码均是一样,也就是从左滑到右的形式,这个看起来最简单的验证码却让无数爬虫爱好者头疼,因为只要你使用程序代码访问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_/gcdc_ 的所有实例替换为 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!

在这里插入图片描述

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值