100天精通Python(实用脚本篇)——第118天:基于selenium和ddddocr库实现反反爬策略之验证码识别

news2024/12/22 23:51:10

文章目录

  • 专栏导读
  • 一、前言
  • 二、ddddocr库使用说明
    • 1. 介绍
    • 2. 算法步骤
    • 3. 安装
    • 4. 参数说明
    • 5. 纯数字验证码识别
    • 6. 纯英文验证码识别
    • 7. 英文数字验证码识别
    • 8. 带干扰的验证码识别
  • 三、验证码识别登录代码实战
    • 1. 输入账号密码
    • 2. 下载验证码
    • 3. 识别验证码并登录
  • 书籍推荐

专栏导读

🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点订阅限时9.9付费专栏进入千人全栈VIP答疑群,作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会)
  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等
    在这里插入图片描述
    在这里插入图片描述

一、前言

兄弟们使用selenium自动登录网站的时候,是不是经常遇到数字验证码,使用传统的OCR库识别效果又不是很好,今天介绍一款效果非常棒的验证码识别模块——ddddocr。

在这里插入图片描述

二、ddddocr库使用说明

1. 介绍

ddddocr(带带弟弟ocr)是一个用于文字识别的开源库。它是基于深度学习技术的,具有高度的准确性和鲁棒性。ddddocr使用了深度神经网络来处理各种类型的文本,包括印刷体和手写体等。其双解码机制使其在处理复杂文本时表现出色。

这个库的特点之一是其模型结构的密集性(Dense),这意味着它能够更好地捕捉文本中的细节和特征,从而提高了识别的准确性。此外,它还采用了双解码机制(Dual Decode),这意味着它可以同时从多个角度对图像进行解码,进一步提高了识别的鲁棒性和准确性。

Github地址:https://github.com/sml2h3/ddddocr

2. 算法步骤

ddddocr这个库的算法主要包括以下几个步骤:

  1. 图像预处理

    • 图像预处理是任何OCR系统中的第一步。它旨在使图像更容易处理,并提高文本识别的准确性。预处理步骤可能包括灰度化、二值化、去噪声、图像增强等操作,以减少后续步骤中的噪声和干扰。
  2. 文本检测

    • 文本检测是指识别图像中文本的位置和边界框。这一步通常使用深度学习技术,如卷积神经网络 (CNN) 或循环神经网络 (RNN) 来实现。检测到的文本通常用矩形边界框表示。
  3. 文本识别

    • 文本识别是从检测到的文本区域中提取出实际的文本内容。这通常涉及到使用循环神经网络 (RNN)、注意力机制或转录网络等模型来识别文本。这些模型可以是基于字符的,也可以是基于单词或子词的。
  4. 后处理

    • 后处理步骤旨在提高识别准确性并改善结果的质量。这可能包括语言模型的应用、纠正错误、识别字体或手写风格等。
  5. 输出结果

    • 最终结果通常以文本形式呈现,或者以标记文本的边界框和对应的文本内容的形式提供。

ddddOCR库可能会结合这些步骤,利用深度学习模型和传统的计算机视觉技术来实现文本识别。在不同的应用场景下,可能会有一些额外的步骤或优化,比如针对特定的文档类型进行优化、处理不同语言的文本等。

3. 安装

硬性要求 Python >= 3.8,通过pip命令进行安装:

pip install ddddocr

4. 参数说明

我们这里使用的是ddddocr.DdddOcr()类:

class DdddOcr(object):
    def __init__(self, ocr: bool = True, det: bool = False, old: bool = False, beta: bool = False,
                 use_gpu: bool = False,
                 device_id: int = 0, show_ad=True, import_onnx_path: str = "", charsets_path: str = "")

这个__init__方法是一个Python类的构造函数,它定义了类的初始化过程,其中包含了一系列参数。让我来解释一下这些参数的含义:

  1. ocr: 这是一个布尔类型的参数,用于指定是否进行光学字符识别(OCR)。默认值为True,表示默认情况下会进行OCR。

  2. det: 这也是一个布尔类型的参数,用于指定是否进行文本检测(Text Detection)。默认值为False,表示默认情况下不会进行文本检测。

  3. old: 这是一个布尔类型的参数,用于指定是否使用旧版本的模型或方法。默认值为False,表示默认情况下不使用旧版本。

  4. beta: 这也是一个布尔类型的参数,用于指定是否使用测试版本(beta版本)的功能或方法。默认值为False,表示默认情况下不使用测试版本。

  5. use_gpu: 这是一个布尔类型的参数,用于指定是否使用GPU来进行计算。默认值为False,表示默认情况下不使用GPU,而使用CPU。

  6. device_id: 这是一个整数类型的参数,用于指定在使用GPU时要使用的GPU设备的ID。默认值为0,表示默认情况下使用ID为0的GPU设备。

  7. show_ad: 这是一个布尔类型的参数,用于指定是否显示广告。默认值为True,表示默认情况下会显示广告。

  8. import_onnx_path: 这是一个字符串类型的参数,用于指定导入ONNX模型的路径。默认值为空字符串,表示默认情况下不导入任何ONNX模型。

  9. charsets_path: 这是一个字符串类型的参数,用于指定字符集的路径。默认值为空字符串,表示默认情况下字符集的路径未指定。

这个类中有一个classification方法,需要传递一个图片对象进入就可以识别了

    def classification(self, img, png_fix: bool = False):
        if self.det:
            raise TypeError("当前识别类型为目标检测")
        if not isinstance(img, (bytes, str, pathlib.PurePath, Image.Image)):
            raise TypeError("未知图片类型")
        if isinstance(img, bytes):
            image = Image.open(io.BytesIO(img))
        elif isinstance(img, Image.Image):
            image = img.copy()
        elif isinstance(img, str):
            image = base64_to_image(img)
        else:
            assert isinstance(img, pathlib.PurePath)
            image = Image.open(img)
        if not self.use_import_onnx:
            image = image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.ANTIALIAS).convert('L')
        else:
            if self.__resize[0] == -1:
                if self.__word:
                    image = image.resize((self.__resize[1], self.__resize[1]), Image.ANTIALIAS)
                else:
                    image = image.resize((int(image.size[0] * (self.__resize[1] / image.size[1])), self.__resize[1]),
                                         Image.ANTIALIAS)
            else:
                image = image.resize((self.__resize[0], self.__resize[1]), Image.ANTIALIAS)
            if self.__channel == 1:
                image = image.convert('L')
            else:
                if png_fix:
                    image = png_rgba_black_preprocess(image)
                else:
                    image = image.convert('RGB')
        image = np.array(image).astype(np.float32)
        image = np.expand_dims(image, axis=0) / 255.
        if not self.use_import_onnx:
            image = (image - 0.5) / 0.5
        else:
            if self.__channel == 1:
                image = (image - 0.456) / 0.224
            else:
                image = (image - np.array([0.485, 0.456, 0.406])) / np.array([0.229, 0.224, 0.225])
                image = image[0]
                image = image.transpose((2, 0, 1))

        ort_inputs = {'input1': np.array([image]).astype(np.float32)}
        ort_outs = self.__ort_session.run(None, ort_inputs)
        result = []

5. 纯数字验证码识别

测试图片:

在这里插入图片描述

测试代码:

import ddddocr
import time


start = time.time() # 开始时间

# 1. 创建DdddOcr对象
ocr = ddddocr.DdddOcr(show_ad=False)

# 2. 读取图片
with open('test.png', 'rb') as f:
    img = f.read()

# 3. 识别图片内验证码并返回字符串
result = ocr.classification(img)
print("识别结果:",result)

end = time.time()
print("耗时:%s 秒" % str(start-end))

运行结果:

识别结果: 0413
耗时:-0.12942123413085938

6. 纯英文验证码识别

测试图片:
在这里插入图片描述

运行结果:

识别结果: bcsm
耗时:-0.11309981346130371

7. 英文数字验证码识别

测试图片:

在这里插入图片描述

运行结果:

识别结果: a72c
耗时:-0.09667587280273438

8. 带干扰的验证码识别

测试图片:

在这里插入图片描述

运行结果:

识别结果: i27kYk
耗时:-0.09169244766235352

可以看到ddddocr库识别验证码还是特别给力的!!!

三、验证码识别登录代码实战

上一期我们讲了如何使用selenium输入账号信息登录网站,还不会的可以去复习一下:https://blog.csdn.net/yuan2019035055/article/details/136284263

测试网站:https://captcha7.scrape.center/

在这里插入图片描述

1. 输入账号密码

运行下面代码将会输入账号密码:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 1. 创建链接
# 创建ChromeOptions对象,用于配置Chrome浏览器的选项
chrome_options = webdriver.ChromeOptions()
# 添加启动参数,'--disable-gpu'参数用于禁用GPU加速,适用于部分平台上的兼容性问题
chrome_options.add_argument('--disable-gpu')

# 2. 添加请求头伪装浏览器
chrome_options.add_argument(
    'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36')
driver = webdriver.Chrome(chrome_options=chrome_options)

# 3. 执行 `stealth.min.js` 文件进行隐藏浏览器指纹
with open('stealth.min.js') as f:
    js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": js
})

# 4. 最大化浏览器窗口
driver.maximize_window()

# 5. 发送请求,打开网页
driver.get('https://captcha7.scrape.center/')
time.sleep(1)


# 6. 输入账号密码
username_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip username item el-input']/input") # 定位账号框
username_input.send_keys("your_username")  # 输入账号信息(这里自行替换)

password_input  = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip password item el-input']/input") # 定位密码框
password_input .send_keys("your_username")  # 输入密码信息(这里自行替换)

time.sleep(100)

运行结果:

在这里插入图片描述

2. 下载验证码

1、先找到验证码图片的ID:

在这里插入图片描述
ID为:

captcha

2、定位验证码:

element = driver.find_element(By.ID, 'captcha') # 定位验证码

3、使用screenshot('test.png')方法保存截图在本地:

element.screenshot('test.png') # 保存截图

完整代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 1. 创建链接
# 创建ChromeOptions对象,用于配置Chrome浏览器的选项
chrome_options = webdriver.ChromeOptions()
# 添加启动参数,'--disable-gpu'参数用于禁用GPU加速,适用于部分平台上的兼容性问题
chrome_options.add_argument('--disable-gpu')

# 2. 添加请求头伪装浏览器
chrome_options.add_argument(
    'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36')
driver = webdriver.Chrome(chrome_options=chrome_options)

# 3. 执行 `stealth.min.js` 文件进行隐藏浏览器指纹
with open('stealth.min.js') as f:
    js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": js
})

# 4. 最大化浏览器窗口
driver.maximize_window()

# 5. 发送请求,打开网页
driver.get('https://captcha7.scrape.center/')
time.sleep(1)


# 6. 输入账号密码
username_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip username item el-input']/input") # 定位账号框
username_input.send_keys("your_username")  # 输入账号信息(这里自行替换)

password_input  = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip password item el-input']/input") # 定位密码框
password_input .send_keys("your_username")  # 输入密码信息(这里自行替换)


# 7. 下载验证码
element = driver.find_element(By.ID, 'captcha') # 定位验证码
element.screenshot('test.png') # 保存截图

运行结束就会在当前路径下保存验证码图片:

在这里插入图片描述

注意:当网站的验证码图片没法定位下载的时候,可以使用Python定位屏幕指定位置截图的模块,如:pyautogui等等,进行截图下载验证码图片

3. 识别验证码并登录

接下来需要识别验证码内容,定位验证码文本框,输入验证码,点击登录,完整代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import ddddocr


# 1. 创建链接
# 创建ChromeOptions对象,用于配置Chrome浏览器的选项
chrome_options = webdriver.ChromeOptions()
# 添加启动参数,'--disable-gpu'参数用于禁用GPU加速,适用于部分平台上的兼容性问题
chrome_options.add_argument('--disable-gpu')

# 2. 添加请求头伪装浏览器
chrome_options.add_argument(
    'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36')
driver = webdriver.Chrome(chrome_options=chrome_options)

# 3. 执行 `stealth.min.js` 文件进行隐藏浏览器指纹
with open('stealth.min.js') as f:
    js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": js
})

# 4. 最大化浏览器窗口
driver.maximize_window()

# 5. 发送请求,打开网页
driver.get('https://captcha7.scrape.center/')
time.sleep(1)


# 6. 输入账号密码
username_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip username item el-input']/input") # 定位账号框
username_input.send_keys("your_username")  # 输入账号信息(这里自行替换)

password_input  = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip password item el-input']/input") # 定位密码框
password_input .send_keys("your_username")  # 输入密码信息(这里自行替换)


# 7. 下载验证码
element = driver.find_element(By.ID, 'captcha') # 定位验证码
element.screenshot('test.png') # 保存截图


# 8. 识别验证码
# 创建DdddOcr对象
ocr = ddddocr.DdddOcr(show_ad=False)
# 读取图片
with open('test.png', 'rb') as f:
    img = f.read()
# 识别图片内验证码并返回字符串
result = ocr.classification(img)
print("识别结果:",result)


# 9. 输入验证码
yzm = driver.find_element(by=By.XPATH, value="//div[@class='captcha el-input']/input") # 定位账号框
yzm.clear()  # 清空默认文本
yzm.send_keys(result)

# 10. 点击登录按钮元素
login_button = driver.find_element(by=By.XPATH, value="//button[@class='el-button login el-button--primary']")
# 点击登录按钮
login_button.click()

time.sleep(100)

运行结果:

在这里插入图片描述

书籍推荐

《Python机器学习 》
在这里插入图片描述
《Python机器学习》首先介绍Python机器学习的一些基本库,包括NumPy、Pandas和matplotlib。一旦牢固地掌握了基础知识,即可开始基于Python和Scikit-learn库进行机器学习,深入了解各种机器学习算法(如回归、聚类和分类)的底层工作原理。本书专门用一章的篇幅讲解如何使用Azure Machine Learning Studio进行机器学习;利用该平台,开发人员不必编写代码即可开始构建机器学习模型。本书最后讨论如何部署供客户端应用程序使用的已构建模型。

《Python机器学习》面向机器学习新手,主要内容如下:

● Python机器学习的一些基本库,包括NumPy、Pandas和matplotlib库

● 常见的机器学习算法,包括回归、聚类、分类和异常检测

● 使用Python和Scikit-learn库进行机器学习

● 将机器学习模型部署为Web服务

● 使用Microsoft Azure Machine Learning Studio进行机器学习

● 演习机器学习模型构建方案的实例

京东:https://item.jd.com/12672565.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第111讲:Mycat实践指南:固定Hash算法分片下的水平分表详解

文章目录 1.固定Hash算法分片的概念1.1.固定Hash算法的概念1.2.固定Hash算法是如何将数据路由到分片节点的 2.使用固定Hash算法分片对某张表进行水平拆分2.1.在所有的分片节点中创建表结构2.2.配置Mycat实现固定Hash算法分片的水平分表2.2.1.配置Schema配置文件2.2.2.配置Rule分…

VMware虚拟机和主机之间无法复制粘贴,移动文件,重新安装vmware-tools变灰,VMware Tools继续运行脚本未能在虚拟机中成功运行。

起初,虚拟机只是无法和主机之间进行复制粘贴,移动文件。查询了很多资料,反反复复地安装卸载vmware-tools,但是都没有成功。通过这篇文章:虚拟机安装VMware Tools的两种方法_vmware tools有3种安装方式-CSDN博客 安装了vmware_too…

PCIE收发时序了解

文章目录 一、Pcie的发送时序1.1 不带数据的TLP包1.2 带数据的TLP包1.3 连续发送数据的TLP包 二、Pcie的接收时序2.1 不带数据的TLP包2.2 带数据的TLP包2.3 连续接收数据的TLP包 三、riffa框架和用户channel的接口3.1 RX接口波形:3.2 TX接口波形: 一、Pc…

用python写网络爬虫:3.urllib库进一步的使用方法

文章目录 异常处理URLErrorHTTPError设置超时时间 链接的解析、构造、合并urlparse方法urlsplit方法urljoin方法urlencode方法parse_qs方法quote方法 Robots 协议Robots 协议的结构解析协议 参考书籍 在上一篇文章:用python写网络爬虫:2.urllib库的基本用…

SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3)

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3) ⏱️ 创作时间&a…

【每日力扣】131.分割回文串与450.删除二叉搜索树中的节点

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。 131.分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的…

C#使用MiniExcel读取excel表格文件

使用MiniExcel读取excel表格文件 MiniExecl提供了几种读取方法。 准备测试数据 测试类: public class Person{public int Id { get; set; }public string Name { get; set; }public string Description { get; set; }public double Value { get; set; }}测试数据…

伦敦数据科学与Scikit-learn:一次探索与实践的旅程

1.题目 Data Science London正在举办一场关于Scikit-learn的聚会。 这个比赛是尝试、分享和创建 sklearn 分类能力示例的练习场(如果这变成了有用的东西,我们可以跟进回归或更复杂的分类问题)。Scikit-learn(sklearn)…

Django项目不显示图片,路径找不到

1.问题 创建Django项目简单写一个网页,文字能显示,图片却无法加载,路径错误,找不到图片。 2.背景 我的项目结构 C:. ├─.idea │ └─inspectionProfiles ├─app01 │ ├─migrations │ ├─templates │ │ ├─app0…

postgres让别人连接自己本地的库

本地安装了postgres,一般只能自己连接,如果别人想要连接我们自己的库,需要修改postgres的配置。 找到pg.gba.conf,路径是:postgres安装路径/PostgreSQL/data 使用记事本打开这个文件,将别人的ip填入其中即…

Python数学建模-2.5Pandas库介绍

2.5.1Pandas基本操作 Pandas是一个强大的Python数据分析库,它提供了快速、灵活且富有表现力的数据结构,设计初衷是为了处理关系型或标记型数据。Pandas的基本操作涵盖了数据的读取、处理、筛选、排序、分组、合并以及可视化等多个方面。 以下是一些Pan…

CentOS7环境——yum安装nginx

目录 1.修改yum源为阿里云 2.下载wget 3.下载阿里云的 CentOS-Base.repo 到/etc/yum.repos.d/ 4.清空原本yum缓存 5.生成新的阿里云的yum缓存,加速下载预热数据 6.下载epel-release 7.下载nginx 8.启动并检查nginx状态 1.修改yum源为阿里云 cp /etc/yum.re…

QQ 截图工具独立版安装使用

前言 之前截图一直使用的QQ截图,相比于微信截图,QQ截图还支持长截图,总体来说,QQ截图是我使用过的最好的截图工具 。但是现在公司不让用微信、QQ、钉钉等通讯软件,要求使用公司自研的通讯软件,这样就不能使…

EMQX 实践

MQTT 核心概念 发布订阅 MQTT 基于发布订阅模式,它解耦了消息的发送方(发布者)和接收方(订阅者),引入了一个中间代理的角色来完成消息的路由和分发。发布者和订阅者不需要知道彼此的存在,他们…

IIS上部署.netcore WebApi项目及swagger

.netcore项目一般是直接双击exe文件,运行服务,今天有个需求,需要把.netcore项目运行在IIS上,遇到了一个小坑,在这里记录一下。 安装IIS,怎么部署站点,这些过于简单就不细说了,不知道…

java学习之路-方法讲解

目录 1.方法概念及使用 1.1什么是方法 1.2方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系(重要) 1.5 没有返回值的方法 2.方法重载 3.方法递归 3.1递归概念 3.2递归执行过程分析 3.3递归练习 代码示例1 代码示例2 1.方法概念及使用 1.1什么是方法 方法就是…

ipad电容笔有必要买吗?怎么选?四大缺陷弊端要严防!

电容笔有没有必要买还是得看我们个人的使用需求,如果平时做笔记、画画比较多的话,还是值得入手的,原装笔是好,但对于一些预算不多的朋友来说,价格还是过于高了,不是很划算。而且我们国内市场的平替电容笔也…

【Linux】基础 IO(文件系统 inode 软硬链接)-- 详解

一、理解文件系统 1、前言 我们一直都在说打开的文件,磁盘中包含了上百万个文件,肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件,下面重点谈谈未打开的文件。 我们知道打开的文件是通过操作系统被进程打开&am…

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

【Oracle篇】一文搞清exp/imp逻辑迁移工具的用法(第一篇,总共四篇)

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…