验证码识别
查看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))