当前位置:   article > 正文

【Python_Selenium学习笔记(八)】基于Selenium模块实现滑块验证码破解_python selenium 滑动验证

python selenium 滑动验证

前言

有些网站页面会在 访问时进行滑块验证,针对此问题,此篇文章中会介绍如何基于 Selenium 模块实现滑块验证码的破解 ,并以模拟登录豆瓣网,破解其滑块验证码 为例进行讲解。

正文

1、滑块验证码破解原理

使用 Selenium 模块 完全模拟人的行为,按住滑块,移动到缺口位置。

2、滑块验证码破解步骤

  1. 先将滑块一次性快速移动到某一位置,再滑块位置到缺口位置的距离划分为五份等距离
  2. 前4/5的距离快速滑动
  3. 后1/5的距离先匀加速移动,再匀减速移动,最终到达缺口位置
    注意:以上步骤完全模拟人的行为,如果滑动过快会被网站认定为爬虫程序

3、滑块验证码破解-加速度函数

针对步骤2、3中的前4/5的距离快速滑动,后1/5的距离先匀加速移动,再匀减速移动,最终到达缺口位置,需要一个加速度函数来实现此功能

# 加速度函数
def get_tracks(distance):
    """
    拿到移动轨迹,模拟人的滑动行为,先匀加速后匀减速
    匀变速运动基本公式:
    1.v=v₀+at
    2.s=v₀t+1/2*at²
    :param distance:滑块一次性快速移动到某一位置后剩下的距离,进行五等分
    :return:位置/轨迹列表,列表内的一个元素代表0.3s的位移
    """
    v = 0  # 初速度
    t = 0.3  # 单位时间为0.3s来统计轨迹,轨迹即0.3内的位移
    tracks = []  # 位置/轨迹列表,列表内的一个元素代表0.3s的位移
    current = 0  # 当前的位移
    mid = distance * 4 / 5  # 到达mid值开始减速,前4/5匀加速,后1/5匀减速
    while current < distance:
        if current < mid:  # 加速度越小,单位时间内的位移越小,模拟的轨迹就越多越详细
            a = 2
        else:
            a = -3
        v0 = v  # 初速度
        s = v0 * t + 0.5 * a * (t ** 2)  # 0.3s内的位移
        current += s  # 当前的位置
        tracks.append(round(s))  # 添加到轨迹列表
        v = v0 + a * t  # 速度已经达到v,该速度作为下次的初速度
    return tracks  # tracks:[第1个0.3s的移动距离,第2个0.3s的移动距离,......]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

4、滑块验证码破解案例

  1. 案例需求:豆瓣网登录界面输入用户名密码后,进入滑块验证界面后使用 Selenium+Chrome 进行节点的定位并进行移动。

  2. url地址:https://www.douban.com/

  3. 如何进入滑块验证界面可参考:【Python_Selenium学习笔记(七)】基于Selenium模块实现切换frame

  4. 切换到滑块验证iframe子页面:'//*[@id="tcaptcha_iframe_dy"]'在这里插入图片描述

  5. 按住开始滑动位置按钮 - 先移动180个像素:

    start_node = driver.find_element(By.XPATH, '//*[@id="tcOperation"]/div[6]')
    ActionChains(driver).click_and_hold(on_element=start_node).perform()  # 点击并按住
    ActionChains(driver).move_to_element_with_offset(to_element=start_node, xoffset=145,
                                                     yoffset=0).perform()  # 移动到距离某一节点多少距离的位置
    time.sleep(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
  6. 使用加速度函数移动剩下的距离:

    tracks = get_tracks(45)
    for track in tracks:
        ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()
        # move_by_offset:鼠标从当前位置移动多少的距离
    
    • 1
    • 2
    • 3
    • 4
  7. 延迟释放鼠标:release()

    time.sleep(1)
    ActionChains(driver).release().perform()
    
    • 1
    • 2
  8. 完整代码:

    import time
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.by import By
    
    
    # 加速度函数
    def get_tracks(distance):
        """
        拿到移动轨迹,模拟人的滑动行为,先匀加速后匀减速
        匀变速运动基本公式:
        1.v=v₀+at
        2.s=v₀t+1/2*at²
        :param distance:滑块一次性快速移动到某一位置后剩下的距离,进行五等分
        :return:位置/轨迹列表,列表内的一个元素代表0.3s的位移
        """
        v = 0  # 初速度
        t = 0.3  # 单位时间为0.3s来统计轨迹,轨迹即0.3内的位移
        tracks = []  # 位置/轨迹列表,列表内的一个元素代表0.3s的位移
        current = 0  # 当前的位移
        mid = distance * 4 / 5  # 到达mid值开始减速,前4/5匀加速,后1/5匀减速
        while current < distance:
            if current < mid:  # 加速度越小,单位时间内的位移越小,模拟的轨迹就越多越详细
                a = 2
            else:
                a = -3
            v0 = v  # 初速度
            s = v0 * t + 0.5 * a * (t ** 2)  # 0.3s内的位移
            current += s  # 当前的位置
            tracks.append(round(s))  # 添加到轨迹列表
            v = v0 + a * t  # 速度已经达到v,该速度作为下次的初速度
        return tracks  # tracks:[第1个0.3s的移动距离,第2个0.3s的移动距离,......]
    
    
    driver = webdriver.Chrome()  # 创建浏览器对象
    driver.get(url="https://www.douban.com/")
    
    # 1、先切换到 iframe子页面
    iframe_node = driver.find_element(By.XPATH, '//*[@id="anony-reg-new"]/div/div[1]/iframe')
    # //*[@id="anony-reg-new"]/div/div[1]/iframe
    driver.switch_to.frame(iframe_node)  # 切换到 iframe子页面
    # /html/body/div[1]
    # 2、找到密码登录 并点击
    driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/ul[1]/li[2]').click()
    
    # 3、找到找到手机号/邮箱、密码的输入框,和登录豆瓣按键
    username = driver.find_element(By.XPATH, '//*[@id="username"]')
    username.send_keys("13885124596")
    
    password = driver.find_element(By.XPATH, '//*[@id="password"]')
    password.send_keys("123456")
    
    driver.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[1]/div[5]/a').click()
    time.sleep(1)
    # 4、切换到新的iframe子页面-滑块验证
    verify_iframe = driver.find_element(By.XPATH, '//*[@id="tcaptcha_iframe_dy"]')
    # //*[@id="tcaptcha_iframe_dy"]
    driver.switch_to.frame(verify_iframe)
    # 5、按住开始滑动位置按钮 - 先移动180个像素
    start_node = driver.find_element(By.XPATH, '//*[@id="tcOperation"]/div[6]')
    ActionChains(driver).click_and_hold(on_element=start_node).perform()  # 点击并按住
    ActionChains(driver).move_to_element_with_offset(to_element=start_node, xoffset=145,
                                                     yoffset=0).perform()  # 移动到距离某一节点多少距离的位置
    time.sleep(1)
    # 6、使用加速度函数移动剩下的距离
    tracks = get_tracks(45)
    for track in tracks:
        ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()
        # move_by_offset:鼠标从当前位置移动多少的距离
    # 7、延迟释放鼠标:release()
    time.sleep(1)
    ActionChains(driver).release().perform()
    time.sleep(1)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
  9. 实现效果
    在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/440718
推荐阅读
相关标签
  

闽ICP备14008679号