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版本五子棋的实现代码
Dec 11 Python
使用python实现语音文件的特征提取方法
Jan 09 Python
对python:循环定义多个变量的实例详解
Jan 20 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
Python各种扩展名区别点整理
Feb 27 Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
为什么说python适合写爬虫
Jun 11 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 Python
基于python实现删除指定文件类型
Jul 21 Python
python实现自动清理重复文件
Aug 24 Python
Pandas自定义选项option设置
Jul 25 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
PHP之变量、常量学习笔记
2008/03/27 PHP
PHP 柱状图实现代码
2009/12/04 PHP
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
动态加载js、css的简单实现代码
2016/05/26 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
js捆绑TypeScript声明文件的方法教程
2018/04/13 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
基于ssm框架实现layui分页效果
2019/07/27 Javascript
Python的面向对象思想分析
2015/01/14 Python
详解在Python和IPython中使用Docker
2015/04/28 Python
详解python eval函数的妙用
2017/11/16 Python
python字典快速保存于读取的方法
2018/03/23 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
高级方案规划工程师岗位职责
2013/11/29 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
开办饭店创业计划书
2013/12/28 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
幼儿园课题方案
2014/06/09 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
中学生纪念九一八事变演讲稿
2014/09/14 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
佛光寺导游词
2015/02/10 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers