Python实现数字验证码自动识别与网页表单填写

Chloe
Chloe
发布时间:2026-10-12| 2人浏览过
原创

详细演示如何利用Python结合Pillow、Scikit-learn与Selenium,完成从验证码图像预处理、SVM分类器训练到自动化浏览器填写表单的全链路流程,并附带持久化调用与异常回退方案。

核心环境与依赖准备

第1步:安装基础依赖库

项目依赖图像处理、机器学习分类器及浏览器自动化三大组件。在虚拟环境中执行以下命令即可完成初始化:

pip install Pillow scikit-learn joblib selenium

说明:Pillow负责图像读写与像素操作,scikit-learn提供轻量级分类模型,joblib用于模型序列化存储,selenium驱动浏览器进行页面交互。

图像预处理与数据规范

第2步:编写图像加载与标准化函数

数字验证码通常具有固定字体与干扰线。为降低模型复杂度,需统一转换为灰度图、去除背景噪声、二值化切割,并将尺寸归一化至特征向量标准长度。

from PIL import Image
import numpy as np

def preprocess_image(image_path, target_size=(20, 20)):
    # 以灰度模式打开并调整尺寸
    image = Image.open(image_path).convert('L').resize(target_size)
    # 简单阈值二值化:亮度低于128视为前景黑色,其余置白
    image = image.point(lambda x: 0 if x < 128 else 255)
    # 展平为一维数组并缩放到[0,1]区间
    return np.array(image).flatten() / 255.0

目的:将任意分辨率的原图压缩为定长特征向量,消除光照与尺寸波动对分类器的干扰。

SVM模型训练与参数固化

第3步:批量读取数据集并拟合分类器

假设训练样本存放于 training_data/ 目录,文件命名规则为 {数字}_xxx.png(例如 3_abc.png)。按顺序扫描文件夹,提取标签并训练支持向量机:

from sklearn import svm
import os

X_train = []
y_train = []

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

# 使用默认参数的SVC进行分类学习
clf = svm.SVC()
clf.fit(X_train, y_train)

第4步:保存与调用持久化模型

每次启动服务前重新训练会显著增加耗时。推荐使用 joblib 将训练好的权重导出为二进制文件,后续直接加载调用:

from joblib import dump, load

# 训练完成后保存
# dump(clf, 'captcha_model.joblib')

# 运行阶段加载
clf = load('captcha_model.joblib')

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

完成状态:控制台打印出预测结果即表示模型已具备推理能力,可接入上层业务逻辑。

自动化识别与表单填写实战

第5步:集成Selenium控制浏览器抓取验证图

将识别模块嵌入自动化流程前,请务必备份相关账号凭据,并在测试域名或非生产环境验证。部分站点检测到自动化工具会拦截请求,请遵守当地法律法规与网站使用协议。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import time

# 初始化驱动(需配合对应版本的chromedriver)
driver = webdriver.Chrome(service=Service())
driver.get("https://example.com/login")

# 定位验证码元素并截图保存
captcha_el = driver.find_element(By.ID, "captcha_image")
captcha_el.screenshot("target_captcha.png")

# 调用前述预测函数
captcha_text = predict_captcha("target_captcha.png")
print("识别结果:", captcha_text)

# 填入输入框并提交
input_box = driver.find_element(By.ID, "captcha_input")
input_box.clear()
input_box.send_keys(captcha_text)

driver.find_element(By.ID, "submit_btn").click()
time.sleep(3)

异常处理与性能优化建议

关键风险控制与备选交互

网络延迟、元素定位失败或置信度过低均会导致流程中断。建议在循环调用处包裹异常捕获,并提供降级策略:

try:
    text = predict_captcha("target_captcha.png")
    driver.find_element(By.ID, "captcha_input").send_keys(text)
except Exception as e:
    print("自动识别失败,记录日志并重试或转入人工复核:", e)
    # 可在此处添加刷新验证码按钮点击逻辑或等待用户手动干预

若业务对准确率要求较高,可进一步采用数据增强(随机旋转、平移、加噪)扩充样本池,或替换为轻量级卷积神经网络(CNN)替代SVM。对于高频调用的场景,建议使用多线程池预加载模型,并将静态资源缓存至本地磁盘以减少I/O开销。

总结

通过标准化的图像二值化流程搭配轻量级SVM模型,即可快速搭建数字验证码识别管道;结合Selenium完成元素定位、截图与表单回填后,能大幅降低重复性人工操作成本。合理引入模型持久化、异常捕获与降级回退机制,可保障脚本在复杂网络环境下的稳定运行。以上就是 Python 实现数字验证码自动识别与网页表单填写的详细内容,更多关于 Python 自动化脚本与机器学习实战的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。