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


Posted in Python onJuly 07, 2022

前言

在使用自动化登录网站的时候,经常输入用户名和密码后会遇到验证码。今天介绍一款通用验证码识别 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的三种等待方式(显示等待,隐式等待,强制等待)可以参考其他博主的文章了解学习。

总结

对于现在已有的验证码图片都有可能具备一定的识别能力。简单来说,ddddocr 让验证码识别变得如此简单与易用,可以快速的检测出图片上的文字、数字或图标,让更多的伙伴能够快速的破解网站的登录验证码。

到此这篇关于Python通用验证码识别OCR库ddddocr的安装使用教程的文章就介绍到这了,更多相关Python验证码识别OCR库ddddocr内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
python 列表降维的实例讲解
Jun 28 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
ERLANG和PYTHON互通实现过程详解
Jul 05 Python
浅谈python多进程共享变量Value的使用tips
Jul 16 Python
python实现桌面气泡提示功能
Jul 29 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
Python爬虫基础初探selenium
May 31 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 Python
Django数据库(SQlite)基本入门使用教程
Jul 07 #Python
Python可视化神器pyecharts之绘制地理图表练习
Django中celery的使用项目实例
Python可视化神器pyecharts绘制地理图表
Python软件包安装的三种常见方法
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 #Python
Python实现数据的序列化操作详解
Jul 07 #Python
You might like
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
PHP取余函数介绍MOD(x,y)与x%y
2014/05/15 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
js截取函数(indexOf,join等)
2010/09/01 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
javascript中this关键字详解
2016/12/12 Javascript
微信小程序实战之登录页面制作(5)
2020/03/30 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python语言描述随机梯度下降法
2018/01/04 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
python在不同条件下的输入与输出
2020/02/13 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
医院护士的求职信范文
2013/12/26 职场文书
总经理司机职责
2014/02/02 职场文书
协议书怎么写
2014/04/21 职场文书
员工生日会策划方案
2014/06/14 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
高二语文教学反思
2016/02/16 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python