Python通用验证码识别OCR库ddddocr的安装使用教程

作者:PandaMan~ 时间:2021-11-04 21:21:27 

前言

在使用自动化登录网站的时候,经常输入用户名和密码后会遇到验证码。今天介绍一款通用验证码识别 OCR库,对验证码识别彻底说拜拜,它的名字是 ddddocr(带带弟弟 OCR )。这里主要以字母数字类验证码进行说明。

项目地址:https://github.com/sml2h3/ddddocr

一、安装ddddocr

通过命令将自动安装符合自己电脑环境的最新 ddddocr。

pip install ddddocr

如果安装速度慢,可以连接国内镜像进行安装,命令如下:

pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple/

二、使用ddddocr

1. 使用举例

import ddddocr

ocr = ddddocr.DdddOcr()
with open('code.png', 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print('识别出的验证码为:' + res)

2. 完整代码

import os
import ddddocr
from time import sleep
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By

class GetVerificationCode:
def __init__(self):
       self.res = None
       url = '要登录的地址'
       self.driver = webdriver.Chrome()
       self.driver.maximize_window()  # 将浏览器最大化
       self.driver.get(url)

# 获取验证码信息
   def getVerification(self):
       # 获取当前文件的位置、并获取保存截屏的位置
       current_location = os.path.dirname(__file__)
       screenshot_path = os.path.join(current_location, "..", "VerificationCode")
       # 截取当前网页并放到自定义目录下,并命名为printscreen,该截图中有我们需要的验证码
       sleep(1)
       self.driver.save_screenshot(screenshot_path + '//' + 'printscreen.png')
       sleep(1)
       # 定位验证码
       imgelement = self.driver.find_element(By.XPATH, '验证码图片的Xpath定位')
       # 获取验证码x,y轴坐标
       location = imgelement.location
       # 获取验证码的长宽
       size = imgelement.size
       # 写成我们需要截取的位置坐标
       rangle = (int(location['x'] + 430),
                 int(location['y'] + 200),
                 int(location['x'] + size['width'] + 530),
                 int(location['y'] + size['height'] + 250))
       # 打开截图
       i = Image.open(screenshot_path + '//' + 'printscreen.png')
       # 使用Image的crop函数,从截图中再次截取我们需要的区域
       fimg = i.crop(rangle)
       fimg = fimg.convert('RGB')
       # 保存我们截下来的验证码图片,并读取验证码内容
       fimg.save(screenshot_path + '//' + 'code.png')
       ocr = ddddocr.DdddOcr()
       with open(screenshot_path + '//' + 'code.png', 'rb') as f:
           img_bytes = f.read()
       self.res = ocr.classification(img_bytes)
       print('识别出的验证码为:' + self.res)

# 判断验证码错误时的提示信息是否存在
   def isElementPresent(self, by, value):
       try:
           element = self.driver.find_element(by=by, value=value)
       except NoSuchElementException:
           pass
           # 发生了NoSuchElementException异常,说明页面中未找到该元素,返回False
           return False
       else:
           # 没有发生异常,表示在页面中找到了该元素,返回True
           return True

# 登录
   def login(self):
       self.getVerification()
       self.driver.find_element(By.XPATH, '用户名输入框Xpath定位').send_keys('用户名')
       self.driver.find_element(By.XPATH, '密码输入框Xpath定位').send_keys('密码')
       self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').send_keys(self.res)
       sleep(1)
       self.driver.find_element(By.XPATH, '登录按钮Xpath定位').click()
       sleep(2)
isFlag = True
       while isFlag:
           try:
               isPresent = self.isElementPresent(By.XPATH, '验证码错误时的提示信息Xpath定位')
               if isPresent is True:
                   codeText = self.driver.find_element(By.XPATH, '验证码错误时的提示信息Xpath定位').text
                   if codeText == "验证码不正确":
                       self.getVerification()
                       sleep(2)
                       self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').clear()
                       sleep(1)
                       self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').send_keys(self.res)
                       sleep(1)
                       self.driver.find_element(By.XPATH, '登录按钮Xpath定位').click()
                       sleep(2)
                   tips = self.driver.find_element(By.XPATH,
                                                   '未输入验证码时的提示信息Xpath定位').text
                   if tips == "请输入验证码":
                       self.getVerification()
                       sleep(2)
                       self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').click()
                       sleep(1)
                       self.driver.find_element(By.XPATH, '验证码输入框Xpath定位').send_keys(self.res)
                       sleep(1)
                       self.driver.find_element(By.XPATH, '登录按钮Xpath定位').click()
                       sleep(2)
                   continue
               else:
                   print("验证码正确,登录成功!")
           except NoSuchElementException:
               pass
           else:
               isFlag = False

sleep(5)
       self.driver.quit()

if __name__ == '__main__':
   GetVerificationCode().login()

3. 验证码样例

Python通用验证码识别OCR库ddddocr的安装使用教程

Python通用验证码识别OCR库ddddocr的安装使用教程

Python通用验证码识别OCR库ddddocr的安装使用教程

4. 识别结果

可以实现:验证码识别错误后,继续识别

Python通用验证码识别OCR库ddddocr的安装使用教程

三、代码说明

本文代码中时间等待都是使用了强制等待,如有需要可对代码进行修改,可以使用显示等待。关于selenium的三种等待方式(显示等待,隐式等待,强制等待)可以参考其他博主的文章了解学习。

来源:https://blog.csdn.net/weixin_58839230/article/details/124243584

标签:验证码识别,ocr库,ddddocr
0
投稿

猜你喜欢

  • Python Prim算法通过遍历墙实现迷宫的生成

    2022-06-26 08:41:09
  • asp如何实现网络打印?

    2010-05-24 18:31:00
  • 基于Arcgis for javascript实现百度地图ABCD marker的效果

    2024-04-23 09:22:22
  • Golang import本地包和导入问题相关详解

    2024-01-30 09:35:37
  • JS的IE和FF兼容性问题汇总

    2008-03-08 13:01:00
  • mysql 8.0.12安装配置方法图文教程(Windows版)

    2024-01-13 14:57:40
  • Python实现嵌套列表及字典并按某一元素去重复功能示例

    2023-02-22 10:44:05
  • 使用python实现kmean算法

    2022-09-17 13:07:22
  • Python代码库之Tuple如何append添加元素问题

    2021-10-02 07:13:34
  • linux下导入、导出mysql数据库命令的实现方法

    2024-01-23 15:55:33
  • 基于OpenCV和Gradio实现简单的人脸识别详解

    2022-10-21 22:59:11
  • MySQL OOM(内存溢出)的解决思路

    2024-01-26 08:38:26
  • javascript实现鼠标选取拖动或Ctrl选取拖动

    2021-08-21 19:08:33
  • MySQL如何实现负载均衡功能

    2024-01-20 20:25:45
  • js滑动展开与折叠效果(收缩)

    2007-10-09 13:17:00
  • 如何更快更好地调试ASP程序代码?

    2009-11-23 20:13:00
  • Python3转换html到pdf的不同解决方案

    2021-10-03 19:50:03
  • Django-Model数据库操作(增删改查、连表结构)详解

    2024-01-20 14:11:17
  • Python实现将Excel内容插入到Word模版中

    2022-05-04 23:21:03
  • 详解python函数的闭包问题(内部函数与外部函数详述)

    2023-01-22 20:53:01
  • asp之家 网络编程 m.aspxhome.com