Selenium遇到验证码问题小结
想来想去,还是趁热打铁,赶紧把这些图形验证码的小结写下来,生怕以后忘记了。
问题描述:
公司内部有一套门禁系统,上线应该有几年了。当然,这是所有系统的通病,一旦时间长了,各种垃圾就存在了,比如卡账户管理,有的人离职很久了,但是卡一致未注销,或者有的新员工,直接用离职人的卡了,这些就会存在不少的漏洞。或者,安装了门禁,怎么查看异常纪录。
如果单纯的靠人来管理,说句良心话,没办法坚持下来,如果,每周定期查看报告,定期检查员工在职状况,如果系统提供了接口,说不定可以弄个二开。像我们现在用的这套系统,用的是ANFC的,前后端代码加密,根本获取不到数据。难为门禁系统的管理员了。
当然,有盾就有矛。管理的同事找到了我,希望能够进行提升,自然不能袖手旁观。针对这样的系统,在没有任何接口的情况下,我想到了Selenium, 这个工具本来是用来进行自动化测试的。只要能够获取数据,都无所谓了,委屈Selenium啦。
问题来了,在进行自动登录的时候,遇到了图形验证码,我花了很多时间,还算找到了一个相对简单的办法,验证码是长这个样子的。
处理过程:
遇到验证码的问题,主要是考虑了两个思路和方向:
- 自己对图片进行处理,然后通过算法进行识别
- 调用第三方接口进行识别
针对第1个思路,我大概的从网上了解了一下,很大一部分是进行数学建模处理,这条路行不通,不是搞算法的 :(
针对第2个思路,大致了解了一些方向,主要分为两个:
- 利用Python自带的开源控件Tesseract
- 调用Web端第三方接口,目前很多大厂都有这样的OCR识别服务,综合比较,我选择了百度的paddlepaddle, 记得好像简单的服务每天可以免费调用5W次,具体的官网有说明,我这个层次应该是够啦。
当然,我是首选了Tesseract, 开源,独立组件,安装简单。步骤如下:
- 从官网获取Tesseract 3.0版本,当然要pip install pytesseract, 建议指向国内镜像站
- 配置环境变量
- 调用的简单步骤如下:
import pytesseract
from PIL import Image,ImageEnhance
image = Image.open('.\sample\\14.png')
result1 = pytesseract.image_to_string(image,lang='num') #对去噪后的图片进行识别,如果使用默认库,去除lang=’num’
print(result1)
真的很简单,然后开始进行测试。然而,测试结果惨不忍睹,我估计能有5%的识别率吧,说白了,靠运气。说明一下:识别的图片是要进行预处理的,处理的方法包括转化为灰度图,二值化,简单的去除噪点,这些应该都是标准的预处理步骤吧。
对于这样的测试结果,自然不能令人满意。然后,想到了Tesseract训练,官网连接如下:
https://tesseract-ocr.github.io/tessdoc/AddOns
大概的百度了一下,好像用jTessBoxEditor比较主流,根据使用下来的经验,建议推荐使用2.3非FX版本,FX版本好像存在后期无法调整识别框的问题,用了2.3的版本就好了。
网上也有完整的jTessBoxEditor的教程,我感觉参照这两个步骤做的话,jTessBoxEditor问题不大
链接如下:
Tesseract-OCR 图片数字识别的样本训练_大大卷的博客-CSDN博客
这上面两个步骤,我是验证过的,都是可行的。
数据训练好了,放到安装目录的tessdata下面,开始进行测试了。大致的测试了30个验证码,能有4个左右正确识别了,预估识别率能有15%. 应该说,比之前的5%有很大提升,但是还没有达到要求。自然,我转向了aipocr.
调用Aipocr大致步骤,可以百度搜索一下,网上比较多的,主要就是申请APP_ID,API_KEY,SECReT_KEY.
代码如下:
import os
import cv2
from aip import AipOcr
""" 你的 APPID AK SK 图2的内容"""
APP_ID = '********'
API_KEY = '***********************'
SECRET_KEY = '*****************************'
os.environ['https_proxy'] = *.*.*.*:*' #企业内通过代理上网需要配置代理服务器
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
fname = 'sample/Train/18s2.tif'
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content(fname)
""" 调用通用文字识别, 图片参数为本地图片 """
results = client.general(image)["words_result"] # 还可以使用身份证驾驶证模板,直接得到字典对应所需字段
img = cv2.imread(fname)
for result in results:
text = result["words"]
location = result["location"]
print(text)
# 画矩形框
cv2.rectangle(img, (location["left"],location["top"]), (location["left"]+location["width"],location["top"]+location["height"]), (0,255,0), 2)
cv2.imwrite(fname[:-4]+"_result.jpg", img)
AipOcr测试下来,识别率惊人,基本可以达到80%的成功率,这可不是一点点的提高~
在测试aipocr的中,遇到了代理的问题,事实上,aipocr是支持代理的,配置一下代理即可,不过,这个也很关键。
综合识别率对比,最终选择了百度的aipocr作为识别接口。
小结:
通过这个验证码识别的问题,大致的了解了目前图像识别的一些方法和思路,水平有限,都是一些基础的东西,希望能够给入门的读者一些思路上的参考。其中,也有一些自己的体会:
- 目前百度的aipocr真的厉害,还支持图像人物识别等,如果在这个基础上,还是可以做一些深入的应用,如果aipocr能过识别人物衣物帽子等,工厂安全帽检查是不是就可以简单的通过摄像头以及aipocr实现监控了?这个玩法很多,还需要去挖掘。
- Tesseract用在标准OCR识别上应该还是可以的,一些特殊的识别可以用过训练来进行。