Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >爬虫入门经典(十八) | 滑动验证码识别

爬虫入门经典(十八) | 滑动验证码识别

作者头像
不温卜火
发布于 2020-11-12 02:27:23
发布于 2020-11-12 02:27:23
86100
代码可运行
举报
文章被收录于专栏:不温卜火不温卜火
运行总次数:0
代码可运行

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/

推荐

  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥

一、小小课堂

在上篇博文中已经完成了破解文字验证码,接下来我们完成滑动验证码,在此以豆瓣登录验证为例。

滑块验证的步骤,其实上一篇博文已经讲解了,不知道各位同学有没有印象,如果没有也没有关系,下面博主会在此写出步骤:

步骤: (1)计算滑动距离 (2)模拟人滑动(总体思路是先快再慢)

下面我们先来看下豆瓣登录界面

这个时候我们通过输错密码的方法,使其出现验证码。

多滑动和刷新几次,发现一些规律,y轴不变,x轴在变化,豆瓣这个滑动验证码,x轴距离大概207左右,如果需要精确测量,需要使用像素对比。

接来下通过selenium找到滑块,移动就行了,但是有一个问题,如果直接(x1,y1)移动到(x2,y2),相当于瞬移的效果,时间非常短,可能会被对方检测到。

接下来需要使用模拟真实人的点击滑动轨迹,一般是先加速再加速,假设是匀加速和匀减速。 滑动之后,如果不通过,可以刷新按钮,再进行滑动,直到通过(因为通过后一般页面开始跳转title不同或找其他的对比找到不同)

二、模拟匀加速和匀减速

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_tracks(distance, rate=0.6, t=0.2, v=0):
    """
    将distance分割成小段的距离
    :param distance: 总距离
    :param rate: 加速减速的临界比例
    :param a1: 加速度
    :param a2: 减速度
    :param t: 单位时间
    :param t: 初始速度
    :return: 小段的距离集合
    """
    tracks = []
    # 加速减速的临界值
    mid = rate * distance
    # 当前位移
    s = 0
    # 循环
    while s < distance:
        # 初始速度
        v0 = v
        if s < mid:
            a = 20
        else:
            a = -3
        # 计算当前t时间段走的距离
        s0 = v0 * t + 0.5 * a * t * t
        # 计算当前速度
        v = v0 + a * t
        # 四舍五入距离,因为像素没有小数
        tracks.append(round(s0))
        # 计算当前距离
        s += s0

    return tracks

if __name__ == '__main__':
    tracks = get_tracks(100)
    print(tracks)
    print(sum(tracks))

下面我们来看下运行结果:

我们可以看到已经完成了模拟匀加速与匀减速的操作。

三、分析登录页面

首先通过URL,我们找到了https://accounts.douban.com/passport/login

打开之后的页面如下:

下面我们先来看下正常人是怎样登录豆瓣的。

?,下面我们就开始分析页面,通过selenium完成这些操作。

3.1 分析网页结构

  • 1. 密码登录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]
  • 2.用户账号
  • 3.用户密码
  • 4. 登录豆瓣
  • 5. 找到滑块
  • 刷新按钮

分析完成,下面就开始代码实现了

3.2 代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url = "https://accounts.douban.com/passport/login"
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
driver.get(url)
print("当前的title:",driver.title)

driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
driver.find_element_by_xpath('//*[@id="username"]').send_keys("账号")
driver.find_element_by_xpath('//*[@id="password"]').send_keys("密码")
driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
# 停一下,等待出现
time.sleep(2)

# 切换iframe
driver.switch_to.frame(1)
block = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')
reload = driver.find_element_by_xpath('//*[@id="reload"]')

# 滑动操作时需要动作链
# 摁下滑块
ActionChains(driver).click_and_hold(block).perform()
# 移动
ActionChains(driver).move_by_offset(180, 0).perform()
# 获取位移
tracks = get_tracks(30)
# 循环
for track in tracks:
    # 移动
    ActionChains(driver).move_by_offset(track, 0).perform()
# 释放
ActionChains(driver).release().perform()
# 判断
if driver.title == "登录豆瓣":
    print("失败...再来一次...")
    # 单击刷新按钮刷新
    reload.click()
    # 停一下
    time.sleep(2)
else:
    print("成功!")

time.sleep(5)
driver.quit()

3.3 登录过程测试

四、完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-10 14:41
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 豆瓣登录.py
  @Version:1.0
  
