Python公开课 - 爬虫识别图像验证码

前言

目前,对于爬虫的反爬技术也很多,除了封禁IP以外验证码技术也是一个有效的方式来确保是人而不是程序在访问网站,并且随着技术的发展, 验证码的花样越来越多。

字符验证码

字符验证码是比较普遍的方式,一般是四位字母或者数字组成,在中小网站中非常常见。

例如在Django项目中,引入django-simple-captcha就可以很快速的实现一个验证码效果。

同样现在流行的Discuz的论坛网站也大量使用这类验证码,如下:

Tessercat OCR安装与使用

Tesseract,是一款由HP实验室开发并由Google维护的开源OCR引擎。它是基于Apache许可证的自由软件,自2006 年起由Google赞助开发。在2006年,Tesseract被认为是最精准的开源光学字符识别引擎之一。

在Ubuntu下安装可以参考详解Tesseract之安装及基本使用

安装完毕后,可以通过如下命令来确认版本

tesseract -v

PIL安装与使用

以下安装步骤是在Ubuntu环境下进行

Step1. 首先需要安装Python3的开发环境准备

sudo apt-get install python3-dev python3-setuptools

Step2. 安装依赖库

sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev \
    libfreetype6-dev liblcms2-dev libwebp-dev libharfbuzz-dev libfribidi-dev \
    tcl8.6-dev tk8.6-dev python-tk

Step3. 安装Pillow

pip3 install Pillow

Step4. 安装完毕查看版本

tesserocr安装

Step1. 安装开发环境

apt install libtesseract-dev libleptonica-dev

Step2. 安装库

pip3 install tesserocr

验证码处理

为提供OCR的准确度,我们需要进行灰度化和二值化处理,可以参考图像处理工具ImageMagick - 灰度化和二值化

我们以三张验证码图片为例子

Step1. 图像灰度化

通过如下代码可以直接完成灰度化

import tesserocr
from PIL import Image

image = Image.open('test.png')
image = image.convert('L')
image.save('g_test.png')

效果如下:

Step2. 图像二值化

选择合适的阈值,进行图像二值化

```python
import tesserocr
from PIL import Image

image = Image.open('g_test.png')
threshold = 120
table = []

for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table, '1')
image.save('b_test.png')

```

效果如下:

Step3. 图像OCR

import tesserocr
from PIL import Image
print(tesserocr.tesseract_version())
print(tesserocr.get_languages())

image = Image.open('b_misc.png')
result = tesserocr.image_to_text(image,psm=tesserocr.PSM.SINGLE_LINE)
print(result)

在tesseract4.00版本中识别:

CBGw
cHJY
ENRG

可以看到,还是还是有一定的误差,不要紧,还可以通过训练的方式提高识别效率,可以参考如何通过训练提高Tesseract OCR验证码识别率

实践过程中遇到的坑

问题1

  x86_64-linux-gnu-gcc: error trying to exec 'cc1plus': execvp: 没有那个文件或目录
  error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

  ----------------------------------------
  Failed building wheel for tesserocr
  Running setup.py clean for tesserocr

原因:

ubuntu中Python相关的开发环境没有安装

解决办法:

apt-get install gcc python3-dev g++

问题2

    x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -c tesserocr.cpp -o build/temp.linux-x86_64-3.5/tesserocr.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    tesserocr.cpp:649:34: fatal error: leptonica/allheaders.h: 没有那个文件或目录
    compilation terminated.
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

原因:

tesseract的开发环境没有安装

解决办法:

apt install libtesseract-dev libleptonica-dev

问题3

RuntimeError: Failed to init API, possibly an invalid tessdata path: /usr/share/tesseract-ocr/

原因:

tesseract-ocr程序没有安装

解决办法:

apt-get install tesseract-ocr

参考资料

相关阅读