由于前些日子在做爬虫,期间遇到了各种反爬技术,比如cookies验证,验证码验证等等。cookies验证的话,没有加密还好说,加过密的cookies实在是搞不了,以楼主的技术只是勉强能知道对方是用什么加密算法,解密就更不用提了。对于验证码验证来说,网上确实有很多验证码识别的实现以及教程。楼主这里主要串一下这一段过程,遇到的比较恶心的问题,以及解决办法。那么废话不多说,进入正题。
楼主进行验证试验的网站正是楼主本市(曲阜市)自来水厂的网站,这个网站的验证码看上去比较简单,对于刚刚接触图像识别,尤其是起初的验证码识别的人来说,算是完美的入门实验网站了。它的验证码画风都是这个样纸滴~
嗯就是这样人眼识别没有任何难度的验证码,不像有些验证码人眼都看不出来,简直是丧心病狂。
不过就算是这样,在识别过程中也出了一些问题。我们先过一遍流程,再详细说明这些问题。
实验流程如下:
1、爬虫循环爬取验证码二十张到三十张,并以文件形式保存在本地。
2、通过格式工厂,将图片洗成tif或tiff格式。(只更改文件扩展名无效,这是格式编码的问题,必须用格式工厂去洗。)
3、通过jTessBoxEditor工具,生成图像集。
4、在生成的图像集路径下,使用cmd命令
tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
生成box文件,这也就是后面python进行图像识别的训练库。
5、在jTessBoxEditor下,打开图像集,审查匹配内容,并作人工修改。
主要流程如上,接下来对每一步进行详述。
1、爬虫爬取图片的实现比较简单,我们使用python就可以轻松实现。
import requests
import random
url = 'http://www.qfzls.com/onlinepay/Login.aspx?om=yssf' # 地址格式定义
imgurl = 'http://www.qfzls.com/onlinepay/yz.aspx'
filename = ''
for j in range(1, 9):
m = str(random.randrange(0, 10))
filename = filename + m
filename = 'D:\\image\\'+filename+'.bmp' # 存成bmp格式
file = open(filename, 'ab')
r = requests.get(imgurl)
file.write(r.content)
file.close()
此处注意,此处一定要存成bmp格式。如果存成jpg格式,图片会变脏而难以识别。这也是起初楼主的识别率一直上不去的主要原因。
当然,楼主还对图片进行了一些处理,以提高识别率。代码如下:
from PIL import Image from PIL import ImageEnhance image = Image.open(filename) # filename为验证码的路径加文件名,若是放在项目里可以直接使用文件名调用 enh_bri = ImageEnhance.Brightness(image) # 亮度增强 brightness = 1.5 image = enh_bri.enhance(brightness) enh_col = ImageEnhance.Color(image) # 色度增强 color = 1.5 image = enh_col.enhance(color) enh_con = ImageEnhance.Contrast(image) # 对比度增强 contrast = 1.5 image = enh_con.enhance(contrast) enh_sha = ImageEnhance.Sharpness(image) # 锐度增强 sharpness = 3.0 image = enh_sha.enhance(sharpness) image.save(filename) image.show() #展示效果
此处需要安装一下pillow(PIL)包,使用pip工具即可。
最后,我们使用pytesseract来识别图像。
import pytesseract print(pytesseract.image_to_string(image))当然,这样做的识别率通常不到百分之五十。图像处理后不做训练的话,识别率大概有百分之八十。经过训练库训练后,识别率能达到九十五左右。最后,我考虑问题可能出在算法上,因为我发现图像笔画间隔有的地方只有一个像素。于是我们把图像像素扩充了一倍,识别率终于达到了百分之百。下面的操作都是如何利用Tesseract-OCR构造训练库。
2、因为使用jTessBoxEditor制作图像集,只支持tif或tiff格式,所以我们必须通过格式工厂洗一下图片格式。这一步就不多说了吧,基本操作。楼主使用的版本还是4.3.0稍微早点的版本,此处对软件版本没有要求。
洗完格式的图片放在一个单独的文件夹里,方便进行后续操作。
第3、4、5步的话,可以详细看一下大佬写的博客
Tesseract-OCR的简单使用与训练
链接地址:https://www.cnblogs.com/cnlian/p/5765871.html
这三步需要注意的问题在里面都说得非常详细。
最后的审查训练库内容需要人工去做,二三十张工作量不大,效果也很好。