精华内容
下载资源
问答
  • 转载:selenium变速移动验证码滑块 '''先加速后减速''' from selenium.webdriver import ActionChains from selenium import webdriver import time driver=webdriver.Chrome() driver.get(...

    转载:selenium变速移动验证码滑块

    '''先加速后减速'''
    from selenium.webdriver import ActionChains
    from selenium import webdriver
    import time
    
    driver=webdriver.Chrome()
    driver.get("https://www.qichacha.com/user_login")
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="normalLogin"]').click()
    time.sleep(1)
    huakuai=driver.find_element_by_xpath('//*[@id="nc_1_n1z"]')
    def get_track(distance):      # distance为传入的总距离
        # 移动轨迹
        track=[]
        # 当前位移
        current=0
        # 减速阈值
        mid=distance*4/5
        # 计算间隔
        t=0.2
        # 初速度
        v=0
    
        while current<distance:
            if current<mid:
                # 加速度为2
                a=2
            else:
                # 加速度为-2
                a=-3
            v0=v
            # 当前速度
            v=v0+a*t
            # 移动距离
            move=v0*t+1/2*a*t*t
            # 当前位移
            current+=move
            # 加入轨迹
            track.append(round(move))
        return track
        def move_to_gap(slider,tracks):     # slider是要移动的滑块,tracks是要传入的移动轨迹
        ActionChains(driver).click_and_hold(slider).perform()
        for x in tracks:
            ActionChains(driver).move_by_offset(xoffset=x,yoffset=0).perform()
        time.sleep(0.5)
        ActionChains(driver).release().perform()
    
    if __name__ == '__main__':
        move_to_gap(huakuai,get_track(340))

     

    展开全文
  • Selenium变速移动验证码滑块 ‘’‘先加速后减速’’’ from selenium.webdriver import ActionChains from selenium import webdriver import time driver=webdriver.Chrome() driver.get(...

    Selenium变速移动验证码滑块

    ‘’‘先加速后减速’’’
    from selenium.webdriver import ActionChains
    from selenium import webdriver
    import time

    driver=webdriver.Chrome()
    driver.get(“https://www.qichacha.com/user_login”)
    time.sleep(1)
    driver.find_element_by_xpath(’//[@id=“normalLogin”]’).click()
    time.sleep(1)
    huakuai=driver.find_element_by_xpath(’//
    [@id=“nc_1_n1z”]’)

    def get_track(distance): # distance为传入的总距离
    # 移动轨迹
    track=[]
    # 当前位移
    current=0
    # 减速阈值
    mid=distance*4/5
    # 计算间隔
    t=0.2
    # 初速度
    v=0

    while current<distance:
        if current<mid:
            # 加速度为2
            a=2
        else:
            # 加速度为-2
            a=-3
        v0=v
        # 当前速度
        v=v0+a*t
        # 移动距离
        move=v0*t+1/2*a*t*t
        # 当前位移
        current+=move
        # 加入轨迹
        track.append(round(move))
    return track
    

    def move_to_gap(slider,tracks): # slider是要移动的滑块,tracks是要传入的移动轨迹
    ActionChains(driver).click_and_hold(slider).perform()
    for x in tracks:
    ActionChains(driver).move_by_offset(xoffset=x,yoffset=0).perform()
    time.sleep(0.5)
    ActionChains(driver).release().perform()

    if name == ‘main’:
    move_to_gap(huakuai,get_track(340))

    展开全文
  • [Python自动化]selenium验证码识别

    千次阅读 热门讨论 2021-08-25 15:32:24
    文章主要介绍了selenium自动化环境下,验证码识别系列问题。

    这一专栏,将以目的为导向,以简化或自动化完成工作任务为目标,将Python运用于实践中,解决实际问题,以激发读者对这门脚本语言的学习兴趣。在开始Python自动化相关实战的学习前,建议对 Python语言本身 以及 Python 爬虫 的相关知识展开一定的学习与了解。对此博客已开设相关专栏,可直达。


    往期内容提要:


    “验证码的识别”无论是在网络爬虫,还是自动化领域,都是无法绕开的话题。此前作者曾在 [Python爬虫] 九、机器视觉与机器图像识别之Tesseract 一文中,对验证码的识别进行过初步介绍。在 教务管理系统:成绩、课表查询接口设计及抢课、监控功能实现 一文中,对图形验证码的识别进行了实战展示。在这一篇文章中,将对验证码的识别作出一个相对系统的概括与总结。

    一般而言,在自动化工作中,如遇到验证码问题,我们一般通过三个方式解决。其一,手动解决;其二, 打码平台解决;三,代码解决。

    针对第一种方法,如在入门篇【Python自动化】 selenium之网课学习自动化 一文中,在登录环节,为节省学习成本,我们便是采用的手动输入的方式处理验证码,通过图像识别。

    在这里插入图片描述

    def Login():
            print('***************正在加载必要元素,请耐心等待***************')
            browser.get('https://www.******.cn/home/')
            browser.find_element_by_xpath('//*[@id="accountFrom"]/label[1]/input').send_keys(username)
            browser.find_element_by_xpath('//*[@id="accountFrom"]/label[3]/input').send_keys(pwd)
            input("请输入验证码登陆后回车确认:")
    

    针对第二种方法,正所谓利用“钞能力”解决问题,仅需足够预算,简单高效。在这里便不再多述。本文将主要讲述如何通过代码,实现验证码的识别。鉴于当前验证码形式的多样性,这里选用字符识别和滑动拼图两种最常见的验证方式,展开介绍。


    验证码识别基本步骤梳理:
    1. 定位识别元素
    2. 获取识别(完整)图片
    3. 编写识别方法
    4. 通过识别验证

    一、字符验证码识别

    在这里插入图片描述

    1. 获取并保存验证码:

    这一步的基本逻辑是:访问网页,保存验证码。但值得注意的是,每次页面刷新后验证码的值也将改变,因此请求验证码时候的cookie值应当与访问网页时的cookie值保持一致。

    (1)访问网页
    url1 = '手动打码/Login.aspx'
    def get_cookie():
            headers1 = {
                "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
                "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
                "Accept-Encoding": "gzip, deflate",
                "Content-Type": "application/x-www-form-urlencoded",
                "Origin": "手动打码",
                "Connection": "keep-alive",
                "Referer": "手动打码",
                "Upgrade-Insecure-Requests": "1"
            }
            main = session.get(url1, headers=headers1)
            gb_headers = main.headers
            return gb_headers
    
    (2)储存验证码
    test = get_cookie()
    url2 = '手动打码/Image.aspx'
    def get_pic():
        # 验证码请求头
        headers2 = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
            "cookie": "varPartNewsManage.aspx=10" + test["Set-Cookie"]
        }
    
        re_pic = requests.get(url2, headers=headers2)
        response = re_pic.content
    
        file = "C:\\Users\\john\\Desktop\\1\\" + ".png"
        playFile = open(file, 'wb')
        playFile.write(response)
        playFile.close()
    
    1. 识别验证码:
    def recognize_captcha(img_path):
        im = Image.open(img_path)
        num = pytesseract.image_to_string(im)
        return num
    
    get_pic()
    pic_res = recognize_captcha("C:\\Users\\john\\Desktop\\1\\" + ".png")
    #print(pic_res)  # 验证码识别结果
    
    1. 登陆
    def post_login():
        headers3 = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
            "Accept-Encoding": "gzip, deflate",
            "Content-Type": "application/x-www-form-urlencoded",
            "Origin": "手动打码",
            "Connection": "keep-alive",
            "Referer": "手动打码",
            "Upgrade-Insecure-Requests": "1",
            "cookie": "varPartNewsManage.aspx=10;" + test["Set-Cookie"]
        }
        data = { "Flag": "Login",
                "username": "手动打码",
                "password": "手动打码",
                "ddlUserClass": "1",
                "code1": pic_res,
                "ImageButton2.x": "64",
                "ImageButton2.y": "10"}
        res = session.post(url=url,data=data,headers=headers3)
        #print(res.request.headers)  #核验cookie是否有效带上
        #print(res.text)
    
    post_login()
    

    二、滑动拼图验证码识别

    在这里插入图片描述

    1. 获取验证按钮与验证码的位置
    def get_geetest_button(self):
        """
        获取初始验证按钮
        :return:
        """
        # 验证按钮
        button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'geetest_radar_tip')))
        return button
    
    def get_position(self):
        """
        获取验证码位置
        :return: 验证码位置元组
        """
        img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img')))
        print('img')
        location = img.location
        size = img.size
        top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size['width']
    

    进入验证页面,获取验证按钮与验证码的位置

    1. 获取完整图片
      在这里插入图片描述
      在这里插入图片描述
    def get_screenshot(self):
        """
        获取网页截图
        :return: 截图对象
        """
        screenshot = self.browser.get_screenshot_as_png()
        screenshot = Image.open(BytesIO(screenshot))
        return screenshot
    def get_geetest_image(self, name='captcha.png'):
        """
        获取验证码图片
        :return: 图片对象
        """
        top, bottom, left, right = self.get_position()
        print('验证码位置', top, bottom, left, right)
        screenshot = self.get_screenshot()
        captcha = screenshot.crop((left, top, right, bottom))
        captcha.save(name)
        return captcha
    def delete_style(self):
        '''
        执行js脚本,获取无滑块图
        :return None
        '''
        js = 'document.querySelectorAll("canvas")[2].style=""'
        self.browser.execute_script(js)
    def get_gap(self, image1, image2):
        """
        获取缺口偏移量
        :param image1: 带缺口图片
        :param image2: 不带缺口图片
        :return:
        """
        left = 60
        print(image1.size[0])
        print(image1.size[1])
        for i in range(left, image1.size[0]):
            for j in range(image1.size[1]):
                if not self.is_pixel_equal(image1, image2, i, j):
                    left = i
                    return left
        return left
    
    def is_pixel_equal(self, image1, image2, x, y):
        """
        判断两个像素是否相同
        :param image1: 图片1
        :param image2: 图片2
        :param x: 位置x
        :param y: 位置y
        :return: 像素是否相同
        """
        # 取两个图片的像素点
        pixel1 = image1.load()[x, y]
        pixel2 = image2.load()[x, y]
        threshold = 60
        if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
                pixel1[2] - pixel2[2]) < threshold:
            return True
        else:
            return False
    

    通过调整css样式,获取完整图片。同时获取带缺口的图片加入带缺口图片进行对比,获取偏移量!(PIL)

    1. 验证

    根据偏移量获取移动轨迹,控制滑块,填补缺口!

    def get_track(self, distance):
        """
        根据偏移量获取移动轨迹
        :param distance: 偏移量
        :return: 移动轨迹
        """
        # 移动轨迹
        track = []
        # 当前位移
        current = 0
        # 减速阈值
        mid = distance * 4 / 5
        # 计算间隔
        t = 0.2
        # 初速度
        v = 0
        while current < distance:
            if current < mid:
                # 加速度为正2
                a = 2
            else:
                # 加速度为负3
                a = -1
            # 初速度v0
            v0 = v
            # 当前速度v = v0 + at
            v = v0 + a * t
            # 移动距离x = v0t + 1/2 * a * t^2
            move = v0 * t + 1 / 2 * a * t * t
            # 当前位移
            current += move
            # 加入轨迹
            track.append(round(move))
        return track
    
    def move_to_gap(self, slider, track):
        """
        拖动滑块到缺口处
        :param slider: 滑块
        :param track: 轨迹
        :return:
        """
        ActionChains(self.browser).click_and_hold(slider).perform()
        for x in track:
            ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()
        time.sleep(0.5)
        ActionChains(self.browser).release().perform()
    

    这里值得注意的是,由于验证码的特殊性,我们是不能控制滑块匀速滑过去的(人类是做不到的),极验在此也是做了验证的!所以我们按照人操作,先加速后减速做个优化!

    此外,不管是电脑设置还是浏览器设置的缩放都要改成100%。否则将会影响图片的截取与偏移量的错误计算。


    至此,本文也就进入尾声了。本文的撰写来自于开发中的一点心得体会,主要目的在于通过实践提高读者Python学习兴趣,解决实际问题。供对这一领域感兴趣的读者以参考借鉴。希望本文能够起到抛砖引玉之效,也欢迎大家的批评交流。


    如果您有任何疑问或者好的建议,期待你的留言、评论与关注!

    展开全文
  • selenium滑动验证码

    2019-12-30 10:43:57
    滑动验证码的验证,可用selneium的click_and_hold 和move_by_offset来实现,其中click_and_hold(target).perform()模拟鼠标左键按下,抓住滑动块,move_by_offset来实现滑动块的相对位移 ActionChains(driver)....

    最好是在测试的时候屏蔽掉滑动验证。

    滑动验证码的验证,可用selneium的click_and_hold 和move_by_offset来实现,其中click_and_hold(target).perform()模拟鼠标左键按下,抓住滑动块,move_by_offset来实现滑动块的相对位移

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

    源代码参考,其中的get_track是获取整个滑动条的多个焦点,模拟鼠标的慢慢滑动。

    # coding:utf-8
    """
    author:@
    """
    '''先加速后减速'''
    from selenium.webdriver import ActionChains
    from selenium import webdriver
    import time
    
    driver=webdriver.Chrome()
    driver.get("https://www.qichacha.com/user_login")
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="normalLogin"]').click()
    time.sleep(1)
    huakuai=driver.find_element_by_xpath('//*[@id="nc_1_n1z"]')
    
    def get_track(distance):      # distance为传入的总距离
        # 移动轨迹
        track=[]
        # 当前位移
        current=0
        # 减速阈值
        mid=distance*4/5
        # 计算间隔
        t=0.2
        # 初速度
        v=0
    
        while current<distance:
            if current<mid:
                # 加速度为2
                a=2
            else:
                # 加速度为-2
                a=-3
            v0=v
            # 当前速度
            v=v0+a*t
            # 移动距离
            move=v0*t+1/2*a*t*t
            # 当前位移
            current+=move
            # 加入轨迹
            track.append(round(move))
        return track   #list 返回的是整个滑动条的多个焦点,可以模拟鼠标的缓慢滑动
    def move_to_gap(slider,tracks):     # slider是要移动的滑块,tracks是要传入的移动轨迹
        ActionChains(driver).click_and_hold(slider).perform()
        for x in tracks:
            ActionChains(driver).move_by_offset(xoffset=x,yoffset=0).perform()
        time.sleep(0.5)
        ActionChains(driver).release().perform()
    
    if __name__ == '__main__':
        move_to_gap(huakuai,get_track(340))
    

     

    展开全文
  • 最新selenium+验证码识别模拟登陆b站

    千次阅读 2020-10-11 17:05:45
    最新selenium+验证码识别模拟登陆b站主要步骤:1.分析登录界面结构2.使用selenium打开登录页面3.获取页面当前验证码图片3.1方法一、页面截图,将验证码区域进行裁剪保存3.2方法二、通过网页获取图片地址,并保存4....
  • 来源:Python数据之道作者:叶庭云整理:Lemon巧用 selenium 解决验证码,模拟登陆某流行网站一、前言1. 介绍验证码多种多样,有图形文字的、有模拟点选的、有拖动滑动的,但...
  • 来源:Python数据之道作者:叶庭云整理:Lemon一、前言1. 介绍验证码多种多样,有图形文字的、有模拟点选的、有拖动滑动的,但其实归根结底都需要人来对某种情形做一些判断,然后把结果...
  • 原理:首先下载滑块的图片,使用opencv 计算到缺口的位置,然后再使用一个加速函数模拟手工操作的非匀速的运动,将滑块移动到缺口处,亲测该方法识别率 95% 左右 import cv2 as cv import requests from selenium ...
  • from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from PIL import Image import random from 项目.chaojiying import Chaojiying_Client from selenium.webdriver ...
  • ​​​​Selenium(WEB自动化工具) 准备工作 下载selenium包 pip install selenium 如遇网络问题可改源: pip install selenium -i 清华源 下载浏览器驱动 注意找对应浏览器版本的驱动,下载解压完成后...
  • from django.test import TestCase # Create your tests here. from selenium.webdriver ...from selenium.webdriver.common.action_chains import ActionChains import time import requests import c...
  • Python 爬虫 Selenium 中滑动验证码1. 1.
  • 话不多说,直接上图上代码: import base64 import os ...from selenium.webdriver.common.action_chains import ActionChains try: import cv2 except: os.system("pip install opencv-pyth...
  • python爬虫之selenium识别滑动验证码

    千次阅读 2019-04-11 13:32:36
    最早在爬虫中遇到滑动验证码是在国家企业信用信息公示系统中,当时也是运用selenium来完成。现在该网站已经改为点触验证码了,故现在用bilibili登录页面作为一个示例。 一、识别思路 识别滑动验证码需要完成如下几...
  • from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.porters.vip/captcha/sliders.html') hover = brows...
  • 此文以B站模拟登录,滑动验证码的测试。 import random import time import requests from selenium.webdriver import ActionChains from selenium.webdriver.support import expected_conditions as EC from ...
  • 2 * 0.8 # 将点击操作的参照物移动到指定的模块, # 若用方法二获取的验证码图片,要添加下面代码对code_img_ele赋值 # code_img_ele = bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div...
  • Selenium破解滑块验证码

    千次阅读 2019-03-22 18:04:58
    Selenium暴力破解! 一. 验证码简介 验证码,即CAPTCHA,全自动区分计算机和人类的公开图灵测试,换而言之,验证码是一种用于区分人类与计算机的测试,只有通过了CAPTCHA,当前用户才被认为是人类。 私信小编007...
  • 这是我第一次发博客,若有问题,请多多指教!本次是为了帮忙解决,如果在平时自动化遇到有验证码填写的情况,我们如何成功登录情况... 使用工具:Eclipse、selenium、火狐、log4j、AUTOIT_3.3.14.1、tesseract-ocr3....
  • import os import time import random import traceback ...from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver import ActionChains from webdriver_ma
  • python+selenium滑动式验证码解决办法 # -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.action_chains import ...
  • 前期写得爬虫已经逐渐稳定,但是每次都是手动输入验证码,时间久了觉得麻烦,就想着自动识别验证码登陆,于是就开启了各种百度之路,磕磕碰碰,总算成功实现自动登陆,特次复盘此次验证码识别的全过程,以便大家参考...
  • 实战: Python 3.6.5 解释器 pycharm 编辑器 selenium 模块 其实利用selenium模拟登陆没什么难度的,关键在于这个豆瓣的验证码要怎么办。 经过我多次截图发现了一些规律,如下所示: 验证码方块离左边的距离永远...
  • python-selenium实现滑块验证码破解

    千次阅读 2020-04-26 16:34:24
    目录python实现滑块验证码破解本实验用到的python包本次要破解验证码的网站地址代码正篇配置信息网页弹出验证码下载验证码图片坐标分析找到滑块的位置匹配滑块图片和背景图片,找到滑块的位置移动滑块完整代码结果 ...
  • Selenium破解滑动验证码-Python Spider

    千次阅读 2020-03-09 09:53:31
    In [13]: from selenium import webdriver In [14]: browser = webdriver.Chrome() DevTools listening on ws://127.0.0.1:54233/devtools/browser/9d5cf82b-76f8-465d-a13b-1eee723d7951 In [15]: browser.ge...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,809
精华内容 723
关键字:

selenium移动验证码