Python中如何解决验证码识别难题?

最近想实现这样一需求,全自动登录网站,获取某些内容,保存为 mht 格式文件,上传至 windows 共享文件夹。
现已实现半自动登录,但需要用户手工输入验证码,想用程序实现全自动化。网上搜索各类代码,发现对于验证码的识别酷似难度极高,作为一个业余选手,颇感压力山大。
求大家伙目测此验证码识别的难度如何?
期待能给出 demo 的代码,万分感谢。
也期待能给出一些提纲性的指引。
验证码地址: https://www.cqccms.com.cn/workspace/Captcha.jpg
Python中如何解决验证码识别难题?


14 回复

接入打码平台


import pytesseract
from PIL import Image
import cv2
import numpy as np

def preprocess_image(image_path):
    """预处理验证码图片"""
    # 读取图片
    img = cv2.imread(image_path)
    
    # 转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 二值化处理
    _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    
    # 降噪处理
    denoised = cv2.medianBlur(thresh, 3)
    
    return denoised

def recognize_captcha(image_path):
    """识别验证码主函数"""
    # 预处理图片
    processed_img = preprocess_image(image_path)
    
    # 使用pytesseract识别
    config = '--psm 8 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    text = pytesseract.image_to_string(processed_img, config=config)
    
    return text.strip()

def recognize_with_cnn(image_path, model_path=None):
    """使用CNN模型识别(示例结构)"""
    import tensorflow as tf
    from tensorflow import keras
    
    # 加载预处理后的图片
    img = preprocess_image(image_path)
    img = cv2.resize(img, (100, 40))  # 调整到模型输入尺寸
    img = img.reshape(1, 40, 100, 1) / 255.0  # 归一化
    
    # 构建简单CNN模型(实际使用时需要训练好的模型)
    if model_path:
        model = keras.models.load_model(model_path)
    else:
        # 示例模型结构
        model = keras.Sequential([
            keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(40,100,1)),
            keras.layers.MaxPooling2D((2,2)),
            keras.layers.Conv2D(64, (3,3), activation='relu'),
            keras.layers.Flatten(),
            keras.layers.Dense(64, activation='relu'),
            keras.layers.Dense(36, activation='softmax')  # 26字母+10数字
        ])
    
    predictions = model.predict(img)
    # 这里需要根据实际模型输出解码
    return predictions

# 使用示例
if __name__ == "__main__":
    # 方法1: 传统OCR
    result = recognize_captcha("captcha.png")
    print(f"OCR识别结果: {result}")
    
    # 方法2: 机器学习方法
    # 需要先训练模型,这里只是展示结构
    # result_cnn = recognize_with_cnn("captcha.png")

验证码识别主要有几种方案:

  1. 传统OCR方法:用pytesseract等库,适合简单验证码。先做灰度化、二值化、降噪等预处理,再识别。

  2. 机器学习方法:用CNN等模型训练自己的识别器,适合复杂验证码。需要收集标注数据训练。

  3. 第三方API:用打码平台的服务,省事但花钱。

简单验证码用pytesseract预处理后就能搞定,复杂的得自己训练模型。

总结:根据验证码复杂度选方案。

这种空心的不怎么好搞…难度略高,Google 家的 tesseract 应该不能直接搞定。
如果不能搞定的话自己处理就比较复杂了,这方面的博文有很多你可以自己去找一找。
不行的话就直接买打码服务就好,量不大的话也花不了多少钱

多收集点验证码做训练数据,然后用机器学习来搞

验证码识别, 如何正确切割是很重要的, 一般来说, 如果能正确切割。 用现在深度学习算法, 像这一种弯曲度很低的验证码很容易达到可用的正确率。

放弃破解吧,接入打码平台

打码平台

安利一波自己实现的
https://github.com/kylingit/Captcha_recognize

验证码不是通用的,重要的是思路

思路不错,赞

这种还不算难。 比较好切割。
用简单的卷积神经网络应该有能接受的准确度。

看了下,这种还算比较好处理,英文数字的倾斜程度都是一样的,噪点和干扰线也比较明显。
二值化再比对下,当然了,连在一起的就不好玩了。
量小的话可以买验证码 api
或者你可以手动登录一次,记下 cookie,定时刷新以保证在线(固定过期时间的除外)

多刷几张验证码图片,你会发现这验证码很有特点。

回到顶部