'''
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains


def get_tracks(distance, rate=0.6, t=0.2, v=0):
    """
    将distance分割成小段的距离
    :param distance: 总距离
    :param rate: 加速减速的临界比例
    :param a1: 加速度
    :param a2: 减速度
    :param t: 单位时间
    :param t: 初始速度
    :return: 小段的距离集合
    """
    tracks = []
    # 加速减速的临界值
    mid = rate * distance
    # 当前位移
    s = 0
    # 循环
    while s < distance:
        # 初始速度
        v0 = v
        if s < mid:
            a = 20
        else:
            a = -3
        # 计算当前t时间段走的距离
        s0 = v0 * t + 0.5 * a * t * t
        # 计算当前速度
        v = v0 + a * t
        # 四舍五入距离,因为像素没有小数
        tracks.append(round(s0))
        # 计算当前距离
        s += s0

    return tracks


def slide(driver):
    """滑动验证码"""
    # 切换iframe
    driver.switch_to.frame(1)
    #找到滑块
    block = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')
    #找到刷新
    reload = driver.find_element_by_xpath('//*[@id="reload"]')
    while True:
        # 摁下滑块
        ActionChains(driver).click_and_hold(block).perform()
        # 移动
        ActionChains(driver).move_by_offset(180, 0).perform()
        #获取位移
        tracks = get_tracks(30)
        #循环
        for track in tracks:
            #移动
            ActionChains(driver).move_by_offset(track, 0).perform()
        # 释放
        ActionChains(driver).release().perform()
        #停一下
        time.sleep(2)
        #判断
        if driver.title == "登录豆瓣":
            print("失败...再来一次...")
            #单击刷新按钮刷新
            reload.click()
            # 停一下
            time.sleep(2)
        else:
            break

def main():
    """主程序"""
    url = "https://accounts.douban.com/passport/login"
    driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
    driver.get(url)
    driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
    driver.find_element_by_xpath('//*[@id="username"]').send_keys("账号")
    driver.find_element_by_xpath('//*[@id="password"]').send_keys("密码")
    driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
    # 停一下,等待出现
    time.sleep(2)
    #滑动验证码
    slide(driver)

    print("成功")
    driver.quit()


if __name__ == '__main__':
    main()

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。   如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。   码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
爬虫项目:破解极验滑动验证码
一 介绍     一些网站会在正常的账号密码认证之外加一些验证码,以此来明确地区分人/机行为,从一定程度上达到反爬的效果,对于简单的校验码Tesserocr就可以搞定,如下     但一些网站加入了滑
用户1214487
2018/01/24
5.5K0
爬虫项目:破解极验滑动验证码
Python 破解极验滑动验证码
以上图片是最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/。
测试开发社区
2019/09/20
2.7K0
Python 破解极验滑动验证码
【原创】Python 极验滑块验证
可以很明显的看出来是极验3代验证,借助之前写阿里云盾的经验使用selenium+pyautoui先测试一下,详细可参考:阿里云盾滑块验证
拉灯的小手
2022/05/09
1.8K0
【原创】Python 极验滑块验证
Python爬虫入门教程 59-100 python爬虫高级技术之验证码篇5-极验证识别技术之二
昨天的博客已经将图片存储到了本地,今天要做的第一件事情,就是需要在两张图片中进行比对,将图片缺口定位出来
梦想橡皮擦
2019/04/23
7990
Python爬虫入门教程 59-100 python爬虫高级技术之验证码篇5-极验证识别技术之二
[428]极验验证码识别
很多网站的登陆都有验证码一项,而极验的方案就是应用的非常普遍。更多的场景是在反爬虫的对抗中,极客验证码更是首选。本次目标则是用程序来识别并通过极验验证码的验证。本次使用的是Python库是selenium库,Chrome浏览器,并配置好ChromeDriver。极验验证码官网为:https://auth.geetest.com/login/。它是一个专注于提供验证安全的系统,主要验证方式是拖动滑块拼合图像。若图像完全拼合,则验证成功,即表单成功提交,否则需要重新验证,如图所示:
周小董
2022/04/13
1.9K0
[428]极验验证码识别
基于selenium自动化的滑动验证码破解
截图,分别截图,完整的时候截一次图(截图全屏),不用管是否乱序,获取图片的坐标,将截图再次按照坐标截图处理,这样就能获得完整的图和有缺口的图。
andrew_a
2019/07/30
1.7K0
基于selenium自动化的滑动验证码破解
python + selenium 爬虫模拟登录破解无原图滑动验证码
爬虫模拟登录破解无原图滑动验证码: https://www.cnblogs.com/98WDJ/p/11050559.html
forxtz
2020/10/10
2.4K0
python + selenium 爬虫模拟登录破解无原图滑动验证码
Python之极验滑动验证码的识别(教程+案例)
1 滑动验证码的识别介绍 本节目标:用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作:本次案例我们使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 了解极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/ 验证方式为拖动滑块拼合图像,若图像完全拼合,则验证成功,否则需要重新验证,如图所示: image.png 接下来
Python知识大全
2020/02/13
3.4K3
Python之极验滑动验证码的识别(教程+案例)
新版滑动验证码
今天的主角是滑动验证码,现在有很多网站使用了极验验证码来智能反爬虫,其中有一种是滑动验证码,具体来说就是拖动滑块来拼合图像,若图像完全拼合,则验证成功。下图是B站的登录验证码,便是采用了极验的滑动验证码,一起来看看如何破解吧!
老肥码码码
2020/01/17
4.8K0
新版滑动验证码
自动滑块验证码识别_滑块验证码原理
有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展。而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所有网站的注册页面都会用到验证码技术。其实验证码的英文为 CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),翻译成中文就是全自动区分计算机和人类的公开图灵测试,它是一种可以区分用户是计算机还是人的测试,只要能通过 CAPTCHA 测试,该用户就可以被认为是人类。由此也可知道激活成功教程滑块验证码的关键即是让计算机更好的模拟人的行为,这也是激活成功教程的难点所在。(注:本文18年所作,仅作参考)
全栈程序员站长
2022/11/18
3.8K0
自动滑块验证码识别_滑块验证码原理
爬虫模拟登录破解无原图滑动验证码
大体思路:以前的滑动验证码多为有原图的验证码,可以通过Image模块截取两张不同的图,通过对比像素得出移动的距离,无原图验证码也是基于这个原理,只是多了一步找出原图,该操作可以通过driver.execute_script()添加JS代码,改变display显示获得原图,然后就变成了有原图的滑动验证码的操作流程。
forxtz
2020/10/10
2.5K0
爬虫模拟登录破解无原图滑动验证码
python滑动验证码_python编程是啥
程序功能:程序模仿登入京东主页,自动输入帐号和密码,完成滑块验证,最后领取每日签京豆
全栈程序员站长
2022/09/27
4540
b站这样的滑动验证码,用Python照样自动识别
大家应该都很熟悉 点击滑块然后移动到图片缺口进行验证 现在越来越多的网站使用这样的验证方式 为的是增加验证码识别的难度 那么 对于这种验证码 应该怎么破呢 接下来就是 打开 b 站的登录页面 http
一墨编程学习
2019/05/10
2.8K0
b站这样的滑动验证码,用Python照样自动识别
爬虫进阶教程:极验(GEETEST)验证码破解教程
原文链接及原作者:爬虫进阶教程:极验(GEETEST)验证码破解教程 | Jack Cui
圆方圆PYTHON学院
2018/12/24
7.3K0
爬虫进阶教程:极验(GEETEST)验证码破解教程
python 爬虫之验证码
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
云雀叫了一整天
2019/09/29
8360
selenium 模拟滑块验证码
slider-captcha/slider_captcha.py at master · maxnoodles/slider-captcha (github.com)
卓越笔记
2023/02/22
1.3K0
爬虫selenium中动作链接ActionChains
一.基本语法 生成一个动作actions=ActionChains(driver) 动作添加方法actions.方法 执行 actions.perform() 二.方法列表 click(on_element=None) ——单击鼠标左键 click_and_hold(on_element=None) ——点击鼠标左键,不松开 context_click(on_element=None) ——点击鼠标右键 double_click(on_element=None) ——双击鼠标左键 drag_and_drop
小小咸鱼YwY
2020/06/19
8300
python入门教程 - 滑块实战
GIF效果:https://tva2.sinaimg.cn/large/007F3CC8ly1h0ku3yh9g5g31ex0pfwus.gif
JavaPub
2022/03/25
4710
python入门教程 - 滑块实战
爬虫模拟移动
爬虫的一大难点就是破解验证码。验证码大致上分为文字识别、滑动、文字点击、图像识别等,本文讲的是其中的 滑动验证码
花落花相惜
2021/12/04
4970
爬虫入门经典(十九) | 难度提升,破解极验验证码
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥
不温卜火
2020/11/24
1.3K0
爬虫入门经典(十九) | 难度提升,破解极验验证码
相关推荐
爬虫项目:破解极验滑动验证码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验