python爬虫之验证码篇3-滑动验证码识别技术


Posted in Python onApril 11, 2019

滑动验证码介绍

本篇涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成。

python爬虫之验证码篇3-滑动验证码识别技术

这类验证码不常见了,官方介绍地址为:https://promotion.aliyun.com/ntms/act/captchaIntroAndDemo.html

使用起来肯定是非常安全的了,不是很好通过机器检测

如何判断验证码类型

这个验证码的标识一般比较明显,在页面源码中一般存在一个 nc.js 基本可以判定是阿里云的验证码了

<script type="text/javascript" src="//g.alicdn.com/sd/ncpc/nc.js?t=1552906749855"></script>

识别套路

截止到2019年3月18日,本验证码加入了大量的selenium关键字验证,所以单纯的模拟拖拽被反爬的概率满高的,你也知道一般情况爬虫具备时效性 不确保这种手段过一段时间还可以使用!

导入selenium必备的一些模块与方法


from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ActionChains
import time
import random

在启动selenium之前必须要设置一个本机的代理,进行基本的反[反爬] 处理,很多爬虫在获取用户指纹的时候,都比较喜欢selenium,因为使用selenium模拟浏览器进行数据抓取,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制

但是selenium越来越多的被各种网站进行了相关屏蔽,因为selenium在运行的时候会暴露出一些预定义的Javascript变量(特征字符串),例如"window.navigator.webdriver",在非selenium环境下其值为undefined,而在selenium环境下,其值为true

python爬虫之验证码篇3-滑动验证码识别技术

下图所示为selenium驱动下Chrome控制台打印出的值

python爬虫之验证码篇3-滑动验证码识别技术

 细致的绕过去的方法,可能需要单独的一篇博客进行赘述了,这里我只对上面的参数进行屏蔽,使用到的是之前博客中涉及的mitmdump进行代理

https://docs.mitmproxy.org/stable/concepts-certificates/

mitmdump进行代理

技术参考来源:https://zhuanlan.zhihu.com/p/43581988

关于这个模块的基本使用,参考我前面的博客即可,这里核心使用了如下代码

indject_js_proxy.py
from mitmproxy import ctx
injected_javascript = '''
// overwrite the `languages` property to use a custom getter
Object.defineProperty(navigator, "languages", {
 get: function() {
  return ["zh-CN","zh","zh-TW","en-US","en"];
 }
});
// Overwrite the `plugins` property to use a custom getter.
Object.defineProperty(navigator, 'plugins', {
 get: () => [1, 2, 3, 4, 5],
});
// Pass the Webdriver test
Object.defineProperty(navigator, 'webdriver', {
 get: () => false,
});
// Pass the Chrome Test.
// We can mock this in as much depth as we need for the test.
window.navigator.chrome = {
 runtime: {},
 // etc.
};
// Pass the Permissions Test.
const originalQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (parameters) => (
 parameters.name === 'notifications' ?
  Promise.resolve({ state: Notification.permission }) :
  originalQuery(parameters)
);
'''
 
def response(flow):
  # Only process 200 responses of HTML content.
  if not flow.response.status_code == 200:
    return
 
  # Inject a script tag containing the JavaScript.
  html = flow.response.text
  html = html.replace('<head>', '<head><script>%s</script>' % injected_javascript)
  flow.response.text = str(html)
  ctx.log.info('>>>> js代码插入成功 <<<<')
 
  # 只要url链接以target开头,则将网页内容替换为目前网址
  # target = 'https://target-url.com'
  # if flow.url.startswith(target):
  #   flow.response.text = flow.url

上述脚本放置任意目录,之后进行mitmdump的启动即可

C:\user>mitmdump -s indject_js_proxy.py  
Loading script indject_js_proxy.py
Proxy server listening at http://*:8080

启动之后,通过webdriver访问

测试网站:https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html

如果webDriver是绿色,也说明代理起作用了

python爬虫之验证码篇3-滑动验证码识别技术

selenium爬取

接下来就是通过selenium进行一些模拟行为的操作了,这部分代码比较简单,编写的时候参考一下注释即可。

# 实例化一个启动参数对象
chrome_options = Options()
# 添加启动参数
chrome_options.add_argument('--proxy-server=127.0.0.1:8080')
# 将参数对象传入Chrome,则启动了一个设置了窗口大小的Chrome
driver = webdriver.Chrome(chrome_options=chrome_options)

关键函数

