前言

做爬虫时,难免会遇到需要通过验证码才能访问网址进行爬取内容,所以需要额外掌握破解验证码的技巧才行。
本文将讲解另一个验证码示例来进行演示(滑动验证码
上一篇写了: 破解验证码(1)数字英文验证码,可跳转到:https://blog.csdn.net/ytraister/article/details/106307610

实例

  • 以腾讯防水墙滑动验证码为例,进行破解 python + selenium + cv2
  • 验证码地址:https://open.captcha.qq.com/online.html
  • 使用OpenCV库,需要额外安装:pip install opencv-python
  • 效果如下图:

》完整代码如下(含解析):

实际开发中,可以根据自己的需求进行改动

import numpy as np                              # 矩阵计算的函数库
import random
from selenium.webdriver import ActionChains     # 控制鼠标操作
import time
from selenium import webdriver
from PIL import Image                           # Python图像库
import os
from selenium.webdriver.support.ui import WebDriverWait
import cv2                                      # 强大的图像处理和计算机视觉库class Login(object):def __init__(self):# 初始化方法:url、driver(浏览器驱动)# 如果是实际应用中,可在此处添加账号和密码self.url = "https://open.captcha.qq.com/online.html"self.driver = webdriver.Chrome()@staticmethoddef show(name):# 调用窗口显示图片,以下3步骤是必须的cv2.imshow("Show", name)    # 参数1:窗口名称;参数2:需要显示的图片cv2.waitKey(0)cv2.destroyAllWindows()@staticmethoddef webdriverwait_send_keys(dri, element, value):"""显示等待 输入:param dri:     浏览器驱动driver:param element: 通过selenium获取到的html元素:param value:   需要传入的值"""WebDriverWait(dri, 10, 5).until(lambda dr: element).send_keys(value)@staticmethoddef webdriverwait_click(dri, element):"""显示等待 click:param dri:     浏览器驱动driver:param element: 通过selenium获取到的html元素"""WebDriverWait(dri, 10, 5).until(lambda dr: element).click()# 当需要多次调用该显示等待函数时,可以使用匿名函数lambda来获取元素     lambda函数接收一个参数word(即上面的dr)。且在冒号和末尾圆括号之间的部分为函数的定义。@staticmethoddef get_position(chunk, canves):"""判断缺口位置:param chunk:   缺口图片(验证码中的大图):param canves:  验证码中的拼图:return:        位置 x, y"""# cv2.imread()用于读取图片文件;参数1:图片路径,参数2:读取图片的形式(1表示彩色图片[默认],0表示灰度图片,-1表示原来的格式)chunk = cv2.imread(chunk, 0)            # 读取大图(灰化)canves = cv2.imread(canves, 0)          # 读取拼图(灰化)# 二值化后的图片名称slide_puzzle = "slide_puzzle.jpg"slide_bg = "slide_bg.jpg"# 将二值化后的图片进行保存# cv2.imwrite()用于保存图片文件;参数1:保存的图像名称,参数2:需要保存的图像cv2.imwrite(slide_bg, chunk)            # 保存大图cv2.imwrite(slide_puzzle, canves)       # 保存拼图chunk = cv2.imread(slide_bg)            # 使用cv2.imread()读出来的是BGR数据格式# cv2.cvtColor(p1, p2) 是颜色空间转换函数    参数1:需要转换的图片,参数2:转换成何种格式# cv2.COLOR_BGR2RGB:将BGR格式转换成RGB格式      cv2.COLOR_BGR2GRAY:将BGR格式转换成灰度图片chunk = cv2.cvtColor(chunk, cv2.COLOR_BGR2GRAY)chunk = abs(255 - chunk)                # abs用于返回数字的绝对值cv2.imwrite(slide_bg, chunk)            # 保存大图  此时大图缺口部分的颜色比较浅,图像较容易识别到该缺口部分chunk = cv2.imread(slide_bg)            # 读取大图canves = cv2.imread(slide_puzzle)       # 读取拼图# 获取偏移量result = cv2.matchTemplate(chunk, canves, cv2.TM_CCOEFF_NORMED)  # cv2.matchTemplate()实现模板匹配(即用来在大图中找小图,也就是说在一副图像中寻找另外一张模板图像的位置)# 返回的result是一个矩阵,是每个点的匹配结果# Login.show(chunk)                     # 展示大图二值化后的效果# result.argmax()返回的是矩阵中最大数值的下标;    result.shape 返回的是(680, 390)即下载的图片对象的尺寸y, x = np.unravel_index(result.argmax(), result.shape)      # np.unravel_index()作用:获取一个/组 int类型的索引值在一个多维数组中的位置  计算出 大图 与 拼图 位移的距离return x                                # 实际滑动的距离就是x轴的距离,因此只需要x的值即可@staticmethoddef get_track(distance):"""模拟轨迹 假装是人在操作匀变速运动基本公式:①v=v0+at            速度公式②s=v0t+(1/2)at²     位移公式:param distance:    移动的距离:return:            track"""v = 0                       # 初速度t = 0.2                     # 时间间隔0.2stracks = []                 # 移动轨迹列表,列表内的每一个元素代表0.2s的位移current = 0                 # 当前的位移mid = distance * 4 / 5      # 到达mid值开始减速(前4/5段加速 后1/5段减速)distance += 10              # 先滑过一点,最后再反着滑动回来while current < distance:if current < mid:# 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细a = random.randint(28, 30)      # 加速运动else:a = -random.randint(12, 13)     # 减速运动v0 = v                              # 初速度s = v0 * t + 0.5 * a * (t ** 2)     # 0.2秒时间内的位移current += s                        # 当前的位置tracks.append(round(s))             # 添加到轨迹列表,round()为保留一位小数且该小数要进行四舍五入v = v0 + a * t                      # 速度已经达到v,该速度作为下次的初速度# 反着滑动到大概准确位置for i in range(4):tracks.append(-random.randint(3, 4))return tracks@staticmethoddef urllib_download(imgurl, imgsavepath):"""下载图片:param imgurl:      需要下载图片的url:param imgsavepath: 图片存放位置"""# python3中的urllib.request模块所提供的urlretrieve()函数。urlretrieve()方法可以直接将远程数据下载到本地from urllib.request import urlretrieveurlretrieve(imgurl, imgsavepath)def after_quit(self):"""关闭浏览器"""self.driver.quit()def login_main(self):# ssl._create_default_https_context = ssl._create_unverified_context    # 用于忽略网页的SSL认证,需要额外导入import ssldriver = self.driverdriver.maximize_window()driver.get(self.url)# 获取到元素并实现点击click_keyi_username = driver.find_element_by_xpath("//div[@class='wp-onb-tit']/a[text()='可疑用户']")self.webdriverwait_click(driver, click_keyi_username)login_button = driver.find_element_by_id('code')self.webdriverwait_click(driver, login_button)time.sleep(1)driver.switch_to.frame(driver.find_element_by_id('tcaptcha_iframe'))    # 用于获取到验证码iframe元素time.sleep(0.5)bk_block = driver.find_element_by_xpath('//img[@id="slideBg"]')         # 获取验证码中的大图web_image_width = bk_block.size             # 获取大图的大小(高度、宽度)web_image_width = web_image_width['width']  # 获取大图的宽度# print(bk_block.location)                  # 该图片对象在弹出的验证码框中的位置,返回字典的格式,例如:{'x': 10, 'y': 61}bk_block_x = bk_block.location['x']         # 获取该图片对象在验证码框中的位置(x轴)slide_block = driver.find_element_by_xpath('//img[@id="slideBlock"]')   # 获取验证码中的拼图# print(bk_block.location)                  # 该图片对象在弹出的验证码框中的位置,返回字典的格式,例如:{'x': 36, 'y': 102}slide_block_x = slide_block.location['x']   # 获取该图片对象在验证码框中的位置(x轴)bk_block = driver.find_element_by_xpath('//img[@id="slideBg"]').get_attribute('src')        # 获取验证码中的大图urlslide_block = driver.find_element_by_xpath('//img[@id="slideBlock"]').get_attribute('src')  # 获取验证码中的拼图urlslid_ing = driver.find_element_by_xpath('//div[@id="tcaptcha_drag_thumb"]')                 # 获取滑块os.makedirs('./image/', exist_ok=True)      # os.makedirs():递归创建多层目录;其中参数exist_ok=True:表示在目标目录已存在的情况下不会抛出异常(即不会报错)self.urllib_download(bk_block, './image/bkBlock.png')           # 下载验证码中的大图self.urllib_download(slide_block, './image/slideBlock.png')     # 下载验证码中的拼图time.sleep(0.5)img_bkblock = Image.open('./image/bkBlock.png')                 # 因为下载的大图跟浏览器中显示的大图比例不一样,会影响到滑动的距离跟速度,所以计算出比例后面用到real_width = img_bkblock.size[0]                                # 获取下载的验证码中大图的宽度:680width_scale = float(real_width) / float(web_image_width)        # 得出比例      [下载的大图大小为:680*390;浏览器显示的大图大小为:340.81*198.45(大概)]position_x = self.get_position('./image/bkBlock.png', './image/slideBlock.png')               # 获取到 大图 与 拼图 位移的距离 (实际滑动的距离就是x轴的距离)real_position = position_x / width_scale                        # 将大图/比例,得到验证码框中大图与拼图实际的滑动距离real_position = real_position - (slide_block_x - bk_block_x)    # (slide_block_x - bk_block_x):即拼图到大图的左边距,所以减去左边距后才得到真正的滑动距离track_list = self.get_track(real_position)                      # 调用get_track()方法,传入真实距离参数,得出移动轨迹ActionChains(driver).click_and_hold(on_element=slid_ing).perform()              # 找到滑块元素,点击鼠标左键,按住不放time.sleep(0.2)# 拖动元素for track in track_list:ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()     # 根据运动轨迹(x轴),进行拖动time.sleep(0.002)time.sleep(1)ActionChains(driver).release(on_element=slid_ing).perform()     # 释放鼠标time.sleep(1)print('登录成功')self.after_quit()if __name__ == '__main__':login = Login()login.login_main()

》参考文献:

https://blog.csdn.net/qq_38534107/article/details/89522481
https://blog.csdn.net/Tracy_LeBron/article/details/84567419

破解验证码(2)滑动验证码相关推荐

  1. Day06,selenium的剩余用法、万能登录破解和爬取京东商品信息,及破解极验滑动验证码...

    一.自动登录抽屉新热榜 from selenium import webdriver import timedriver = webdriver.Chrome(r'D:\BaiduNetdiskDow ...

  2. 艺赛旗RPA验证码处理系列(三):破解极验滑动验证码

    目前艺赛旗RPA已经更新到8.0版本,可以让所有用户免费下载试用http://www.i-search.com.cn/index.html?from=line1 (复制链接下载) 一,介绍 一些网站会 ...

  3. 如何破解极验滑动验证码?成功率 100%!

    注:已对文章中所涉及的敏感内容,如图片/文字/URL 进行脱敏处理. 什么是"极验"? 或许你没听说过极验[1],但你很大可能使用过极验的产品.极验是首家「行为式验证」安全技术服务 ...

  4. 爬虫模拟登录破解无原图滑动验证码

    模拟登录对象:博客园 验证码类型:无原图滑动验证码 使用工具与模块:python,selenium 浏览器:Chrome 大体思路:以前的滑动验证码多为有原图的验证码,可以通过Image模块截取两张不 ...

  5. python爬虫拖动验证码_python爬虫学习:验证码之滑动验证码

    前面两个文章提到了普通图片的验证码识别,且尤其对于机器学习的识别方式精度相对会比较高.但是,现在开始流行滑动验证码,所以这里作者提及一点简单的滑动验证码识别技巧. 打开火狐浏览器,按下 F12 ,输入 ...

  6. java验证码图片滑动验证码_图片滑动验证码的生成

    使用Java生成图片滑动验证码 image.png 目前接到了一个新的小需求,要在登录时进行滑动图片验证. 搜了一下网上的demo,没有太多很完整的demo.就参考各种文档自己拼凑了一个出来.整理一下 ...

  7. 使用webbrowser和win32api破解某宝滑动验证码

    如题,废话不多说直接上代码: # _*_coding:UTF-8_*_ ''' date: 2019.04.26/2019.04.30 author: Antrn crack tb slide-cap ...

  8. html 图片滑动验证码,selenium滑动验证码

    selenium验证滑条验证码时一直提示请重新滑动. python+selenium中验证码怎么定位 selenium验证码怎么进行自动化测试 selenium+python怎么模拟用户输入验证码登录 ...

  9. 前端验证码之-滑动验证码

    效果: 原理: 给控件设置一个原始背景色(即解锁前背景颜色),在上面覆盖一层绿色背景色区域(相对于原始背景定位),通过监听鼠标偏移量left来不断的设置绿色区域的宽度,当没有滚动到最大偏移量松开时回到 ...

最新文章

  1. JAVA匿名内部类的一点讨论
  2. 有关定时任务的表达式--cron 详细解
  3. UISwipeGestureRecognizer 左右事件捕捉
  4. Zookeeper分布式集群部署
  5. 阿里云rds for mysql平台介绍_阿里云RDS for MySQL 快速入门——笔记
  6. java 高性能缓存_高性能Java缓存----Caffeine
  7. 类的初始化和实例的初始化
  8. 疯狂开店! 华为不甘心只卖车 | 次世代车研所
  9. 【elasticsearch】Elasticsearch 空值处理实战
  10. python etree详解_使用lxml.etree解析python alexa结果
  11. VALSE学习(十八):复杂视频的深度高效分析与理解方法
  12. 微信小程序云开发教程-微信小程序的JS高级-全局数据读写
  13. Linux USB 鼠标驱动程序详解
  14. 计算机社团自评报告怎么写,社团自我评价
  15. 麻理工MIT的脑计划eyewire (顺便学习一下医学影像知识)
  16. 确定某天是星期几的c语言程序,计算某天是星期几【C代码】
  17. 张超 计算机 清华 论文,张超-清华大学航天航空学院
  18. 深入分析Android中Activity的onStop和onDestroy()回调延时及延时10s的问题
  19. pubg手机版服务器维护,pubg国际版服务器维护
  20. Rx第六部分 测试

热门文章

  1. 浅谈如何做一名优秀的WEB前端工程师
  2. Lucene之——搜索实例
  3. 【计算机网络】思科实验(8):网络地址转换之路由器动态NAT模拟
  4. 软件测试 查看网页打开时间,网页响应时间101(三)
  5. 河南专升本公共英语语法考点分析---代词、介词、连接词
  6. html腾讯视频组件,3.腾讯视频组件
  7. 【机器学习的高等数学基础】导数的几何意义和物理意义、函数的可导性与连续性之间的关系、平面曲线的切线和法线、基本导数与微分表、微分中值定理,泰勒公式、弧微分、曲率、曲率半径、洛必达法则、渐近线的求法等
  8. 基于Unity的软光栅实现(3):基于Job system的多核加速光栅化
  9. 代码文档生成工具Doxygen教程及实例
  10. 浅析肖特基二极管与开关二极管的不同之处