如何利用pytesseract库识别图形验证码 【python爬虫入门进阶】(15)

2022-03-31 20:05:13 浏览数 (1)

tesseract库介绍

能提取图片中的文字的技术,将图片翻译成文字的技术一般被称为光学文字识别(Optical Character Recognition) 简写为OCR。而tesseract是一个OCR库,由谷歌赞助,是一个比较优秀的图像识别开源库。它具有很高的识别度,也具有很高的灵活性,可以通过训练识别任何字体。 tesseract库的官方文档

tesseract的安装

windows下安装

安装tesseract

windows下装装tesseract库只需要在 https://sourceforge.net/projects/tesseract-ocr-alt/files/ 下载名为 tesseract-ocr-setup-3.02.02.exe 的可执行文件。然后,一直点击下一步进行安装,不过需要注意的是安装的路径要放在不需要权限的英文路径下。

安装完成之后就是设置环境变量了。在Windows 下把tesseract.exe所在的路径添加到PATH环境变量中。

下载并配置训练数据

默认情况下tesseract只支持英文的识别,如果要想支持中文的识别的话,需要配置中文的训练数据 chi_sim.traineddata。文件的下载地址是:https://github.com/tesseract-ocr/tessdata

下载好之后就是将数据文件配置到环境变量中。就是在环境变量中新建一个环境变量比如这样: TESSDATA_PREFIX=D:teseractdata ,这里的D:teseractdata 需要改成你实际的数据文件的地址。

linux下安装

安装tesseract

在Ubuntu系统中可以通过apt包管理工具进行安装

代码语言:javascript复制
sudo apt install tesseract-ocr

安装完成之后就已经配置好了环境变量。

mac下安装

安装tesseract

在mac下可以通过Homebrew来进行安装

代码语言:javascript复制
brew install tesseract

安装完成之后就已经配置好了环境变量。

下载训练数据

数据文件可以通过下面

代码语言:javascript复制
brew install tesseract-lang

命令下载全部的训练数据,下载完成之后的数据文件放在了/usr/local/share/tessdata/ 目录下。当然,你可以只下载chi_sim.traineddata 训练数据。

在命令行中使用tesseract

安装好tesseract库之后,我们就可以在命令行中使用tesseract库了。这里我找了两个图片进行测试。

纯英文识别

这里我在国外技术网上上截取了一个图片。将图片命名为 test1.png

我们可以通过tesseract来进行识别。首先,跳转到图片所在的目录,然后输入命令:tesseract test1.png test1。最后一个test1表示识别后的文本的存放地址,不需要加后缀名。执行该命令之后,tesseract会在图片所在的目录下生成一个test1.txt的文本文件。

识别的结果如下图所示:

中文识别

识别包含中文的图片需要事先下载中文训练数据chi_sim.traineddata。在输入命令时需要指定语言是:chi_sim。同样的,这里我也截取了一个中文图片。将该图片命名为:csdn.png。

同样的跳转到图片所在的目录,然后输入命令:tesseract csdn.png csdn -l chi_sim 通过-l 来指定识别的语言。执行该命令之后会在图片所在的目录下生成一个名为csdn.txt的文本文件。识别的结果如下图所示:

查看tesseract的命令参数可以通过tesseract -h 来进行查看

通过Python代码来识别图片验证码

安装依赖

在Python代码中操作tesseract。需要安装一个库,叫做pytesseract。通过pip的方式即可安装:

代码语言:javascript复制
pip install pytesseract

并且,需要读取图片,需要借助一个第三方库叫做PIL。PIL库的详细使用方法参见此文 ❤️【Python从入门到精通】(二十六)用Python的PIL库(Pillow)处理图像真的得心应手❤️。通过pip的方式安装:

代码语言:javascript复制
pip install pillow

安装完成之后就可以愉快的使用tesseract库了。

简单的使用

这里还是以csdn.png图片为例进行说明。

代码语言:javascript复制
from PIL import Image
import pytesseract
def main():
    image = Image.open("test_png/csdn.png")
    text = pytesseract.image_to_string(image,lang='chi_sim')
    print(text)
if __name__ == '__main__':
    main()

运行后的打印的结果是:

识别拉钩网的图形验证码

拉钩网图片验证码的生成接口是:https://passport.lagou.com/vcode/create?from=register。直接调用该接口返回的是一个包含四位随机字母的图形验证码的图片。每调用一次会变一次。

这里通过urllib的request请求类的urlretrieve方法来请求图形验证码,该方法可以将请求结果直接保存为captcha.png 图片。

代码语言:javascript复制
from urllib.request import HTTPSHandler

from PIL import Image
import pytesseract
from urllib import request
import ssl

context = ssl._create_unverified_context()

def main():
    captchaUrl = r'https://passport.lagou.com/vcode/create?from=register'
    https_handler = HTTPSHandler(context=context)
    opener = request.build_opener(https_handler)
    opener.addheaders = [('User-agent',
                          'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36')]

    request.install_opener(opener)
    request.urlretrieve(captchaUrl, 'captcha.png')

    image = Image.open("captcha.png")
    image.show()
    text = pytesseract.image_to_string(image)
    print(text)

if __name__ == '__main__':
    for i in range(10):
        main()

运行十次的结果是:

除个别的图形验证码识别不正确。其余的都识别正确了。 不过需要注意的是,针对有干扰线的图形验证码,比如下面这种。

tesseract 是无能为力的,即不能识别包含干扰线的图形验证码。

总结

本文详细介绍了tesseract库的使用,整体来说tesseract库是一款优秀的OCR库。识别一些简单的图形验证码还是绰绰有余的。

0 人点赞