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的Flask框架中验证注册用户的Email的方法
Sep 02 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
python3+PyQt5自定义视图详解
Apr 24 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Python3.5字符串常用操作实例详解
May 01 Python
python安装本地whl的实例步骤
Oct 12 Python
python如何实现复制目录到指定目录
Feb 13 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
关于Keras Dense层整理
May 21 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
python实现excel公式格式化的示例代码
Dec 23 Python
python 获取谷歌浏览器保存的密码
Jan 06 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
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
什么是JavaScript
2009/08/13 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
python获取豆瓣电影简介代码分享
2014/01/16 Python
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
python psutil模块使用方法解析
2019/08/01 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Android Q之气泡弹窗的实现示例
2020/06/23 Python
PyTorch: Softmax多分类实战操作
2020/07/07 Python
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
某公司面试题
2012/03/05 面试题
新领导上任欢迎词
2014/01/13 职场文书
校园安全演讲稿
2014/05/09 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL