python数字验证码自动识别

news2025/1/16 13:50:14

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

在网络上,许多网站和应用程序使用验证码(Completely Automated Public Turing test to tell Computers and Humans Apart)来防止机器人和自动程序进行恶意操作。验证码是一种通过图像或音频提出的问题,要求用户提供答案以证明其为人类。在这篇文章中,我们将学习如何使用Python来自动识别数字验证码,以便在需要时自动填写或验证验证码。

1. 准备工作

首先,我们需要安装一些Python库来处理图像和进行机器学习。我们将使用Pillow库来处理图像,以及Scikit-learn库来实现机器学习模型。确保你已经安装了这些库:

pip install Pillow scikit-learn

2. 数据集

我们需要一个包含数字验证码图像的数据集来训练我们的模型。你可以在网上找到或自己创建一个数据集。确保数据集包含足够的图像样本,并且每个图像都包含一个清晰可识别的数字。

3. 图像预处理

在训练模型之前,我们需要对图像进行预处理。这包括将图像转换为灰度图像、去除噪声以及标准化图像大小。以下是一个简单的图像预处理函数:

from PIL import Image
import numpy as np

def preprocess_image(image_path, target_size=(20, 20)):
    image = Image.open(image_path).convert('L')  # 转换为灰度图像
    image = image.point(lambda x: 0 if x < 128 else 255)  # 二值化
    image = image.resize(target_size)  # 调整大小
    image_array = np.array(image) / 255.0  # 标准化
    return image_array.flatten()

4. 模型训练

我们将使用简单的机器学习模型(如支持向量机)来训练我们的验证码识别系统。首先,我们需要准备训练数据并训练模型:

from sklearn import svm
import os

# 准备训练数据
X_train = []
y_train = []

for filename in os.listdir('training_data'):
    if filename.endswith('.png'):
        label = filename.split('_')[0]
        image_path = os.path.join('training_data', filename)
        X_train.append(preprocess_image(image_path))
        y_train.append(label)

# 训练模型
clf = svm.SVC()
clf.fit(X_train, y_train)

5. 测试模型

一旦模型训练完成,我们可以使用测试数据来评估模型的性能。对于每个测试图像,我们将其预处理并使用训练的模型进行预测。

def predict_captcha(image_path):
    preprocessed_image = preprocess_image(image_path)
    predicted_digit = clf.predict([preprocessed_image])[0]
    return predicted_digit

# 测试模型
test_image_path = 'test_data/test_captcha.png'
predicted_digit = predict_captcha(test_image_path)
print("Predicted Digit:", predicted_digit)

6. 应用实例

验证码识别技术在实际应用中有着广泛的用途。以下是一些示例:

  • 自动登录和注册:许多网站要求用户输入验证码以验证其身份。使用验证码识别技术,我们可以自动填写验证码,从而实现自动登录或注册功能。

  • 数据采集:在进行网络数据采集时,有时需要通过验证码来访问目标网站。验证码识别可以帮助我们自动解决这些验证码,从而实现自动化数据采集。

  • 安全测试:在进行网络安全测试时,验证码识别技术可以用于测试网站的验证码系统是否安全可靠。通过模拟攻击并尝试破解验证码,可以评估网站的安全性。

  • 反垃圾邮件:验证码可以用于防止自动化程序发送垃圾邮件。验证码识别技术可以帮助邮件服务提供商过滤掉垃圾邮件中的验证码,从而提高反垃圾邮件的效果。

7. 改进和优化

虽然上面的示例提供了一个基本的验证码识别方案,但在实际应用中可能需要进行改进和优化。一些改进的方法包括:

  • 数据增强:通过对训练数据进行旋转、缩放和平移等变换,可以增加数据的多样性,从而提高模型的泛化能力。

  • 深度学习模型:使用深度学习模型(如卷积神经网络)可以在一定程度上提高验证码识别的准确率,特别是在处理复杂的验证码时。

  • 模型集成:将多个不同模型的预测结果进行集成可以进一步提高识别准确率,例如使用投票或加权平均等方法。

  • 实时性能优化:在实际应用中,需要考虑识别速度和资源消耗。通过优化模型和算法,可以提高识别速度并降低系统资源的消耗。

当我们进一步思考验证码识别的实际应用时,可以考虑以下情景:一个网站要求用户填写一个验证码才能进行登录。我们可以编写一个Python脚本,使用Selenium自动打开网页、截取验证码图像,并通过之前训练好的模型识别验证码,最后自动填写验证码并完成登录操作。

下面是一个简单的示例代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from PIL import Image
import numpy as np
from sklearn import svm

# 加载训练好的模型
clf = svm.SVC()
clf.load('captcha_model.pkl')

# 打开网页
driver = webdriver.Chrome()
driver.get("http://example.com/login")

# 截取验证码图像并识别
captcha_element = driver.find_element_by_xpath("//img[@id='captcha_image']")
captcha_element.screenshot('captcha.png')

def preprocess_image(image_path, target_size=(20, 20)):
    image = Image.open(image_path).convert('L')
    image = image.point(lambda x: 0 if x < 128 else 255)
    image = image.resize(target_size)
    image_array = np.array(image) / 255.0
    return image_array.flatten()

def predict_captcha(image_path):
    preprocessed_image = preprocess_image(image_path)
    predicted_digit = clf.predict([preprocessed_image])[0]
    return predicted_digit

captcha_text = predict_captcha('captcha.png')

# 输入验证码并提交表单
captcha_input = driver.find_element_by_xpath("//input[@id='captcha_input']")
captcha_input.send_keys(captcha_text)

username_input = driver.find_element_by_xpath("//input[@id='username']")
password_input = driver.find_element_by_xpath("//input[@id='password']")

username_input.send_keys("your_username")
password_input.send_keys("your_password")

login_button = driver.find_element_by_xpath("//button[@id='login_button']")
login_button.click()

time.sleep(5)  # 等待页面加载完成

在这个示例中,我们使用了Selenium库来控制浏览器进行自动化操作,包括打开网页、找到验证码元素、截取验证码图像等。然后,我们使用之前训练好的模型对验证码图像进行识别,获取验证码文本。最后,我们自动填写验证码并提交登录表单。

这只是一个简单的示例,实际应用中可能需要考虑更多的异常情况处理、验证码刷新机制等。但通过这个示例,你可以了解如何将验证码识别技术应用到实际的自动化任务中。

在继续的示例中,我们可以添加一些额外的功能来提高代码的健壮性和可扩展性。这些功能包括错误处理、验证码刷新和持久化模型等。

8. 错误处理

在实际应用中,可能会遇到各种网络问题、元素定位失败或验证码识别错误等情况。为了增加代码的稳定性,我们可以添加适当的错误处理机制,例如使用try-except块来捕获异常并采取相应的措施。

try:
    # 识别验证码并填写
    captcha_text = predict_captcha('captcha.png')
    captcha_input = driver.find_element_by_xpath("//input[@id='captcha_input']")
    captcha_input.send_keys(captcha_text)
except Exception as e:
    print("Error:", e)
    # 处理验证码识别失败的情况,例如重新加载验证码图片或手动输入验证码

9. 验证码刷新

有些网站可能会提供刷新验证码的功能,为了应对这种情况,我们可以在识别验证码前尝试点击刷新按钮来获取新的验证码图像。

refresh_button = driver.find_element_by_xpath("//button[@id='refresh_button']")
refresh_button.click()
time.sleep(1)  # 等待新验证码加载完成

10. 持久化模型

为了避免每次运行脚本时都重新训练模型,我们可以将训练好的模型保存到文件中,并在需要时加载。

from joblib import dump, load

# 保存模型
dump(clf, 'captcha_model.joblib')

# 加载模型
clf = load('captcha_model.joblib')

通过将以上功能添加到我们的代码中,我们可以使验证码识别脚本更加稳健和灵活,从而适应不同网站和各种异常情况的处理。

在继续的示例中,我们可以进一步考虑优化验证码识别的准确性和稳定性,以及增加用户交互的功能。

11. 验证码识别准确性优化

为了进一步提高验证码识别的准确性,可以尝试以下方法:

  • 模型调参:调整支持向量机等机器学习模型的参数,如C值和核函数,以优化模型性能。

  • 特征工程:对图像进行更复杂的特征提取,如局部二值模式(Local Binary Patterns)或特征金字塔等,以增加模型的特征表示能力。

  • 数据增强:使用图像增强技术(如旋转、平移、缩放、反转等)扩充训练数据集,以增加模型的鲁棒性。

12. 用户交互功能

为了增加用户交互的功能,我们可以添加一些用户界面元素,例如提示用户手动输入验证码或选择点击刷新按钮。

manual_input = input("Enter the captcha text manually: ")
captcha_input = driver.find_element_by_xpath("//input[@id='captcha_input']")
captcha_input.send_keys(manual_input)

通过这种方式,即使验证码识别失败,用户仍然可以通过手动输入验证码的方式继续操作。

13. 自动化登录和错误处理

最后,我们可以将自动化登录和错误处理代码整合到一个函数中,以便在不同的场景下调用。

def login(username, password):
    try:
        driver.get("http://example.com/login")
        # 其他登录步骤...
        captcha_text = predict_captcha('captcha.png')
        captcha_input = driver.find_element_by_xpath("//input[@id='captcha_input']")
        captcha_input.send_keys(captcha_text)
        # 其他填写表单步骤...
        login_button = driver.find_element_by_xpath("//button[@id='login_button']")
        login_button.click()
        time.sleep(5)  # 等待页面加载完成
    except Exception as e:
        print("Login failed:", e)
        # 处理登录失败的情况...

# 调用登录函数
login("your_username", "your_password")

通过以上改进,我们可以使验证码识别脚本更加健壮和灵活,以适应不同的应用场景和用户需求。同时,这些改进也提高了代码的可维护性和可扩展性,使其更容易应对未来的变化和需求。

总结

在本文中,我们探讨了如何使用Python来自动识别数字验证码,并将其应用于实际场景中,如自动化登录网站。我们首先介绍了验证码的概念以及为什么它们在网络安全和用户验证中如此重要。然后,我们讨论了使用Python和一些常见的库和工具(如Pillow、Scikit-learn和Selenium)来实现验证码识别的基本步骤。

我们从预处理验证码图像开始,介绍了如何将图像转换为灰度图像、二值化处理、调整大小和标准化。接下来,我们讨论了如何使用机器学习模型(如支持向量机)来训练和识别验证码。我们展示了如何准备训练数据集、训练模型,并在测试数据集上评估模型性能。

随后,我们进一步讨论了如何将验证码识别技术应用于实际场景中,具体而言是自动化登录网站。我们展示了如何使用Selenium库控制浏览器进行自动化操作,包括打开网页、截取验证码图像、识别验证码和填写表单等。

在整个过程中,我们强调了代码的健壮性和可扩展性,通过添加错误处理、验证码刷新、持久化模型和用户交互等功能来提高脚本的稳定性和灵活性。最后,我们总结了一些进一步优化验证码识别系统的方法,包括模型调参、特征工程和数据增强等。

总的来说,本文提供了一个全面的指南,帮助读者了解如何使用Python来自动识别数字验证码,并将其应用于实际项目中。验证码识别是一个具有挑战性但又充满乐趣的领域,通过不断学习和实践,我们可以不断改进和优化验证码识别系统,为网络安全和数据自动化提供更加可靠和高效的解决方案。

在这里插入图片描述

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

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

相关文章

Vue2 —— 学习(十一)

目录 一、路由 vue-router &#xff08;一&#xff09;路由与路由器 &#xff08;二&#xff09;vue-router 理解 &#xff08;三&#xff09;SPA 理解 &#xff08;四&#xff09;路由 理解 &#xff08;五&#xff09;小案例 1.About.vue 2.Home.vue 3.index.js 4…

移动端应用(APP)如何设计测试用例?

为 APP 设计测试用例需要考虑移动设备的特殊性&#xff0c;如不同的操作系统、设备尺寸、硬件特性以及应用程序自身的特定功能。 以下是为APP设计测试用例时要考虑的内容&#xff1a; 1. 理解需求 熟悉APP的功能需求、用户故事和设计文档。 确定APP的目标用户群体、使用场景…

12.Blender 界面介绍(上)及物体基础编辑操作

设置语言 首先在菜单栏打开编辑-Preferences-界面-翻译&#xff0c;可以修改语言 这里使用的是Steam上下载的4.1版本 工具栏 左边的工具栏&#xff0c;按T就会出现&#xff0c;再按T就会隐藏 右边的工具栏是按N&#xff0c;按N显示&#xff0c;再按N隐藏 旋转画面 长按鼠…

MySQL基础之单表操作(定义DDL,增删改DML,查DQL)

目录 一、概述1.1 什么是数据库1.2 连接MySQL1.3 数据模型1.4 SQL语句的分类1.5 数据类型 二、数据库设计-DDL2.1 数据库层面2.2 数据表层面创建表约束查询修改add,modify,change,drop,rename(表)删除 三、数据库操作-DML3.1 添加数据insert3.2 修改数据update3.3 删除数据dele…

做外贸与其质疑,不如脚踏实地做事

小莉说最近好多自媒体添加WhatsApp的客户都是非洲的&#xff0c;有些打电话过来都不想接&#xff0c;因为他们都是没钱的主&#xff0c;接着还截图了一个客户头像给我&#xff0c;很不耐烦地说&#xff1a;像这种抽烟的客户头像&#xff0c;一看就不是正经人&#xff0c;无论他…

土压力计:监测地下压力变化的必备工具

在土木工程、地质勘探和地下建筑等领域&#xff0c;地下土壤的力学特性对工程的稳定性和安全性起着至关重要的作用。而土压力计作为一种重要的监测设备&#xff0c;能够准确地测量地下土壤的压力变化&#xff0c;为工程设计和施工提供关键数据。本文将探讨土压力计的原理、应用…

CRAFT文字检测算法解析和基于C++和TensorRT的推理实现

