zoukankan      html  css  js  c++  java
  • python selenium 库利用 pytesseract 识别验证码方案

    说明

    利用 python selenium 库自动获取考试成绩时,发现多次请求后需要填写验证码,本方案利用 pytesseract 识别验证码并自动填入。
    跳转到原文

    文中代码方案实现的功能有:

    1. [x] 检测登录时是否需要填写验证码
    2. [x] 验证码本地保存
    3. [x] 验证码识别+结果获取

    验证码展示

    验证码处理后:

    0、准备

    1、方案实现

    1.1、检测登录时是否需要填写二维码

    # 检查是否存在该元素
    def isElementExist(self, element):
            try:
                # 通过元素名称查找
                self.browser.find_element_by_name(element)
                return True
            except:
                return False
    
    

    1.2、验证码保存、识别、获取结果、自动填入

    处理办法:

    1. 检测到需要填写验证码,则确认验证码在浏览器窗口中可见,截图保存为 image1.png
    2. 在浏览器代码中获取验证码元素在浏览器的位置和大小(此数据即为验证码在 image1.png 中的位置),在 image1.png 中对应位置裁出验证码,保存为 code1.png
    3. 将验证码(code1.png)二值化,图像加强,保存为(code2.png)
    4. 利用 pytesseract 函数识别 code2.png ,获取结果
    5. 填写到输入框
    import pytesseract
    from PIL import Image, ImageEnhance
    
    # 检查验证码是否存在、并处理验证码
    if self.isElementExist(element="yzwb_checkcode"):
        print("处理验证码")
    
        # 窗口最大化(如果确认验证码在窗口中可见,则不需要此操作)
        self.browser.maximize_window()
        # 获取图像验证码在当前屏幕中显示的位置、大小信息
        imgelement = self.browser.find_element_by_xpath('//*[@id="app"]/div/form[2]/div[5]/div/div[2]/img')
        location = imgelement.location
        size = imgelement.size
        rangle = (
            int(location['x']), int(location['y']), int(location['x'] + size['width']),
            int(location['y'] + size['height'])
            )
    
        # 截取浏览器显示窗口,并保存
        self.browser.get_screenshot_as_file('./img/image1.png')  
        # 等待保存
        # time.sleep(1)
    
        # 利用验证码位置、大小信息,裁剪,获取验证码本码
        im = Image.open('./img/image1.png')
        region = im.crop(rangle) 
        region.save("./img/code1.png")
        
        # time.sleep(1)
        # 验证码二值化、对比度加强
        im = Image.open("./img/code1.png")
        imgry = im.convert('L')  # 图像加强,二值化
        sharpness = ImageEnhance.Contrast(imgry)  # 对比度增强
        sharp_img = sharpness.enhance(2.0)
        sharp_img.save("./img/code2.png")
        
        # 识别验证码,获取验证码内容
        code = pytesseract.image_to_string(sharp_img).replace(' ', '')
    
        # 填入验证码
        self.browser.find_element_by_name("yzwb_checkcode").send_keys(code)
    
    else:
        # 不存在验证码         
    
  • 相关阅读:
    Linux虚拟机的安装(使用Centos6.3)
    【转载】接口测试用例的设计原则
    Oracle PLSQL游标、游标变量的使用
    利用shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中
    源码安装rlwrap 0.43(为了方便使用linux下的sqlplus)
    Oracle自定义脱敏函数
    Oracle分析函数FIRST_VALUE、LAST_VALUE
    MYSQL性能测试工具SYSBENCH
    OEL7.6源码安装MYSQL5.7
    OEL7.6安装Oracle Database 19C(VERSION 19.3.0.0)
  • 原文地址:https://www.cnblogs.com/sethnie/p/14420543.html
Copyright © 2011-2022 走看看