zoukankan      html  css  js  c++  java
  • selenium过豆瓣滑动验证码

    首先是加速度代码

    def get_tracks(distance):
        """
        拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
        匀变速运动基本公式:
        ①v = v0+at
        ②s = v0t+1/2at^2
        """
        #初速度
        v = 0
        #单位时间为0.3s来统计轨迹,轨迹即0.3内的位移
        t = 0.31
        #位置/轨迹列表,列表内的一个元素代表0.3s的位移
        tracks = []
        #当前位移
        current = 0
        #到达mid值开始减速
        mid = distance*4/5
        while current < distance:
            if current < mid:
                #加速度越小,单位时间内的位移越小,模拟的轨迹就越多越详细
                a = 2
            else:
                a = -3
    
            #初速度
            v0 = v
            #0.3秒内的位移
            s = v0*t+0.5*a*(t**2)
            #当前的位置
            current += s
            #添加到轨迹列表
            tracks.append(round(s))
            #速度已经到达v,该速度作为下次的初速度
            v = v0+a*t
        return tracks
    

    1.打开豆瓣官网,并且最大化

    browser = webdriver.Chrome(r'C:Program FilesGoogleChromeApplicationchromedriver.exe')
    browser.maximize_window()
    browser.get('https://www.douban.com/')
    打开然后最大化,因为有时候不最大化的话可能导致点击不到
    然后豆瓣是很多iframe框架组成的

    #2.切换到iframe子页面
    login_frame = browser.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
    browser.switch_to.frame(login_frame)#移动到iframe
    

    #3.密码登录+用户名+密码+登录豆瓣
    browser.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
    browser.find_element_by_id('username').send_keys('user')
    browser.find_element_by_id('password').send_keys('pass')
    browser.find_element_by_css_selector('.btn.btn-account').click()
    time.sleep(4)
    

    然后就是获取滑动验证码的iframe同上

    #4.切换到心得iframe子页面-滑块验证
    auth_frame = browser.find_element_by_id('tcaptcha_iframe')
    browser.switch_to.frame(auth_frame)
    

    获取拖放button

    #5.按住开始滑动位置按钮-先移动180个像素
    element = browser.find_element_by_xpath('//*[@id="tcaptcha_drag_thumb"]')
    ActionChains(browser).click_and_hold(on_element=element).perform()
    #move_to_element_with_offset().移动到距离某个元素左上角多少距离的位置
    ActionChains(browser).move_to_element_with_offset(to_element=element,xoffset=180,yoffset=0).perform()
    

    然后就是点击不放+释放

    #6.使用加速度函数移动剩下的距离
    tracks = get_tracks(25)
    for track in tracks:
        #开始移动move_by_offset()
        ActionChains(browser).move_by_offset(xoffset=track,yoffset=0).perform()
    
    #7.延迟释放鼠标:release()
    time.sleep(0.5)
    ActionChains(browser).release().perform()
    

    可能登录了几次就不行了,因为那边也有机器学习,所以微改加速度就可以了

    完整代码

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    import time
    
    def get_tracks(distance):
        """
        拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
        匀变速运动基本公式:
        ①v = v0+at
        ②s = v0t+1/2at^2
        """
        #初速度
        v = 0
        #单位时间为0.3s来统计轨迹,轨迹即0.3内的位移
        t = 0.31
        #位置/轨迹列表,列表内的一个元素代表0.3s的位移
        tracks = []
        #当前位移
        current = 0
        #到达mid值开始减速
        mid = distance*4/5
        while current < distance:
            if current < mid:
                #加速度越小,单位时间内的位移越小,模拟的轨迹就越多越详细
                a = 2
            else:
                a = -3
    
            #初速度
            v0 = v
            #0.3秒内的位移
            s = v0*t+0.5*a*(t**2)
            #当前的位置
            current += s
            #添加到轨迹列表
            tracks.append(round(s))
            #速度已经到达v,该速度作为下次的初速度
            v = v0+a*t
        return tracks
    
    #1.打开豆瓣官网,并且最大化
    browser = webdriver.Chrome(r'C:Program FilesGoogleChromeApplicationchromedriver.exe')
    browser.maximize_window()
    browser.get('https://www.douban.com/')
    
    #2.切换到iframe子页面
    login_frame = browser.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
    browser.switch_to.frame(login_frame)#移动到iframe
    
    #3.密码登录+用户名+密码+登录豆瓣
    browser.find_element_by_xpath('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
    browser.find_element_by_id('username').send_keys('你的账号')
    browser.find_element_by_id('password').send_keys('你的密码')
    browser.find_element_by_css_selector('.btn.btn-account').click()
    time.sleep(4)
    
    #4.切换到心得iframe子页面-滑块验证
    auth_frame = browser.find_element_by_id('tcaptcha_iframe')
    browser.switch_to.frame(auth_frame)
    
    #5.按住开始滑动位置按钮-先移动180个像素
    element = browser.find_element_by_xpath('//*[@id="tcaptcha_drag_thumb"]')
    ActionChains(browser).click_and_hold(on_element=element).perform()
    #move_to_element_with_offset().移动到距离某个元素左上角多少距离的位置
    ActionChains(browser).move_to_element_with_offset(to_element=element,xoffset=180,yoffset=0).perform()
    
    #6.使用加速度函数移动剩下的距离
    tracks = get_tracks(25)
    for track in tracks:
        #开始移动move_by_offset()
        ActionChains(browser).move_by_offset(xoffset=track,yoffset=0).perform()
    
    #7.延迟释放鼠标:release()
    time.sleep(0.5)
    ActionChains(browser).release().perform()
    
  • 相关阅读:
    Linux系统工程师必学的系统管理命令(1)
    学习中LINUX中常见问题(精华)
    "Visual Studio .NET已检测到指定的Web服务器运行的不是ASP.NET 1.1 版..."的解决办法
    今天,我决定离开
    Web Standards for Business 恐怕我没有时间翻译完了,有兴趣的可以继续
    了解到的关于深圳的一些事情
    谢谢大家,在深圳找到公司实习,发贴庆祝
    微软状告Google挖墙角,呵呵,微软坐不住了
    每个人都是生活的导演
    闷啊,一个人的孤单,一个人的所谓的项目
  • 原文地址:https://www.cnblogs.com/yicunyiye/p/13686118.html
Copyright © 2011-2022 走看看