本文讲解了CVPR 2019的一篇文字检测算法《Character Region Awareness for Text Detection》的原理&#xff0c;并给出我使用C和TensorRT重新实现的推理&#xff0c;速度比原版代码快12倍。 论文&#xff1a;https://arxiv.org/pdf/1904.01941.pdf 官方代码&#xff1a;https:…

echarts地图记录

小记录&#xff1a; 如果调整地图大小不管用的时候&#xff0c;看一下map的值是否为china 当值为china的时候&#xff0c;地图会加上“南海诸岛”部分&#xff0c;尝试修改map的值

Netfilter漏洞提权利用(CVE-2023-35001)

前言 Netfilter是一个用于Linux操作系统的网络数据包过滤框架&#xff0c;它提供了一种灵活的方式来管理网络数据包的流动。Netfilter允许系统管理员和开发人员控制数据包在Linux内核中的处理方式&#xff0c;以实现网络安全、网络地址转换&#xff08;Network Address Transl…

centos7搭建maven私服nexus

1.nexus Nexus Repository Manager&#xff08;通常简称 Nexus 或 Nexus RM&#xff09;是由Sonatype公司开发的一款开源的、强大的软件仓库管理工具&#xff0c;主要用于企业级的二进制组件&#xff08;如Java库、Node.js模块、Python包等&#xff09;存储、管理和分发。 官方…

定序器导出fbx到max里对位k动作

可以把场景移动到原点去k动作&#xff0c;然后可以恢复到ue4的位置 -- 定义全局变量 global CenterPoint undefined global averageCenter [0,0,0]-- 定义对话框 rollout restoreRollout "定序器>FBX>MAX" (button CreateButton "建立中心点" wid…

使用JS代理 实现大对象的功能拆解

序言 在Android开发中&#xff0c;可以通过webView的addJavascriptInterface方法注入一个对象到网页中。但是随着开发的需求越来越多。这个对象身上的方法也越来越多。这个对象对应的java类&#xff0c;体积越来越大&#xff0c;不利于维护。为了在不影响之前代码的基础上。把…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」&#xff1a;2022年北京冬奥会中国代表队&#xff0c;CSDN Top100&#xff0c;学习更多干货&#xff0c;请关注专栏《网络安全自学教程》 操作系统有4个安全目标&#xff0c;也就是说想要保证操作系统的安全&#xff0c;就必须实现这4个需求&#xff1a; 标识系统…

网络协议安全:OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

「作者简介」&#xff1a;2022年北京冬奥会中国代表队&#xff0c;CSDN Top100&#xff0c;学习更多干货&#xff0c;请关注专栏《网络安全自学教程》 这一章节我们需要知道OSI分哪七层&#xff0c;每层的作用&#xff0c;知道数据在七层模型中是怎样传输的&#xff0c;封包和解…

数据结构练习:链表扩容

大致步骤&#xff1a; 一&#xff1a;创建一个新链表&#xff0c;遍历原链表的同时&#xff0c;将原链表的值复制给新链表 二&#xff1a;将新链表插入到原链表中&#xff08;大致如下&#xff09; 注&#xff1a; 1.头结点是不存有数据的 2.记得malloc后要free 3.*&是…

男士休闲裤比较好的品牌有哪些?高品质休闲男装推荐

穿衣服最重要的并不是要求多好看多时尚&#xff0c;相信绝大部分年纪在23岁以上的男同胞们更希望穿一些简约好搭配的款式&#xff0c;更重要的其实就是要求质量耐穿&#xff0c;以及有足够好的舒适性。 但是现在市面上的品牌实在是太多了&#xff0c;而且质量也参差不齐&#x…

SpringBoot 3.x + Swagger3 踩坑实录

问题描述 维护的SpringBoot版本是3.0版本&#xff0c;翻教程的时候发现很多SpringBoot2.x版本用的都是springfox&#xff0c;但问题是在SpringBoot3.x版本后&#xff0c;逐渐不支持springfox&#xff0c;强行启动会导致异常&#xff0c;现阶段使用的Springdoc进行替换。 参考…

设计模式-六大原则

设计模式的六大原则是软件工程中的基本概念&#xff0c;使得构建可维护、可扩展和可重用的代码。 1.单一职责原则&#xff08;Single Responsibility Principle&#xff09;&#xff1a;一个类或方法应该只有一个引起变化的原因&#xff0c;确保类或模块的功能高度内聚。 案例&…

力扣数据库题库学习(4.22日)

577. 员工奖金 问题链接 思路分析 Employee表与Bonus表通过empId字段可以连接&#xff0c;需求是查出奖金少于1000的员工名和奖金值。 这里奖金少于1000的情况就是没有奖金有奖金但少于1000 这里我给出的解决方案就是使用左连接&#xff0c;将Employee表作为左表&#xff…

c++二叉树的进阶--二叉搜索树

1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它的左…