前言
上一篇文章写了自己搭建环境、处理图片、识别验证码等具体操作(上一篇文章地址)。对于没有经验的小伙伴来说,还是比较麻烦的,而且如果训练集处理的不好,识别率会非常低,所以上一篇文章可以作为学习参考,使用的话,我个人觉得本篇文章比较适合入手。
首先感谢大佬的开源模块《带带弟弟OCR通用验证码识别SDK免费开源版》
地址:https://pypi.org/project/ddddocr/
DDDDocr介绍
ddddocr是由sml2h3开发的专为验证码厂商进行对自家新版本验证码难易强度进行验证的一个python库,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。
ddddocr奉行着开箱即用、最简依赖的理念,尽量减少用户的配置和使用成本,希望给每一位测试者带来舒适的体验
项目地址: https://github.com/sml2h3/ddddocr
搭建准备工作
1.python3.9以下环境 (直接百度一大堆)
2.Windows/Linux/Macos(暂时不支持Macbook M1(X),M1(X)用户需要自己编译onnxruntime才可以使用)
3.需要用的的库
pip install uvicorn
pip install fastapi
pip install base64
pip install ddddocr
pip install PIL
准备工作做完,可以直接上代码了
代码实现
import uvicorn
from fastapi import FastAPI, Body
import base64
import ddddocr
from io import BytesIO
from PIL import Image
app = FastAPI(title='文档', description='by:juzi', version="1.0.4")@app.post("/code", summary='识别图片内文字/字母', description='普通图片验证码识别,上传图片的Base64编码', tags=['图片验证码识别'])defidentify_GeneralCAPTCHA(ImageBase64:str= Body(..., title='验证码图片Bse64文本', embed=True)):
base64_data = base64.b64decode(ImageBase64)
ocr = ddddocr.DdddOcr(show_ad=False)
res = ocr.classification(base64_data)return{"result": res}@app.post("/math", summary='识别算术验证码', description='算术题验证码识别,上传图片的Base64编码,提供两个返回,solution_result为识别结果', tags=['图片验证码识别'])defidentify_ArithmeticCAPTCHA(ImageBase64:str= Body(..., title='验证码图片Bse64文本', embed=True)):
base64_data = base64.b64decode(ImageBase64)
ocr = ddddocr.DdddOcr(show_ad=False)
res = ocr.classification(base64_data)print("res:---------->"+ res)if"+"or'-'or'x'or'/'or'÷'or'*'notin res:
zhi ="Calculation error"if'+'in res:
a = res.split('+')[0]
b = res.split('+')[1]
zhi =int(a)+int(b)if'-'in res:
a = res.split('-')[0]
b = res.split('-')[1]
zhi =int(a)-int(b)if'x'in res:
a = res.split('x')[0]
b = res.split('x')[1]
zhi =int(a)*int(b)if'/'in res:
a = res.split('/')[0]
b = res.split('/')[1]
zhi =int(a)/int(b)if'÷'in res:
a = res.split('÷')[0]
b = res.split('÷')[1]
zhi =int(a)/int(b)if'*'in res:
a = res.split('*')[0]
b = res.split('*')[1]
zhi =int(a)*int(b)return{"solution_result": zhi,"raw_result": res
}if __name__ =='__main__':# swagger地址:http://localhost:6688/docs
uvicorn.run(app, port=6688, host="0.0.0.0")
直接启动main函数,即可开始识别操作。
项目可以部署到服务器上,这样就只用搭建一次,随处调用
(此处因篇幅问题,只列举了字符和算数识别的代码。若需要滑块,点选等代码可以私聊作者)
效果测试
本次我用的是java来测试,模拟在爬虫时遇到的某网站图片验证码识别。
测试代码:
publicstaticvoidmain(String[] args){String validateUrl ="http://127.0.0.1:6688/code";//python项目启动的端口和路径String codeUrl ="*****"//该地址为图片验证码路径,此处不做展示,请自行寻找测试;String localSavePath ="D://codeTest.jpg";saveImage(codeUrl, localSavePath);String imgBase64 =GetImageStr(localSavePath);JSONObject requestBody =newJSONObject();
requestBody.put("ImageBase64", imgBase64);System.out.println(MyUtils.sendPost(validateUrl, requestBody.toJSONString(),null));}/**
* 保存接口响应图片
*
* @param codeRul :验证码接口地址
* @param savePath :本地保存地址
*/publicstaticvoidsaveImage(String codeRul,String savePath){try{OkHttpClient client =newOkHttpClient();Request request =newRequest.Builder().url(codeRul).get().build();// 将字节数组转化为流InputStream inputStream = client.newCall(request).execute().body().byteStream();OutputStream os =null;// 100K的数据缓冲byte[] bs =newbyte[102400];// 读取到的数据长度int len;// 保存图片
os =newFileOutputStream(savePath);// 开始读取while((len = inputStream.read(bs))!=-1){
os.write(bs,0, len);}}catch(Exception e){System.out.println("保存失败");
e.printStackTrace();}}/**
* 图片转化成base64字符串
*
* @param imgPath :图片绝对路径
* @return base64字符串
*/publicstaticStringGetImageStr(String imgPath){// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理String imgFile = imgPath;// 待处理的图片InputStream in =null;byte[] data =null;String encode =null;// 返回Base64编码过的字节数组字符串// 对字节数组Base64编码BASE64Encoder encoder =newBASE64Encoder();try{// 读取图片字节数组
in =newFileInputStream(imgFile);
data =newbyte[in.available()];
in.read(data);
encode = encoder.encode(data);}catch(IOException e){
e.printStackTrace();}finally{try{
in.close();}catch(IOException e){}}return encode;}
运行结果:
可以看出,即使是有干扰的图片,该接口也可以迅速且准确的识别出来。
觉得本文对您有帮助的话,请动动发财的小手点个赞支持~
版权归原作者 小小白ovo 所有, 如有侵权,请联系我们删除。