做爬虫或者自动化测试的朋友,肯定绕不开验证码这个东西。网站为了防机器人,各种奇葩的验证码层出不穷:字符验证码、滑块验证码、点选验证码、图形计算题验证码,每一个都能把自动化脚本卡死。很多人第一反应是找打码平台或者付费API,但如果是个人项目或者量不大,自己做个简单的验证码识别软件其实也不难。今天就聊聊验证码识别的基本原理和几种实现方案,帮你选适合自己的技术路线。
最常见的验证码是字符验证码,就是一张图片里有几个歪歪扭扭的数字和字母,有的还带干扰线和干扰点。这种验证码的识别流程一般分几步:第一步是图片预处理,把彩色图转灰度图,再做二值化把字符和背景分开;第二步是去噪,把干扰线和干扰点去掉;第三步是字符分割,把连在一起的字符切开成单个字符;第四步是字符识别,把每个小图对应成具体的字母或数字。这四步里,预处理和分割的效果直接决定了识别率,很多时候识别不准不是算法不行,而是前面的图没处理好。
传统的字符识别方案是Tesseract OCR配合图像处理。Python里有pytesseract库,几行代码就能调用Tesseract识别图片里的文字。不过直接喂原图给Tesseract效果很差,必须做预处理:用Pillow或OpenCV把图片转灰度,用阈值二值化,再用形态学操作(腐蚀、膨胀)去掉干扰点,把字符处理成清晰的黑白图,Tesseract的识别率才能上去。对于简单的纯数字验证码,调调参数之后能做到80%以上的识别率,足够应付大部分个人项目了。
如果传统OCR效果不好,比如字符有旋转、严重粘连或者背景特别乱,那就得上机器学习了。最简单的是训练一个支持向量机(SVM)或者KNN分类器:先收集一批验证码样本,手工标注每个字符,把分割好的单个字符图提取特征(比如像素值、投影直方图),训练一个分类模型。识别的时候,新验证码做同样的预处理和分割,用训练好的模型预测每个字符是什么。这种方案的优点是训练成本低,几百个样本就能训出不错的效果,缺点是需要自己做数据标注,而且换一种验证码格式就得重新收集样本重训。
现在最流行的方案是用深度学习的CNN卷积神经网络,甚至不用做字符分割,直接端到端识别整张验证码。常用的架构是CRNN(CNN+RNN+CTC),输入一张验证码图,直接输出一串字符,连分割步骤都省了。用PyTorch或TensorFlow搭个简单的CRNN模型,几千张标注样本训练几个小时,识别率就能到95%以上,对付复杂的字符验证码绰绰有余。如果不想自己训练,可以用现成的开源项目比如ddddocr,这个项目作者训好了通用字符识别模型,pip安装之后两三行代码就能用,对常见的中文网站验证码效果特别好,新手福音。
除了字符验证码,现在很多网站用的是滑块验证码和点选验证码。滑块验证码的思路是用OpenCV做缺口检测,找到背景图里的缺口位置,然后用Selenium或Playwright模拟拖动滑块,注意拖动轨迹不能太匀速,要模拟人的速度变化(先加速后减速,偶尔抖一下),不然会被检测出来是机器人。点选验证码(比如"请依次点击图中的苹果、西瓜、香蕉")就比较麻烦了,需要用图像识别或者目标检测模型(比如YOLO)找到每个物体的位置,再模拟依次点击。这类行为验证码现在有第三方的打码平台可以接,比如超级鹰、打码兔,按次收费,自己做的话技术门槛比较高。
最后提一下法律和合规问题。验证码识别技术本身是中性的,但用来做什么很关键。做自己网站的测试自动化、做学术研究、做辅助残障人士的无障碍工具,这些都是没问题的。但如果是用来恶意刷票、批量注册账号、爬取别人网站的数据牟利,那就可能违反《反不正当竞争法》甚至《刑法》了,别为了省几个钱或者图好玩踩红线。技术要用在正道上,这是做技术的基本底线。
上一篇:澳大利亚音乐榜单封杀AI歌曲
下一篇:没有了