Selenium遇到验证码问题小结

Selenium遇到验证码问题小结

想来想去,还是趁热打铁,赶紧把这些图形验证码的小结写下来,生怕以后忘记了。

问题描述:

         公司内部有一套门禁系统,上线应该有几年了。当然,这是所有系统的通病,一旦时间长了,各种垃圾就存在了,比如卡账户管理,有的人离职很久了,但是卡一致未注销,或者有的新员工,直接用离职人的卡了,这些就会存在不少的漏洞。或者,安装了门禁,怎么查看异常纪录。

        如果单纯的靠人来管理,说句良心话,没办法坚持下来,如果,每周定期查看报告,定期检查员工在职状况,如果系统提供了接口,说不定可以弄个二开。像我们现在用的这套系统,用的是ANFC的,前后端代码加密,根本获取不到数据。难为门禁系统的管理员了。

       当然,有盾就有矛。管理的同事找到了我,希望能够进行提升,自然不能袖手旁观。针对这样的系统,在没有任何接口的情况下,我想到了Selenium, 这个工具本来是用来进行自动化测试的。只要能够获取数据,都无所谓了,委屈Selenium啦。

       问题来了,在进行自动登录的时候,遇到了图形验证码,我花了很多时间,还算找到了一个相对简单的办法,验证码是长这个样子的。

 

处理过程:

遇到验证码的问题,主要是考虑了两个思路和方向:

  1. 自己对图片进行处理,然后通过算法进行识别
  2. 调用第三方接口进行识别

针对第1个思路,我大概的从网上了解了一下,很大一部分是进行数学建模处理,这条路行不通,不是搞算法的 :(

针对第2个思路,大致了解了一些方向,主要分为两个:

  1. 利用Python自带的开源控件Tesseract
  2. 调用Web端第三方接口,目前很多大厂都有这样的OCR识别服务,综合比较,我选择了百度的paddlepaddle, 记得好像简单的服务每天可以免费调用5W次,具体的官网有说明,我这个层次应该是够啦。

 

当然,我是首选了Tesseract, 开源,独立组件,安装简单。步骤如下:

  1. 从官网获取Tesseract 3.0版本,当然要pip install pytesseract, 建议指向国内镜像站
  2. 配置环境变量
  3. 调用的简单步骤如下:

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验证码识别率

        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作为识别接口。

 

 

 

小结:

通过这个验证码识别的问题,大致的了解了目前图像识别的一些方法和思路,水平有限,都是一些基础的东西,希望能够给入门的读者一些思路上的参考。其中,也有一些自己的体会:

  1. 目前百度的aipocr真的厉害,还支持图像人物识别等,如果在这个基础上,还是可以做一些深入的应用,如果aipocr能过识别人物衣物帽子等,工厂安全帽检查是不是就可以简单的通过摄像头以及aipocr实现监控了?这个玩法很多,还需要去挖掘。
  2. Tesseract用在标准OCR识别上应该还是可以的,一些特殊的识别可以用过训练来进行。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值