文章目录

  • 解决滑块验证码思路:
  • 案例:豆瓣登录
    • 使用的技术:
    • 代码实现:
  • 更好的方式(常用)

解决滑块验证码思路:

  1. 找到滑块,按住鼠标
  2. 拖动滑块到指定位置
  3. 释放鼠标

案例:豆瓣登录

使用的技术:

(1)selenium+Chrome 浏览器完成自动登录
(2)使用 ActionChains 控制鼠标操作(鼠标按住—鼠标拖动—鼠标释放)
(3)使用物理知识(加速度)模拟人的拖动轨迹(先加速后减速)

代码实现:

步骤一:进入首页,点击密码登录

代码:

from selenium import webdriver# 调用浏览器
driver = webdriver.Chrome(executable_path=r'D:\chrome\chromedriver.exe')# 最大化窗口
driver.maximize_window()# 请求
driver.get(url='https://www.douban.com/')# 点击密码登录
driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()

出现问题:没有点击到密码登录,而是点击了电影

分析可能的原因:

  1. 页面没有加载完成就点击,可以通过time模块休眠排除
  2. xpath的路径指定到了电影,路径有问题,仔细检查可排除
  3. 是因为iframe标签:在主页面中嵌套一个子页面

解决问题:
经排除,是因为上述的原因3导致
切入到子页面中:switch_to.frame(0) 切入到iframe中
0代表第一个iframe标签

driver.switch_to.frame(0)
driver.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()

步骤二:输入信息,点击登录

代码:

# 查找并输入账号
driver.find_element_by_id('username').send_keys('18524158889')
# 查找并输入密码
driver.find_element_by_id('password').send_keys('11111111')
# 查找并点击登录
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]').click()

步骤三:出现滑块验证码,移动滑块到指定位置,完成登录

(一) 获取滑块

huakuai = driver.find_element_by_id('tcaptcha_drag_thumb')
print(huakuai)

出现问题:没有找到元素

  1. 可能是程序运行太快,滑块还没有加载完就开始查找,所以,休眠一会儿
  2. id可能有问题
  3. 可能是有iframe标签

解决问题:依旧是子页面问题

# 切入到第2个iframe标签中
driver.switch_to.frame(1)
# 再查找滑块
huakuai = driver.find_element_by_id('tcaptcha_drag_thumb')

(二) 找到滑块后,需要按住并保持不动

此时需要使用 ActionChains 动作链模块

相关方法 描述
click_and_hold() 点击并保持点击状态
on_element 将此状态加载到哪一个元素身上
perform() 执行动作
move_by_offset() 移动
xoffset 横向移动距离
yoffset 纵向移动距离
release() 释放鼠标
ActionChains(driver).click_and_hold(on_element=huakuai).perform()

(三)拖动滑块

ActionChains(driver).move_by_offset(xoffset=76,yoffset=0).perform()

(四)释放鼠标

ActionChains(driver).release().perform()

出现问题:网络恍惚了一下,请重试

原因:识别出是机器人了

解决问题:需要将连续行的移动,转换成间断性的移动,完全模拟出人类的移动操作
先匀加速,再匀减速
涉及物理知识:a(加速度)

定义获取运动轨迹函数

def get_tracks(distance):"""v = v0+atx = v0t+1/2at**2"""# 定义存放运动轨迹的列表tracks = []# 定义初速度v = 0# 定义单位时间t = 0.5# 定义匀加速运动和匀减速运动的分界线mid = distance * 4/5# 定义当前位移current = 0# 为了一直移动,定义循环while current < distance:if mid > current:a = 2else:a = -3v0 = v# 计算位移x = v0 * t + 1/2*a*t**2# 计算滑块当前位移current += x# 计算末速度v = v0+a*ttracks.append(round(x))return trackstracks = get_tracks(176)
print(tracks)
for track in tracks:ActionChains(driver).move_by_offset(xoffset=track,yoffset=0).perform()time.sleep(1)

最后在释放鼠标,完成登录

# 释放鼠标
ActionChains(driver).release().perform()

更好的方式(常用)

上述方式只是我们人为的设置滑块移动距离,而实际上每一个滑块移动的距离都是不同的,差距也比较大,所以,不能够写一个固定的移动距离

思路:将移动距离计算出来

核心

  1. 找出无缺口的图片
  2. 使用有缺口的图片和无缺口的图片做对比
    目的:获取移动的距离(确定缺口位置)

步骤一:截取整个页面以获取有缺口图片

driver.save_screenshot('quekou.png')

步骤二:局部截图,截取有缺口的验证码图片

# 找到图片
element = driver.find_element_by_xpath('//div[@class="geetest_canvas_img geetest_absolute"]')# 获取图片位置
# 计算截图范围
left = element.location['x']  # loaction:获取元素位置
right = element.location['x'] + element.size['width']  # size:获取元素大小
top = element.location['y']
bottom = element.location['y'] + element.size['height']# 打开图片
im = Image.open('quekou.png')
# 开始局部截图
im = im.crop((left+60,top+10,right,bottom))
im.save('quekou_jubu.png')

步骤三:执行JS,获取无缺口图片

driver.execute_script('document.getElementsByClassName("geetest_canvas_fullbg")[0].style="display:block"')# 截取无缺口图片
driver.save_screenshot('wuque.png')im = Image.open('wuque.png')
# 开始局部截图
im = im.crop((left+60,top+10,right,bottom))
im.save('wuque_jubu.png')

步骤四:将两张图片进行对比,计算移动距离

wuque_jubu = Image.open('wuque_jubu.png')
quekou_jubu = Image.open('quekou_jubu.png')
distance = get_difference(wuque_jubu,quekou_jubu)# 定义计算移动距离的函数
def get_difference(image1,image2):"""循环每一个点,计算出对应的像素值"""# 外层循环循环长度for i in range(image1.width):# 内层循环循环宽度for j in range(image1.height):# 找出缺口if not is_similar(image1,image2,i,j):return i  # 此时的i即为缺口距离# 定义找出缺口位置的函数
def is_similar(image1,image2,x,y):# 计算RGB值pixel1 = image1.getpixel((x,y))pixel2 = image2.getpixel((x,y))# 设置一个容差范围,设置30位容差范围if abs(pixel1[0] - pixel2[0]) >30 and abs(pixel1[1] - pixel2[1]) > 30 and abs(pixel1[2] - pixel2[2])>30:return Falsereturn True

Python(爬虫篇)--- 验证码破解【二】滑块验证码相关推荐

  1. Python使用selenium过天眼查滑块验证码反爬实现模拟登录

    Python使用selenium过天眼查滑块验证码反爬实现模拟登录 天眼查的滑块验证码样式 一顿操作到滑块验证码阶段 破解滑块验证码 结束 天眼查的滑块验证码样式 在输入账号和密码后会发现这个令人讨厌 ...

  2. 网易云音乐python爬虫(Js破解)

    网易云音乐下载python爬虫(Js破解) 最近做了一个网易云音乐下载的python爬虫,功能就是输入歌曲的名字,程序自动下载网易音乐搜索界面的第一首歌(一般都是原唱排第一位).本文很适合小白学习,写 ...

  3. 电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分

    电影天堂APP项目开发之Python爬虫篇,共18课时/5时33分,是电影天堂APP项目开发课程的第一篇章,讲解使用requests和bs4库,爬取和解析电影天堂网站数据,并讲数据保存到SQLite数 ...

  4. Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影

    文章目录 前言 安装bs4库 网站分析 获取页面 爬取页面 页面分析 其他页面 爬虫系列 前言 经过上篇博客Python爬虫小白教程(一)-- 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在 ...

  5. 作为一只Python爬虫:如何破解滑动验证码

    做爬虫总会遇到各种各样的反爬限制,反爬的第一道防线往往在登录就出现了,为了限制爬虫自动登录,各家使出了浑身解数,所谓道高一尺魔高一丈. 今天分享个如何简单处理滑动图片的验证码的案例. 类似这种拖动滑块 ...

  6. 用Python 爬虫,如何破解谷歌验证码?

    ReCAPTCHA 介绍 可能大家还没听说过什么是 ReCAPTCHA,可能由于某些原因,这个验证码在国内出现不多,不过想必大家应该多多少少见过或用过.它长这个样子: 这时候,只要我们点击最前面的复选 ...

  7. Python爬虫实战 | (16) 破解简书登录点触验证码

    在本篇博客中,我们将使用selenium模拟登录简书网站,破解其登陆时的滑动验证码. 我们需要使用验证码识别服务平台.超级鹰,来帮助我们破解点触验证码.下面的chaojiying.py文件用于调用超级 ...

  8. 如何使用 JS 破解轻量级滑块验证码

    今天在这篇文章里给大家介绍一下怎么使用 JS 破解滑块验证码. 文章末尾有源码链接,需要的朋友可以自取,不过拿走之前记得三连哇! 思路讲解 操作浏览器打开页面 滑块验证码是滑动验证码的一种,生成流程至 ...

  9. 爬虫之极验验证码破解-滑动拼图验证码破解

    滑动拼图验证码破解 前言 步骤分析 第一步,获取原图 第二步 拼接图片 第三步 计算豁口所在位置 第四步 计算拖动距离 模拟拖动 其他 前言 滑动验证码已经流行很多年了,我们在这里尝试一下如何实现滑动 ...

  10. Python爬虫学习(十一)下载验证码图片

    本文是继前面爬取登录教务系统时,遇到验证码登录的遗留问题探讨! 思路: 下载登录教务系统时的图片,打开读取,人工识别,手动写入再结合账户登录. 目录 一.获取验证码图片 二.带验证码图片的reques ...

最新文章

  1. mysql有那些存储引擎_MySQL有那哪些存储引擎
  2. Android 中ContentProvider和Uri详解
  3. 从一个页面跳转到用swiper写的全屏滚动页面的指定位置
  4. c#随机数生成编号_使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)...
  5. ant system property
  6. MongoDB学习路线
  7. django定时任务
  8. Protobuf动态解析那些事儿
  9. 利用拉普拉斯滤波器提取图像边缘,实现图像锐化
  10. java jvm内存模型_Java(JVM)内存模型– Java中的内存管理
  11. 最新的.net书籍教程 更新时间:2005-9-5
  12. linux bzip指定名称,Linux基础命令---bzip2
  13. 04、docker端口映射的原理及配置方法
  14. SEO人员:如何预估SEO投资回报率?
  15. word怎么竖向选中,word怎么文字竖排的两种方法
  16. 用vc++穷举windows应用程序密码(上)
  17. Excel高级功能 数据工具
  18. 关于联想小新16pro无网络问题_雪雪专享篇(安装网卡驱动篇)
  19. c语言间隔符号的作用,C语言教学(二)常见的符号
  20. 怎么给word插入页码,详细图文教学,轻松学会

热门文章

  1. 黑马程序员——面试题之银行业务调度系统
  2. 个人收藏机器学习教程
  3. 润乾报表-单元格函数
  4. 12 序列化器Serializer的使用
  5. 对抗神经网络(Adversarial Nets)的介绍[1]
  6. 为什么越来越多的企业选择使用aps生产排产软件?
  7. 基于虚拟仿真技术的数字化工厂管理系统
  8. Weblogic安装时闪退问题
  9. [论文阅读笔记29]生物医学文本摘要(Biomedical Text Summarization)
  10. 范德蒙(Vander Monde)行列式的计算与应用