Python实现数字验证码自动识别与网页表单填写
详细演示如何利用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 自动化脚本与机器学习实战的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