def move_to_gap(tracks):
  driver.get("https://passport.zcool.com.cn/regPhone.do?appId=1006&cback=https://my.zcool.com.cn/focus/activity")
  # 找到滑块span
  need_move_span = driver.find_element_by_xpath('//*[@id="nc_1_n1t"]/span')
  # 模拟按住鼠标左键
  ActionChains(driver).click_and_hold(need_move_span).perform()
  for x in tracks: # 模拟人的拖动轨迹
    print(x)
    ActionChains(driver).move_by_offset(xoffset=x,yoffset=random.randint(1,3)).perform()
  time.sleep(1)
  ActionChains(driver).release().perform() # 释放左键

注意看到上述代码中有何核心的点 --- 拖拽距离的 列表tracks

if __name__ == '__main__':
  move_to_gap(get_track(295))

这个地方可以借鉴网上的方案即可

def get_track(distance):
  '''
  拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
  匀变速运动基本公式:
  ①v=v0+at
  ②s=v0t+(1/2)at²
  ③v²-v0²=2as

  :param distance: 需要移动的距离
  :return: 存放每0.2秒移动的距离
  '''
  # 初速度
  v=0
  # 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移
  t=0.1
  # 位移/轨迹列表,列表内的一个元素代表0.2s的位移
  tracks=[]
  # 当前的位移
  current=0
  # 到达mid值开始减速
  mid=distance * 4/5

  distance += 10 # 先滑过一点,最后再反着滑动回来

  while current < distance:
    if current < mid:
      # 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细
      a = 2 # 加速运动
    else:
      a = -3 # 减速运动

    # 初速度
    v0 = v
    # 0.2秒时间内的位移
    s = v0*t+0.5*a*(t**2)
    # 当前的位置
    current += s
    # 添加到轨迹列表
    tracks.append(round(s))

    # 速度已经达到v,该速度作为下次的初速度
    v= v0+a*t

  # 反着滑动到大概准确位置
  for i in range(3):
    tracks.append(-2)
  for i in range(4):
    tracks.append(-1)
  return tracks

代码注释已经添加好,可以自行查阅,临摹一下即可明白

最后开始进行尝试,实测中,发现可以自动拖动,但是,出现一个问题是最后被识别为机器,这个地方,我进行了多次的修改与调整,最终从代码层面发现实现确实有些复杂,所以改变策略,找一下chromedriver.exe是否有修改过的版本,中间去除了selenium的一些关键字,运气不错,被我找到了。

python爬虫之验证码篇3-滑动验证码识别技术

目前只有windows10版本和linux16.04版本
gitee地址:https://gitee.com/bobozhangyx/java-crawler/tree/master/file/%E7%BC%96%E8%AF%91%E5%90%8E%E7%9A%84chromedriver

下载之后,替换你的 chromedriver.exe

python爬虫之验证码篇3-滑动验证码识别技术

再次运行,成功验证

python爬虫之验证码篇3-滑动验证码识别技术

总结

以上所述是小编给大家介绍的python爬虫之验证码篇3-滑动验证码识别技术,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python生成指定长度的随机数密码
Jan 23 Python
python操作CouchDB的方法
Oct 08 Python
Python生成随机密码的方法
Jun 16 Python
使用django-guardian实现django-admin的行级权限控制的方法
Oct 30 Python
python实现给scatter设置颜色渐变条colorbar的方法
Dec 13 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
Python基础之数据结构详解
Apr 28 Python
python之json文件转xml文件案例讲解
Aug 07 Python
baselines示例程序train_cartpole.py的ImportError
May 20 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
Apr 11 #Python
python面试题小结附答案实例代码
Apr 11 #Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 #Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 #Python
Python单元和文档测试实例详解
Apr 11 #Python
Python的高阶函数用法实例分析
Apr 11 #Python
Python2与Python3的区别实例分析
Apr 11 #Python
You might like
PHP实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
php程序效率优化的一些策略小结
2010/07/17 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
php实用代码片段整理
2016/11/12 PHP
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
如何在Python中编写并发程序
2016/02/27 Python
Python的IDEL增加清屏功能实例
2017/06/19 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python遍历numpy数组的实例
2018/04/04 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
Python中Yield的基本用法
2020/10/18 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
英语专业毕业生自荐信范文
2013/12/31 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
征兵宣传标语
2014/06/20 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
销售开票员岗位职责
2015/04/15 职场文书
国庆阅兵观后感
2015/06/15 职场文书
导游词书写之黄山
2019/08/06 职场文书
instantclient客户端 连接oracle数据库
2022/04/26 Oracle