图片识别

验证码识别

查看Tesseract-OCR支持语言

tesseract --list-langs

爬虫-识别图形验证码-tesserocr

引入:

在学习爬虫的过程中,需要解决识别图形验证码的这一难题,网上推荐的方法都是通过tesserocr模块来实现,下面就是安装步骤以及过程中遇到的问题,记录一下。

介绍:

tesserocr 是 Python 的一个 OCR 识别库 ,但其实是对 tesseract 做的一 层 Python API 封装,所以它的核心是 tesseract。 因此,在安装 tesserocr 之前,我们需要先安装 tesseract 。例如:对于下图的验证码,我们可以通过 OCR 技术将其转换成电子文本,然后爬虫将识别的结果提交给服务器,便可以达到自动识别验证码的过程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WxlVl1lG-1618992506948)(G:\typora_pic\1174122-20191011095643510-531203807.png)]

我的环境:

OS:win10

python:3.6.5

相关链接

tesserocr GitHub: https://github.com/sirfz/tesserocr

tesserocr PyPI: https://pypi.python.org/pypi/tesserocr

tesseract 下载地址: http://digi.bib.uni-mannheim.de/tesseract

tesseract GitHub:[ https://github.com/tesseract-ocr/tesseract](https://www.cnblogs.com/Jimc/p/ https://github.com/tesseract-ocr/tesseract)

tesseract 语言包: http://github.com/tesseract-ocr/tessdata

tesseract 文档: https://github.com/tesseract-ocr/tesseract/wiki/Documentation

安装

在 Windows 下,首先需要下载 tesseract,它为 tesserocr 提供了支持。

进入下载页面,可以看到有各种 .exe 文件的下载列表,这里可以选择下载 3.0 版本 。 如下图所示为 3.05 版本 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w5KeDxbI-1618992506952)(G:\typora_pic\1174122-20191011095931839-1456046552.png)]

其中文件名中带有 dev 的为开发版本,不带 dev 的为稳定版本,可以选择下载不带 dev 的版本, 例如可以选择下载 tesseract-ocr-setup-3 .05.01.exe。

下载完成后双击运行,安装程序。需要注意的是,需要句选 Additional language data(download)选项来安装 OCR 识别支持的语言包,这样 OCR 便可以识别多国语言 

给tesseract配置环境变量:

(1)将tesseract安装路径添加到path环境变量中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dqUFKIe-1618992506955)(G:\typora_pic\1174122-20191011103058318-226844714.png)]

(2)将tesseract的语言包添加到环境变量中,在环境变量中新建一个系统变量,变量名称为TESSDATA_PREFIX,tessdata是放置语言包的文件夹,一般在你安装tesseract的目录下,tesseract的安装目录就是tessdata的父目录,把TESSDATA_PREFIX的值设置为它即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8AE7Eo8A-1618992506958)(G:\typora_pic\1174122-20191011103156906-438913730.png)]

接下来 , 再安装 tesserocr :

pip install tesserocr pillow

pip安装tesserocr时出错:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQbuPL51-1618992506962)(G:\typora_pic\1174122-20191011094704586-289448871.png)]

在命令行中输入:pip3 install tesserocr pillow ,一直出现error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools错误。

解决办法:

用.whl文件下载tesserocr库,就不会出现这个问题,下载地址:

https://github.com/simonflueckiger/tesserocr-windows_build/releases
[

](https://github.com/simonflueckiger/tesserocr-windows_build/releases/tag/tesserocr-v2.2.2-tesseract-4.0.0-master)

我下载的是tesserocr-2.4.0-cp36-cp36m-win_amd64.whl,然后在命令行中输入:

pip install tesserocr-2.4.0-cp36-cp36m-win_amd64.whl

安装成功,问题解决

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-El2NI38W-1618992506964)(G:\typora_pic\1174122-20191011100547288-508865820.png)]

验证安装

测试样例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hsNFnL05-1618992506966)(G:\typora_pic\1244179-20181011155114287-1627873882.png)]

图片下载:http://images.cnblogs.com/cnblogs_com/Jimc/1316973/o_image.png

(1)用 tesseract 命令测试:

tesseract test.png stdout -l eng 

运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZJFCmEV-1618992506969)(G:\typora_pic\1174122-20191011101952425-27427804.png)]

(2)利用 Python 代码测试:

[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VvljAjbC-1618992506970)(G:\typora_pic\copycode-1603674859145.gif)]](javascript:void(0)😉

Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tesserocr
>>> from PIL import Image
>>> image = Image.open(r'C:\Users\Tianl\test.png')
>>> result = tesserocr.image_to_text(image)
>>> print(result)
PythonWebSpider

>>>

[复制代码](javascript:void(0)😉

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1wP8aHqe-1618992506973)(G:\typora_pic\1174122-20191011102603542-1163530815.png)]

另外,还可以直接调用 tesserocr 模块的 file_to_text() 方法,可以达到同样的效果:

[复制代码](javascript:void(0)😉

Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tesserocr
>>> print(tesserocr.file_to_text(r'C:\Users\Tianl\test.png'))
PythonWebSpider

>>>

[复制代码](javascript:void(0)😉

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vUy95Vy8-1618992506977)(G:\typora_pic\1174122-20191011102816215-547401467.png)]

如果成功输出结果,则证明 tesseract 和 tesserocr 都已经安装成功,以上是安装以及简单使用。

pycharm中安装导入tesserocr

直接把上面通过pip安装好的文件夹拷贝到pycharm创建的项目的site-packages目录中即可使用

python爬虫学习(2)用tesserocr识别图像验证码

而验证码也分很多种类,主要的几种:

(1)图像验证码:这是最简单的一种,也很常见。就比如CSDN登录几次失败之后就会出验证码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qyoS3XNY-1618992506978)(G:\typora_pic\20180730220950608.png)]

(2)滑块验证码:需要按住滑块并移到正确的位置。比如bilibili的登录验证。(这个我也写过识别代码,源码托管github:https://github.com/OSinoooO/bilibili_geetest。可以去看一看呀QAQ)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vneaFjDv-1618992506979)(G:\typora_pic\20180730221714582.png)]

(3)点触验证码:需要识别图片中的文字或类型并按序点击。比如12306的登录验证。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VukxxAmb-1618992506979)(G:\typora_pic\20180730222200870.png)]

(4)宫格验证码:类似安卓的宫格解锁。比如新浪微博的宫格验证码。

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kIP9w3b8-1618992506980)(G:\typora_pic\20180730222434517.png)]

准备工作

我们这次要识别的图像验证码,需要用到tesserocr库,但是安装tesserocr库之前,需要先安装好相应版本的tesseract。因为tesserocr是基于tesseract来封装的库。

安装tesseract

Github:https://github.com/tesseract-ocr/tesseract

下载地址:https://digi.bib.uni-mannheim.de/tesseract

语言包:https://github.com/tesseract-ocr/tessdata

官方文档:https://github.com/tesseract-ocr/tesseract/wiki

文件带dev的是开发版本,不带dev的是稳定版本。

选择需要的版本后开始下载,然后安装配置比较简单,就不多说了。语言包的作用就是可以识别多国语言,可在安装选项里选择,也可以自行下载。(下载后的语言包需要解压后放到Tesseract-OCR/tessdata目录下)

安装好之后打开cmd,输入tesseract,如果出现以下信息就说明安装成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Hy3g1cr-1618992506981)(G:\typora_pic\20180731010241638.png)]

*安装tesserocr*

tesseract安装好以后就可以安装tesserocr了。

Github: https://github.com/sirFz/tesserocr

PyPi:https://pypi.python.org/pypi/tesserocr

github上有较为详尽的安装说明,大多数情况下我们可以在cmd下通过pip来安装:(前提是安装了pip,一般python都自带)

pip install tesserocr

但是由于windows下tesserocr 2.3.0版本目前还没有,所以pip安装在Windows下面会报错。

解决方法之一是通过wheel安装:

1.下载tesserocr 2.2.2版本的wheel文件(注意与tesseract版本的对应)

2.通过如下命令安装:(需要与下载文件在同一目录下)

pip install 文件名.whl

