• 识别豆瓣登录滑动验证码(附源码)


    养成好习惯:文中文末小广告帮忙点一点

    目录

    • 推荐

    • 一、小小课堂

    • 二、模拟匀加速和匀减速

    • 三、分析登录页面

      • 3.1 分析网页结构

      • 3.2 代码实现

      • 3.3 登录过程测试

    • 四、完整代码

    一、小小课堂

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

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

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

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

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

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

    二、模拟匀加速和匀减速

    代码实现:

    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. 密码登录

    //*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]
    

    2.用户账号

     3.用户密码

    4. 登录豆瓣

     5. 找到滑块

    刷新按钮

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

    3.2 代码实现

    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 登录过程测试

    四、完整代码

    # encoding: utf-8
    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()
    
    
    

    正文结束!!!!

    欢迎关注公众号:Python爬虫数据分析挖掘,方便及时阅读最新文章

    记录学习python的点点滴滴;

    回复【开源源码】免费获取更多开源项目源码;

    公众号每日更新python知识和【免费】工具;

    本文已同步到【开源中国】、【腾讯云社区】、【CSDN】;

    文章源:buwenbuhuo.blog.csdn.net/

    耐得住寂寞,才能登得顶
    Gitee码云:https://gitee.com/lyc96/projects
  • 相关阅读:
    Composition API
    Vue通讯
    pc-H5 适配方案
    Mac Chrome浏览器跨域指令快速启动应用创建,避免每次在终端输入指令
    datatables 添加title属性
    元素的显示与隐藏
    【前端】跨浏览器事件处理程序EventUtil.js个人注释及详解
    【前端】javascript+jQuery实现旋转木马效果轮播图slider
    【前端】javascript+jquery实现手风琴式的滚动banner或产品展示图
    【前端】javascript实现带有子菜单和控件的轮播图slider
  • 原文地址:https://www.cnblogs.com/chenlove/p/14038543.html
Copyright © 2020-2023  润新知