1.tesseract和tesserocr安装
- 这里需要注意两者的版本相容问题
首先装 tesseract
- 一键安装过后可在箭头处添加语言包,但是由于语言包增加多了的话对之后的验证码识别会有影响,(比如本来只有 62个字符 26+26+10,但是增加了语言包会识别出其他的字符),所以我只下了中文包。然后一键安装完毕。
其次装 tesserocr
- 前面提到要使两者版本相容,版本不一样会装不起。
- 建议将下好的tesserocr放在用户目录
C:\Users\XXX
下,因为terminal打开的时候默认是用户目录,所以比较方便安装,除非你想手动进入其他目录。 - 进入终端输入如下:
pip install tesserocr-2.4.0-cp37-cp37m-win_am.whl
(后面的这句根据版本要改你懂的=w=)。 - 下面进行tesserocr识别测试:把这张图 image.png 保存在用户目录下
在这里我直接打开终端的python输入验证了…
import tesserocr
from PIL import Image
img = Image.open('image.png')
print(tesserocr.image_to_text(img))
- 划重点:因为当时并不知道tesserocr的包已经在电脑里面,pycharm里面没有找到,pycharm也不能下tesserocr。但其实
pip install
的不在pycharm目录里面,而在电脑里面一个文件夹 例如:D:\Anaconda3\Lib\site-packages
里面,所以之后pycharm调用的话必须要复制粘贴进pycharm的包目录:.\venv\Lib\site-packages
2.验证码批量爬取
|- Img_download.py
|- image_from_web 储存爬取后图片
import os # 创建文件夹需要用
import requests # http客户端
from PIL import Image
IMAGE_URL = "http://my.cnki.net/elibregister/CheckCode.aspx" # 备用图片网址
def img_download(n, address):
"""
获取验证码
n 获取图片数量
address 图片保存地址
"""
os.makedirs('./' + str(address) + '/', exist_ok=True)
for a in range(n):
print('No' + str(a) + 'image is downloading')
r = requests.get(IMAGE_URL)
with open('./' + str(address) + '/img' + str(a) + '.png', 'wb') as f:
f.write(r.content)
Image.open('./' + str(address) + '/img' + str(a) + '.png').save('./' + str(address) + '/img' + str(a) + '.png')
img_download(1000, 'image_from_web')
3.验证码图像处理并识别
图像处理文件
|- img_manage.py
|- image_done 储存处理后图片
import os # 创建文件夹需要用
# import pytesseract
# pytesseract.pytesseract.tesseract_cmd = r"D:\tesseract_4.0\tesseract.exe"
from PIL import Image
import matplotlib.pyplot as plt
import tesserocr
def sum_9_region_new(img, x, y):
"""
9邻域框,以当前点为中心的田字框,黑点个数
:param x:
:param y:
:return:
"""
# todo 判断图片的长宽度下限
cur_pixel = img.getpixel((x, y)) # 当前像素点的值
width = img.width
height = img.height
if cur_pixel == 1: # 如果当前点为白色区域,则不统计邻域值
return 0
if y == 0: # 第一行
if x == 0: # 左上顶点,4邻域
# 中心点旁边3个点
sum = cur_pixel \
+ img.getpixel((x, y + 1)) \
+ img.getpixel((x + 1, y)) \
+ img.getpixel((x + 1, y + 1))
return 4 - sum
elif x == width - 1: # 右上顶点
sum = cur_pixel \
+