不能靠纯Python脚本稳定识别真实验证码,因其本质是反自动化设计;tesseract等OCR库仅适用于无干扰的测试场景,生产环境应优先选用打码平台API或寻找无障碍接口。

不能靠纯 Python 脚本稳定识别验证码——除非你控制服务端或使用极简、无干扰的测试验证码。真实场景中,主流网站的验证码(如滑块、点选、扭曲文字+噪点)本质是反自动化设计,Python 本地 OCR 库(tesseract、easyocr)对它们识别率极低,强行调用只会浪费时间还触发风控。
为什么 tesseract 对大多数网页验证码基本失效
验证码不是普通图片:它通常叠加了干扰线、随机色块、字符粘连、非均匀扭曲、低对比度。而 tesseract 是为清晰印刷体文本训练的,没学过“怎么从雪花里认出字母”。你喂给它的截图哪怕经过二值化、去噪,tesseract.image_to_string() 返回的也常是空字符串或乱码。
实操建议:
- 先用
cv2.imshow()或保存中间图,确认预处理后字符是否人眼可辨——如果人看着都费劲,tesseract几乎肯定失败 - 别在生产环境硬刚;若必须本地识别,只适用于你自己开发的测试页,且验证码生成逻辑可控(比如固定字体+无干扰)
- 对含中文的简单验证码,
easyocr.Reader(['ch_sim','en'])比tesseract略强,但依然扛不住旋转/透视变形
绕过识别:用打码平台 API 替代本地 OCR
真实项目中更可行的路径是调用第三方打码服务(如超级鹰、云打码),它们有人工标注池和专用模型,对常见验证码类型有稳定识别能力(收费但单价低)。
立即学习“Python免费学习笔记(深入)”;
关键步骤:
- 注册账号获取
username、password、soft_id - 用
requests.post()把验证码图片的 base64 编码发到平台接口(如http://upload.chaojiying.net/Upload/Processing.php) - 检查返回 JSON 中的
pic_str字段——这就是识别结果,直接填入表单提交 - 务必加
time.sleep(1)避免高频请求被限流;识别失败时按平台规则调用ReportError()反馈错误样本
最省事但有限制:检查目标网站是否提供无障碍接口
部分系统(尤其政务、银行内网)会暴露未鉴权的验证码获取接口,或允许通过 session 复用已识别的 token。这时根本不用 OCR:
- 用
requests.Session()先 GET 到验证码图片 URL,同时捕获响应头里的Set-Cookie或返回 JSON 中的captcha_token - 观察后续登录请求是否只需传这个 token,而非图片内容本身
- 某些接口支持
captcha_type=plain参数,强制返回明文验证码(仅限调试环境)
真正卡住的从来不是代码怎么写,而是你得先确认:这个验证码是“能被程序读”的,还是“故意不让程序读”的。前者调 API 或改参数就行,后者硬上 OCR 就是拿锤子敲 CPU 散热器——声音大,没用。


















