后来我试了CNN,准确率能到95%+,但问题也明显:要GPU、要装tensorflow或pytorch,环境一不小心就炸。对于简单的字母验证码(比如4位、纯大写或大小写混合、背景干扰不多),杀鸡其实用不上牛刀。KNN(K近邻)这个老古董,在这类场景里意外好使。不需要深度学习那一堆依赖,纯Python + numpy + opencv就能跑,甚至可以在树莓派上训练。缺点是字符必须是分割好的,粘连的那种不行。但绝大多数简单的web验证码,字符间隙足够分离。本文不吹理论,只记录我是怎么一步步把验证码从“下载 - 预处理 - 切割 - 特征提取 - KNN训练 - 识别”这条链路搭建起来的。所有代码我都亲自跑过,坑也都踩过,希望对你有用。目录第一章:先搞定验证码样本采集1.1 伪造请求头与IP轮换1.2 批量下载 自动打标签第二章:图像预处理 —— 让验证码“洗干净”2.1 灰度化 + 二值化2.2 去除噪点和干扰线(重点)2.3 字符分割(垂直投影法)第三章:特征工程 —— KNN能“看懂”什么3.1 两种我实践过有效的特征3.2 构建训练数据集3.3 训练KNN与超参数调优第四章:把模型集成到爬虫中4.1 保存模型与特征器4.2 爬虫端完整识别流程第一章:先搞定验证码样本采集要训练,必须先有数据。爬虫每天遇到的最大问题是:验证码一般会变化背景、字体、干扰线,所以样本数量不能太少。我自己的经验是:每个字符(0-9,A-Z,看需求)至少要采集100个以上的切片样本,才会比较稳。1.1 伪造请求头与IP轮换大多数验证码接口会有简单的反爬,比如检查User-Agent、Referer。我还遇到过同IP一分钟内请求超过30次就弹一个复杂验证码的情况。先写一个下载脚本:pythonimport requests import time import random from fake_useragent import UserAgent ua = UserAgent() def download_captcha(save_path, url_template, session=None):