Python爬虫(八)图形验证码识别——自定义OCR文字识别

441 阅读4分钟

网站登录一般会使用验证码来识别是否是机器操作,重复登录,消耗服务器资源。

验证码大概有以下几大类:

1:图形验证码(数字字母)

2:拖动滑块验证码

3:点击文字验证码

4:点击验证码

5:绘制图案(宫格)验证码

前四种验证码比较常见,第五种验证码我还没有遇到过。

 

1:安装 Tesseract

图形验证码的识别,我这里尝试自己定义一个OCR文字识别方法。

Python文字识别需要使用到第三方文字识别工具Tesseract

Tesseract的安装我们可以移步到该网址 digi.bib.uni-mannheim.de/tesseract/

选择你需要的版本下载就好,可能较慢,需要等待一下。

 

我是在windows上做测试,双击安装就好了。安装完成之后,我们需要知道软件对应的安装位置。要将其添加到电脑本机的系统变量中。

 

2:配置系统环境变量

1:我的电脑右键->属性->高级->环境变量->系统变量->新建(变量名:JAVA_HOME 变量值: C:\Program Files\Tesseract-OCR

 

2:同一个地方找到path->双击->在变量值后面添加-> C:\Program Files\Tesseract-OCR

1.png

 

3:为了不重启就生效:将刚刚path下的所有值复制,打开cmd在命令提示符里输入:

set path=刚才复制的内容。

 

3:配置中文语言包

Tesseract默认是没有中文选项的,但是,英文水平有限,配置一下中文显示,下载地址:

 tesseract-ocr.github.io/tessdoc/Dat… 

页面是全英文显示,页面搜索chinese,找到简体中文选项,下载即可。

下载完成后我们需要放到Tesseract的路径下的tessdata目录下。

 

4:安装其他模块

除了上面的步骤,我们还需要下载两个模块:

pip install pytesseract

pip install pillow

第一个是用于文字识别的,是Tesseract对应的python模块,第二个是用于图片读取的。接下来我们就可以进行文字识别了。

 

这里说一个我遇到的坑,一般在windows上安装模块,我都是用anaconda的图形界面进行操作安装,但是pytesseract在anaconda是找不到的。必须使用命令行执行上边的命令安装。

 

5:文字识别。

需要识别的图片如下:

2.png

我这里直接贴代码了:

#!/usr/bin/python3
 # -*- coding: utf-8 -*-
 @Time    : 2022/3/4 15:21
 @Author  : camellia
 @Email   : 805795955@qq.com
 @File    : ocrself.py
 @Software: PyCharm
 import pytesseract
 from PIL import Image
 # 读取图片
 im = Image.open('./yanzhengma.jpg')
 # 识别文字
 string = pytesseract.image_to_string(im)
 print(string)

运行报错:

pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

 

解决方案:

找到python的安装路径下的pytesseract:   例如我的是   

C:\Users\camellia.conda\envs\python37\Lib\site-packages\pytesseract

进入这个目录,打开当前目录下的pytesseract.py文件

搜索:tesseract_cmd = 'tesseract' 

将其改为:tesseract_cmd = ‘OCR的安装路径下的tessract.exe' 

 

再次运行上边的代码,输出以下的文字:

Naexkamiin , aba ‘al.

De® P, RERDRESK.

AEGAMES , BFSRIRSA.

WES REAEE , RAR.

 

为什么会这个样子呢?Tesseract默认是英文的,我们需要将其指定语言为中文,代码如下:

import pytesseract
 from PIL import Image
 # 读取图片
 im = Image.open('bbb.png')
 # 识别文字,并指定语言
 string = pytesseract.image_to_string(im, lang='chi_sim')
 print(string)

运行代码,输出:

风 急 天 高 猿 喝 哀 , 渚 清 沙 白 鸟 飞 回 。
无 边 落 育 下 , 不 尽 长 江 滚 滚 来 。
万 里 悲 秋 常 作 客 , 百 年 多 病 独 登 台 。
艰 难 苦 恨 繁 霜 鬓 , 漫 倒 新 停 浊 酒 杯 。

 

这里的识别还是有错误文字的。具体哪个字错了,还请各位看客慢慢找。

 

效果比较差强人意。

 

6:验证码识别:

3.gif

识别结果如下:

e

 

7

四个数字,只识别出来了一个7

换一张背景有杂点的验证码图片

8.gif

这张验证码直接识别不出来。

 

7:汽车牌照识别

4.jpg

输出:

ise AOlet!

 

5.jpg

未识别出任何结果

 

6.jpg

输出:

陡 “ 人 ,
D053 14

 

7.jpg

输出:

80295

 

上边的四张车牌照图片,我使用上篇中使用的超级鹰平台测试

第一张车牌:识别超时

第二张车牌:识别超时

第三张车牌:识别超时

第四张车牌:识别结果 80025

 

这……果然,Tesseract的文字识别,对于正儿八经的字体,识别率还可以,但是,其他的就比较差强人意了。

当然,这只是识别原图,关于汽车牌识别的问题,也许将图片二值化为黑白后应该能更好一点。后期会慢慢补充。

 

有好的建议,请在下方输入你的评论。