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中wx将图标显示在右下角的脚本代码
Mar 08 Python
python append、extend与insert的区别
Oct 13 Python
Python 错误和异常代码详解
Jan 29 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
python字符串查找函数的用法详解
Jul 08 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
学python最电脑配置有要求么
Jul 05 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 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
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
javascript闭包入门示例
2014/04/30 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
JavaScript 处理树数据结构的方法示例
2019/06/16 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
python3安装speech语音模块的方法
2018/12/24 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
python学习笔记之多进程
2020/08/06 Python
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
团日活动策划书
2014/02/01 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
报案材料怎么写
2015/05/25 职场文书
色戒观后感
2015/06/12 职场文书
消防演习感想
2015/08/10 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python