PS:即使库能安装成功,有时候运行还是会出现错误(坑!!),推荐个博文:https://www.imooc.com/article/45278

至少我遇到的错误是解决了 - -

代码构建

完成上述准备工作之后,就可以开始写代码了。

代码逻辑是很简单的,为了便于理解和以后的调用,我把它封装成了一些方法:

初始化

from PIL import Image
import tesserocr, requests
 
# 图片下载链接
image_url = 'https://passport.csdn.net/ajax/verifyhandler.ashx'
# 图片保存路径
image_path = 'image/captcha.jpg'

首先导入必要的包,然后初始化连接(可修改)和路径(可修改)。

图片下载和获取

def image_download():
    """
    图片下载
    """
    response = requests.get(image_url)
    with open(image_path, 'wb') as f:
        f.write(response.content)
def get_image():
    """
    用Image获取图片文件
    :return: 图片文件
    """
    image = Image.open(image_path)
    return image

图像处理

def image_grayscale_deal(image):
    """
    图片转灰度处理
    :param image:图片文件
    :return: 转灰度处理后的图片文件
    """
    image = image.convert('L')
    #取消注释后可以看到处理后的图片效果
    #image.show()
    return image
 
def image_thresholding_method(image):
    """
    图片二值化处理
    :param image:转灰度处理后的图片文件
    :return: 二值化处理后的图片文件
    """
    # 阈值,控制二值化程度,自行调整(不能超过256)
    threshold = 160
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    # 图片二值化,此处第二个参数为数字一
    image = image.point(table, '1')
    # 取消注释后可以看到处理后的图片效果 
    #image.show()
    return image

经过转灰度和二值化处理之后的图片更加容易识别,可以通过 show() 方法来显示处理后的图片。

处理前:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c3Z3NlD6-1618992506983)(G:\typora_pic\2018073101284527.png)]

转灰度处理后:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxPrlpT7-1618992506984)(G:\typora_pic\20180731012913563.png)]

二值化处理后:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ATxuShXB-1618992506985)(G:\typora_pic\20180731012948673.png)]

图像识别

def captcha_tesserocr_crack(image):
    """
    图像识别
    :param image: 二值化处理后的图片文件
    :return: 识别结果
    """
    result = tesserocr.image_to_text(image)
    return result

调用tesserocr的image_to_text()方法识别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihjbycSg-1618992506986)(G:\typora_pic\20180731013939683.png)]

然后通过调用上述方法,就可以实现自动识别验证码了。

PS:不是每次识别都能成功,要想提高成功率,需要下载训练好的语言包。(下载网速巨慢!!!)

还有就是用深度学习的方法去训练机器~

源码(Github:https://github.com/OSinoooO/Gaptcha_crack)

from PIL import Image
import tesserocr, requests

# 图片下载链接
image_url = ‘http://my.cnki.net/elibregister/CheckCode.aspx’
# 图片保存路径
image_path = ‘image/captcha.jpg’

def image_download():
“”"
图片下载
“”"
response = requests.get(image_url)
with open(image_path, ‘wb’) as f:
f.write(response.content)

def get_image():
“”"
用Image获取图片文件
:return: 图片文件
“”"
image = Image.open(image_path)
return image

def image_grayscale_deal(image):
“”"
图片转灰度处理
:param image:图片文件
:return: 转灰度处理后的图片文件
“”"
image = image.convert(‘L’)
#取消注释后可以看到处理后的图片效果
#image.show()
return image

def image_thresholding_method(image):
“”"
图片二值化处理
:param image:转灰度处理后的图片文件
:return: 二值化处理后的图片文件
“”"
# 阈值
threshold = 160
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
# 图片二值化,此处第二个参数为数字一
image = image.point(table, ‘1’)
#取消注释后可以看到处理后的图片效果
#image.show()
return image

def captcha_tesserocr_crack(image):
“”"
图像识别
:param image: 二值化处理后的图片文件
:return: 识别结果
“”"
result = tesserocr.image_to_text(image)
return result

if name == ‘main’:
image_download()
image = get_image()
img1 = image_grayscale_deal(image)
img2 = image_thresholding_method(img1)
print(captcha_tesserocr_crack(img2))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值