爬虫对抗系列-验证码

参考博客:
1.https://www.cnblogs.com/Jimc/p/9772930.html
2.https://www.cnblogs.com/qqandfqr/p/7866650.html

1.普通图形验证码

普通图形验证码一般由四位纯数字、纯字母或者字母数字组合构成,是最常见的验证码,也是最简单的验证码,利用 tesserocr 或者 pytesseract 库即可识别此类验证码,前提是已经安装好 Tesseract-OCR 软件

Tesserocr

tesserocr 是 Python 的一个 OCR 识别库 ,但其实是对 tesseract 做的一 层 Python API 封装,所以它的核心是 tesseract。 因此,在安装 tesserocr 之前,我们需要先安装 tesseract 。

Tesseract安装
要安装tesserocr,首先要下载tesseract,它是给tesserocr提供支持的。下载地址为:https://digi.bib.uni-mannheim.de/tesseract/。

打开之后可以看到有很多文件,带dev的为开发版本,不带dev的为稳定版本,我们选择下载不带dev的版本,比如最新的这个:tesseract-ocr-w64-setup-v4.1.0.20190314.exe。下载完成之后运行安装,一直点击next,直到出现如下页面


在Additional language data中包含了OCR支持识别的各国语言包,可以根据情况选择,我这里就选择了中文的:

image

添加系统环境变量:把刚才的安装路径“C:\Program Files (x86)\Tesseract-OCR”添加到红线划的PATH和Path,注意,添加时候开头用“;”跟之前的变量隔开,结尾以“;”结尾。下面是我的配置信息样本:

image.png
1.1 Tesserocr安装

相关链接
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
tesseract 语言包: http://github.com/tesseract-ocr/tessdata
tesseract 文档: https://github.com/tesseract-ocr/tesseract/wiki/Documentation

常见Python包的安装方式有三种:
1. pip 安装

pip install tesserocr pillow

2. conda 安装

conda install tesserocr

#一条可行的命令:
conda install -c simonflueckiger tesserocr

3. whl包 安装
这种方法一般不会报错

C:\Users\dell\Downloads
$ pip install tesserocr-2.4.0-cp36-cp36m-win_amd64.whl
Processing c:\users\dell\downloads\tesserocr-2.4.0-cp36-cp36m-win_amd64.whl
Installing collected packages: tesserocr
Successfully installed tesserocr-2.4.0
1.2 Tesserocr应用

简单示例:

import tesserocr
from PIL import Image

image = Image.open('code.png')
result = tesserocr.image_to_text(image)
print(result)

新建一个 Image 对象,调用 tesserocr 的 image_to_text() 方法,传入 Image 对象即可完成识别,另一种方法:

import tesserocr
print(tesserocr.file_to_text('code.png'))
1.3 pytesseract

pytesseract 库识别验证码
简单示例:

import pytesseract
from PIL import Image
img = Image.open('code.png')
img = img.convert('RGB')
img.show()
print(pytesseract.image_to_string(img))

pytesseract 的各种方法:

  • get_tesseract_version:返回 Tesseract 的版本信息;
  • image_to_string:将图像上的 Tesseract OCR 运行结果返回到字符串;
  • image_to_boxes:返回包含已识别字符及其框边界的结果;
  • image_to_data:返回包含框边界,置信度和其他信息的结果。需要 Tesseract 3.05+;
  • image_to_osd:返回包含有关方向和脚本检测的信息的结果。

有关参数:

image_to_data(image, lang='', config='', nice=0, output_type=Output.STRING)
  • image:图像对象;
  • lang:Tesseract 语言代码字符串;
  • config:任何其他配置为字符串,例如:config=’–psm 6’;
  • nice:修改 Tesseract 运行的处理器优先级。Windows不支持。尼斯调整了类似 unix 的流程的优点;
  • output_type:类属性,指定输出的类型,默认为string。

lang 参数,常见语言代码如下:

  • chi_sim:简体中文
  • chi_tra:繁体中文
  • eng:英文
  • rus:俄罗斯语
  • fra:法语
  • deu:德语
  • jpn:日语
1.4 验证码处理

利用 Image 对象的 convert() 方法传入不同参数可以对验证码做一些额外的处理,如转灰度、二值化等操作,经过处理过后的验证码会更加容易被识别,识别准确度更高,各种参数及含义:

  • 1:1位像素,黑白,每字节一个像素存储;
  • L:8位像素,黑白;
  • P:8位像素,使用调色板映射到任何其他模式;
  • RGB:3x8位像素,真彩色;
  • RGBA:4x8位像素,带透明度掩模的真彩色;
  • CMYK:4x8位像素,分色;
  • YCbCr:3x8位像素,彩色视频格式;
  • I:32位有符号整数像素;
  • F:32位浮点像素。
# 示例
import pytesseract
from PIL import Image
image = Image.open('code.png')
image = image.convert('L')
image.show()
result = pytesseract.image_to_string(image)
print(result)

Image 对象的 convert() 方法参数传入 L,即可将图片转化为灰度图像,转换前后对比:

import pytesseract
from PIL import Image
image = Image.open('code.png')
image = image.convert('1')
image.show()
result = pytesseract.image_to_string(image)
print(result)

Image 对象的 convert() 方法参数传入 1,即可将图片进行二值化处理,处理前后对比:

2. 汉字验证码:

图片文字识别


图片.png
import requests
from aip import AipOcr

image = requests.get('https://static.pandateacher.com/7b5d6d8d9dea5691705d04fef2306b52.png').content
APP_ID = '11756541'
API_KEY = '2YhkLuyQGljPUYnmi1CFgxOP'
SECRET_KEY = '4rrHe2BF828bI8bQy6bLlx1MelXqa8Z7'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
res = client.basicAccurate(image)

if 'words_result' in res.keys():
    for item in res['words_result']:
        print(item['words'])
#---------------------------------------------------------------------
优美胜于丑陋
明了胜于晦涩
简洁胜于复杂
复杂胜于凌乱
扁平胜于嵌套
间隔胜于紧凑

你可能感兴趣的:(爬虫对抗系列-验证码)