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获取DLL和EXE文件版本号的方法
Mar 10 Python
python实现图像识别功能
Jan 29 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
详解Python sys.argv使用方法
May 10 Python
python binascii 进制转换实例
Jun 12 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
python英语单词测试小程序代码实例
Sep 09 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
Python如何将装饰器定义为类
Jul 30 Python
Pandas的数据过滤实现
Jan 15 Python
Pycharm 如何设置HTML文件自动补全代码或标签
May 21 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
SONY ICF-SW7600的电路分析
2021/03/02 无线电
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
3种平台下安装php4经验点滴
2006/10/09 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
php实现生成验证码实例分享
2016/04/10 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
Python3生成手写体数字方法
2018/01/30 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
Python函数调用追踪实现代码
2020/11/27 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
大学生毕业自我鉴定范文
2013/11/03 职场文书
中级会计职业生涯规划范文
2014/01/16 职场文书
教导处工作制度
2014/01/18 职场文书
教师一岗双责责任书
2014/04/16 职场文书
法人授权委托书
2014/09/16 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
工作收入证明模板
2014/10/10 职场文书
个人股份合作协议书
2014/10/24 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