您的位置:首页 > 编程语言 > Python开发

用Python识别简单验证码

2018-01-18 18:50 393 查看

前言闲扯

标题虽然是识别验证码,但实际上本文讲的是OCR(Optical Character Recognition,光学字符识别)。

用到三个模块:

PIL

tesseract-oc

pytesseract

简单介绍下:

1. PIL (Python Imaging Library)是 Python 中最常用的图像处理库;

2. tesseract-oc是HP的一个文字识别项目,后来交给google做了开源;

3. pytesseract是基于tesseract-oc的python封装。

识别

pytesseract的使用十分简单,当然tesseract-oc本身的命令行调用也很简单,基于它的封装用起来也只有一行代码:

from PIL import Image
import pytesseract

im = Image.open("captcha.jpg")
vcode = pytesseract.image_to_string(im)
print(vcode)


运行后不出意外会报错:
FileNotFoundError: [WinError 2] 系统找不到指定的文件


方法1: 将tesseract.exe的安装目录添加到PATH环境变量中;

方法2: 修改pytesseract.py文件,指定tesseract.exe安装路径
tesseract_cmd = 'D:\\Tesseract-OCR\\tesseract


方法3: 在实际运行代码中指定
pytesseract.pytesseract.tesseract_cmd = 'D:\\Tesseract-OCR\\tesseract.exe'


当你觉得万事俱备,信心满满再次运行代码后,它报了另外一个错:

pytesseract.pytesseract.TesseractError: (1, 'Error opening data file \\Tesseract-OCR\\tessdata/eng.traineddata')


方法1: 将/tesseract-ocr/tessdata目录添加到TESSDATA_PREFIX环境变量中;

方法2: 指定tessdata-dir:
tessdata_dir_config = '--tessdata-dir "D:\\Tesseract-OCR\\tessdata"'


所以,最后代码变成了这样:

from PIL import Image
import pytesseract

im = Image.open("captcha.jpg")
tessdata_dir_config = '--tessdata-dir "D:\\Tesseract-OCR\\tessdata"'
vcode=pytesseract.image_to_string(im,config=tessdata_dir_config)
print(vcode)


运行成功!

运行结果

我采用的验证码是来自直播平台斗鱼的举报系统,这个神奇的举报系统永远都输不对验证码,大概是斗鱼压根就不让你们举报,只是做做样子忽悠忽悠屁民罢了。

附:Request URL:https://www.douyu.com/member/report/captcha


——>
{887


唔,不是很令人满意的结果。

其实,这也在情理之中。tesseract-oc是做图片文字识别的,斗鱼这个验证码带了一点噪点,识别容易出误差。实际上也没有人直接用tesseract-oc来破解验证码,一般都需要做二值化、降噪、分割的处理。这样一套流程下来,识别的成功率就会变地非常高。

就会像这样

——>

——>
3061


后话

本来写这篇文章,是起源于在知乎看到一篇教程以及在实验楼的一个课程,用Python的基本库PIL来实现验证码的识别。实操下来因本人对图像处理的认识比较浅薄,一些颜色直方图、调色板类的概念不是特别明确,并且教程里有讨巧的成分(降噪是选取已知图片的两种颜色来做二值化)遂放弃转而直接调用第三方库。

总结来说,这是一篇工具使用篇,并没有多少python知识,就当我水了一篇吧,啊哈哈哈。

有缘我们再来讲中文识别以及字库训练,会发挥出tesseract-oc更完整强大的实力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: