Index of /tesseract (uni-mannheim.de)

https://github.com/tesseract-ocr/tessdata

目录

Python 验证码

数字+字母的验证码

pytesseract库的安装

pillow 库

Filter

Format

带干扰的验证码识别

获取 Access Token

通过百度模块调用验证码识别


Python 验证码

如果你是一个数据挖掘爱好者,那么验证码是你避免不过去的一个天坑,和各种验证码斗争,必然是你成长的一条道路,

本篇文章为你带来验证码的入门案例,来吧,一起 Coding 吧。

数字+字母的验证码

我随便在百度图片搜索了一个验证码,如下

今天要做的是验证码识别中最简单的一种办法,采用pytesseract解决,它属于 Python 当中比较简单的OCR识别库

pytesseract库的安装

超详细解决pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in yo...

Tesseract OCR V5.0安装教程(Windows

使用pytesseract之前,你需要通过 pip 安装一下对应的模块 ,需要两个

pytesseract 库还有图像处理的 pillow 库了

pip install pytesseract
pip install pillow

如果你安装了这两个库之后,编写一个识别代码,一般情况下会报下面这个错误

pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path

这是由于你还缺少一部分内容

安装一个 Tesseract-OCR 软件。这个软件是由 Google 维护的开源的 OCR 软件。

下载地址 > https://github.com/tesseract-ocr/tesseract/wiki

中文包的下载地址 > https://github.com/tesseract-ocr/tessdata

选择你需要的版本进行下载即可

pillow 库

命令 释义
open() 打开一个图片
from PIL import Image
im = Image.open(“1.png”)
im.show()
save() 保存文件
convert() convert() 是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式,mode 的取值可以是如下几种:
· 1 (1-bit pixels, black and white, stored with one pixel per byte)
· L (8-bit pixels, black and white)
· P (8-bit pixels, mapped to any other mode using a colour palette)
· RGB (3x8-bit pixels, true colour)
· RGBA (4x8-bit pixels, true colour with transparency mask)
· CMYK (4x8-bit pixels, colour separation)
· YCbCr (3x8-bit pixels, colour video format)
· I (32-bit signed integer pixels)
· F (32-bit floating point pixels)

Filter

from PIL import Image, ImageFilter
im = Image.open(‘1.png’)
# 高斯模糊
im.filter(ImageFilter.GaussianBlur)
# 普通模糊
im.filter(ImageFilter.BLUR)
# 边缘增强
im.filter(ImageFilter.EDGE_ENHANCE)
# 找到边缘
im.filter(ImageFilter.FIND_EDGES)
# 浮雕
im.filter(ImageFilter.EMBOSS)
# 轮廓
im.filter(ImageFilter.CONTOUR)
# 锐化
im.filter(ImageFilter.SHARPEN)
# 平滑
im.filter(ImageFilter.SMOOTH)
# 细节
im.filter(ImageFilter.DETAIL)

Format

format 属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为 None;
size 属性是一个 tuple,表示图像的宽和高(单位为像素);
mode 属性为表示图像的模式,常用的模式为:L 为灰度图,RGB 为真彩色,CMYK 为 pre-press 图像。如果文件不能打开,则抛出 IOError 异常。

验证码识别

注意安装完毕,如果还是报错,请找到模块 pytesseract.py 这个文件,对这个文件进行编辑

一般这个文件在 C:\Program Files\Python36\Lib\site-packages\pytesseract\pytesseract.py 位置

文件中 tesseract_cmd = 'tesseract' 改为自己的地址
例如: tesseract_cmd = 'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'

如果报下面的 BUG,请注意

Error opening data file \Program Files (x86)\Tesseract-OCR\tessdata/chi_sim.traineddata Please make sure the TESSDATA_PREFIX environment variable

解决办法也比较容易,按照它的提示,表示缺失了 TESSDATA_PREFIX 这个环境变量。你只需要在系统环境变量中添加一条即可

将 TESSDATA_PREFIX=C:\Program Files (x86)\Tesseract-OCR 添加环境变量

重启 IDE 或者重新 CMD,然后继续运行代码,这个地方注意需要用管理员运行你的 py 脚本

步骤分为

  1. 打开图片 Image.open()
  2. pytesseract 识别图片
import pytesseract
from PIL import Imagedef main():image = Image.open("1.jpg")text = pytesseract.image_to_string(image,lang="chi_sim")print(text)if __name__ == '__main__':main()

测试英文,数字什么的基本没有问题,中文简直惨不忍睹。空白比较大的可以识别出来。唉~不好用
当然刚才那个7364 十分轻松的就识别出来了。

带干扰的验证码识别

接下来识别如下的验证码,我们首先依旧先尝试一下。运行代码发现没有任何显示。接下来需要对这个图片进行处理

基本原理都是完全一样的

  1. 彩色转灰度
  2. 灰度转二值
  3. 二值图像识别

彩色转灰度

im = im.convert('L')

灰度转二值,解决方案比较成套路,采用阈值分割法,threshold 为分割点

def initTable(threshold=140):table = []for i in range(256):if i < threshold:table.append(0)else:table.append(1)return table

调用

binaryImage = im.point(initTable(), '1')#像素遍历
binaryImage.show()

调整之后

通过百度提供的接口实现验证码识别

今天你要学习的验证码采用通过第三方 AI 平台开放的 OCR 接口实现,OCR 文字识别技术目前已经比较成熟了,而且第三方比较多,今天采用的是百度的。

获取 Access Token

程序调用接口是要生成access_token

Access Token 用于基于 Token 的认证模式,允许应用访问一个资源 API。

  •  先去创建一个应用

百度智能云-管理中心 (baidu.com)

  • 请求URL数据格式

向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:

  • grant_type: 必须参数,固定为client_credentials
  • client_id: 必须参数,应用的API Key
  • client_secret: 必须参数,应用的Secret Key

注:

  • API KeySecret Key 均可在百度智能云控制台 各技术方向概览页的应用列表 处获取,若无应用请先进行创建;
  • API KeySecret Key用于接口调用鉴权,请务必注意保密,不可在公开文档或代码中以明文展示,否则可能导致账号被盗用。

百度官网获取access_token示例代码

# encoding:utf-8
import requests # client_id 为官网获取的API Key, client_secret 为官网获取的Secret Key
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
response = requests.get(host)
if response:print(response.json())

请求百度orc通用文字识别API

有了access_token之后就可以开始识别请求了。
HTTP 方法:POST
请求URL: https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic
请求头: Content-Type application/x-www-form-urlencoded
请求参数:

  • image : 图像数据,base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效
  • url : 图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,当image字段存在时url字段失效
# encoding:utf-8import requests
import base64'''
通用文字识别
'''request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
# 二进制方式打开图片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())params = {"image":img}
access_token = '[调用鉴权接口获取的token]'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:print (response.json())

{'words_result': [{'words': '已只成此'}, {'words': '是生月蝶柱錦'}, {'words': '當煙明望思瑟'}, {'words': '時此珠帝無'}, {'words': '惘是追情'}, {'words': '已情有春年端'}, {'words': '惘可心莊五'}, {'words': '然當憶可'}, {'words': '然待蓝托生十'}, {'words': '成杜曉絃'}, {'words': '追日夢'}, {'words': '時待'}, {'words': '憶暖迷絃'}, {'words': '只玉海蝴'}], 'words_result_num': 14, 'direction': 0, 'log_id': 1592394631485448641}


脱离百度提供的文档自己编写:

获得access_token

    def get_accesstoken(self):res = requests.post(self.url.format(self.key,self.secret),headers=self.header)content = res.textif (content):return json.loads(content)["access_token"]
import requests
import jsonimport base64import urllib.request, urllib.parseclass GetCode(object):def __init__(self):self.url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}"self.api = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={}"self.header = {"Content-Type":'application/json; charset=UTF-8'}self.key = "你的KEY"self.secret = "你的SECRET"

验证码识别阶段

普通没有干扰的验证码,我们直接识别即可,但是有的验证码还是有干扰的,在识别之前,需要对它进行基本的处理,我们采用和上篇文章类似的办法进行,对它进行灰度处理和二值化操作。

def init_table(self,threshold=155):table = []for i in range(256):if i < threshold:table.append(0)else:table.append(1)return tabledef opt_image(self):im = Image.open("OIP-C.jpg")im = im.convert('L')im = im.point(self.init_table(), '1')#遍历每一个像素点im.save('OIP-C.jpg_s.png')return "OIP-C.jpg_s.png"

调用验证码接口

调用百度的验证码接口,不使用百度给的模块,直接编写。按照它对应的文档书写

   def get_file_content(self,file_path):with open(file_path, 'rb') as fp:base64_data = base64.b64encode(fp.read())s = base64_data.decode()data = {}data['image'] = sdecoded_data = urllib.parse.urlencode(data)return decoded_datadef show_code(self):image = self.get_file_content(self.opt_image())headers = {"Content-Type": "application/x-www-form-urlencoded"}res = requests.post(self.api.format(self.get_accesstoken()),headers=headers,data=image)print(res.text)

通过百度模块调用验证码识别

安装百度 AI

 pip install baidu-aip

from aip import AipOcr   #baidu_aip包中的AipOCR实现图像文字识别# 定义常量
APP_ID = '15736693'
API_KEY = '你的KEY'
SECRET_KEY = '你的SECRET'# 初始化文字识别
aipOcr=AipOcr(APP_ID, API_KEY, SECRET_KEY)# 读取图片
filePath = "OIP-C.jpg"def get_file_content(filePath):with open(filePath, 'rb') as fp:return fp.read()# 定义参数变量
options = {'detect_direction': 'true','language_type': 'CHN_ENG',
}# 网络图片文字文字识别接口
result = aipOcr.webImage(get_file_content(filePath),options)print(result)
{'words_result': [{'words': '已只成此'}, {'words': '是生月蝶柱錦'}, {'words': '當煙明望思瑟'}, {'words': '時此珠帝無'}, {'words': '惘是追情'}, {'words': '已情有春年端'}, {'words': '惘可心莊五'}, {'words': '然當憶可'}, {'words': '然待蓝托生十'}, {'words': '成杜曉絃'}, {'words': '追日夢'}, {'words': '時待'}, {'words': '憶暖迷絃'}, {'words': '只玉海蝴'}], 'words_result_num': 14, 'direction': 0, 'log_id': 1592394631485448641}

文字识别OCR (baidu.com)

【python爬虫笔记】验证码相关推荐

  1. Python爬虫笔记(3)- 爬取丁香园留言

    Python爬虫笔记(3)- 爬取丁香园留言 爬取丁香园留言:主要用到了模拟登录 爬取丁香园留言:主要用到了模拟登录 import requests, json, re, random,time fr ...

  2. Python爬虫笔记

    Python爬虫笔记 总体看过程 赋予地址 获取网页信息 获取网页中所需的信息 将得到所需的信息保存到硬盘 总体看过程 爬虫-从网络上爬取所需要的信息,怎么爬取?首先得知道你要去哪里获取(即地址,首先 ...

  3. python爬虫笔记第二章

    前言 你好! 这是基于b站2021年路飞学成爬虫教程的python爬虫学习笔记,主要是方便作者复习和回顾课程内容. 已经发布了第一章和第二章,可以在主页中查看. python爬虫笔记(第二章) 前言 ...

  4. python爬虫遇到验证码的处理方法(以爬取中国执行信息公开网为例)

    朋友们大家好,python爬虫是在学习python时比较容易上手的学习方式,爬虫的思路简要以下几点: 1.获取需要爬取页面的网址,并且对网页内容进行分析.(主要就源代码讨论,如果我们需要的内容没有在源 ...

  5. Python爬虫笔记汇总

    文中介绍的比较详细的有,requests库,urllib.request库,BeautifulSoup库,re库和正则表达式,Scrapy常用命令. 一.requests库 课程小案例 京东商品详情页 ...

  6. Python 爬虫云验证码识别

    Python 爬虫验证码识别 1. 百度智能云 2. 使用 2.1 API 文档使用 2.2 SDK 文档使用 3. 获取古诗文网验证码 免责声明:自本文章发布起, 本文章仅供参考,不得转载,不得复制 ...

  7. Python爬虫笔记——解析json数据(以周杰伦歌单为例)及Headers

    一.Network Network能够记录浏览器的所有请求.我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看 ...

  8. Python爬虫笔记——分析AJAX传递的JSON获取数据-初步分析动态网页

    转载文章链接: Python爬虫:分析AJAX传递的JSON获取数据-初步分析动态网页(1) [4]实战:爬取动态网页的两种思路爬取新浪趣图(1) [5]实战:爬取动态网页的两种思路爬取新浪趣图(2) ...

  9. Python爬虫笔记——解决python 写入文件中文乱码问题

    原链接: python 爬虫写入文件中文乱码问题解决 分析过程 根据网上的一些建议,将文件的打开编码改为 utf-8 ,结果跟本不起作用 奇怪的是用notepad 打开 csv 文件竟然显示正常,看来 ...

最新文章

  1. 企业桌面安全管理解决方案
  2. GitHub高效搜索
  3. C# 集合交、并、差、去重,对象集合交并差
  4. 移动开发还有未来吗?
  5. 一套比较完整的前端技术选型,需要规整哪些东西,你知道不?
  6. 修改程序的形而上学思考(随笔)
  7. oracle signed类型,char、signed char 和 unsigned char 的区别
  8. java三个数比大小_三个数的比较 不同的实现方法java
  9. 怎样快速学会python_python入门如何更快的学习
  10. EXCEL以及VBA 函数讲解集合
  11. astah export sql mysql_Astah繪製UML圖形-入門篇
  12. AI智能语音系统源码搭建
  13. 容器网络之Kubernetes CNI
  14. Google Dapper,大规模分布式系统的跟踪系统
  15. C++11新特性,推荐使用emplace_back()替换push_back()的原因
  16. 这五个灵魂问题,解决BI新人80%的困惑
  17. gPTP与PTP理解资料参考
  18. C#中取得日期的英文缩写
  19. 我推崇的流行唱法:美國Speech Level Singing的介紹和討論(推荐)
  20. android自定义多选框 带图片,Android自定义单选多选下拉列表的实例代码

热门文章

  1. 迁移学习-域适应损失函数MMD-代码实现及验证
  2. python数据分析的交叉分析和分组分析 -第三次笔记
  3. matlab输入一个3位整数,matlab随机产生一个3位整数,将它的十位数变为0。例如,输入738则输出708。...
  4. G-sensor概述及常用芯片整理(转)
  5. 微信支付退款 升级版 【码云gvp 】
  6. c语言小游戏——弹跳的小球和简单的飞机游戏
  7. 谈《西游记》和泛项目
  8. 查看IP和MAC地址的命令
  9. html 输入框加搜索框,如何实现一个input搜索框?
  10. 「卷无人道」,手机app定制