1. Tesseract介绍
tesseract 是一个google支持的开源ocr项目
目前最新的源码可以在这里下载
2. Tesseract安装包下载
Tesseract的release版本下载地址:https://github.com/tesseract-ocr/tesseract/wiki/Downloads,这里需要注意这一段话:
Currently, there is no official Windows installer for newer versions
意思就是官方不提供最新版windows平台安装包,只有相对略老的3.02.02版本,其下载地址:https://sourceforge.net/projects/tesseract-ocr-alt/files/
最新版3.03和3.05版本,都是三方维护和管理的安装包,有好几个发行机构,分别是:
- https://www.dropbox.com/s/8t54mz39i58qslh/tesseract-3.05.00dev-win32-vc19.zip?dl=1
- https://github.com/UB-Mannheim/tesseract/wiki
- http://domasofan.spdns.eu/tesseract/
3. 小结
-
官方发布的3.02版本下载地址
-
德国曼海姆大学发行的3.05版本下载地址
http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.00dev.exe
-
imon Eigeldinger (@DomasoFan) 维护的另一个版本
http://3.onj.me/tesseract/
值得称道的是,这个网址里还有一个比较详细的说明
4. Tesseract ocr使用
安装之后,默认目录C:\Program Files (x86)\Tesseract-OCR,你需要把这个路径放到你操作系统的path搜索路径中,否则后面使用起来会不方便。
在安装目录C:\Program Files (x86)\Tesseract-OCR下可以看到 tesseract.exe这个命令行执行程序
tesseract 1.png output-l eng -psm 7
-psm 7 表示用单行文本识别
pagesegmode值:
- 0 =定向和脚本检测(OSD)。
- 1 =带OSD的自动页面分割。
- 2 =自动页面分割,但没有OSD或OCR
- 3 =全自动页面分割,但没有OSD。(默认)
- 4 =假设一列可变大小的文本。
- 5 =假设一个统一的垂直对齐文本块。
- 6 =假设一个统一的文本块。
- 7 =将图像作为单个文本行处理。
- 8 =把图像当作一个单词。
- 9 =把图像当作一个圆圈中的一个词来对待。
- 10 =将图像作为单个字符处理
#-l eng 代表使用英语识别
5. pytesseract 的使用
- 示例01:
# pip install pytesseract
# pip install pillow
import pytesseract
from PIL import Image
# 打开图片
img = Image.open('yzm2.jpg')
# 识别图片
s = pytesseract.image_to_string(img)
# 打印结果:
print(s)
- 示例02:云打码验证码登录
from fake_useragent import UserAgent
import requests
# 从云打码网站购买的验证码识别包
from day05.ydm_util import get_code
url = 'http://www.yundama.com/index/login'
headers = {'User-Agent': UserAgent().chrome}
# 获取随机验证码图片的地址
img_url = 'http://www.yundama.com/index/captcha'
session = requests.Session()
img_resp = session.get(img_url, headers=headers)
with open('yzm.png', 'wb') as f:
f.write(img_resp.content) # 获取的是流
# code = input('请输入验证码:')
code = get_code('yzm.png')
f_data = {
'username': '398707160_pt',
'password': '123654abc',
'utype': '1',
'vcode': code, # 验证码图片
}
login_resp = session.get(url, headers=headers, params=f_data)
print(login_resp.text)
- 示例03: 赶集网验证码登录
from fake_useragent import UserAgent
import requests
import re
index_url = 'https://passport.ganji.com/login.php'
headers = {'User-Agent': UserAgent().chrome}
session = requests.Session()
index_resp = session.get(index_url, headers=headers)
# 获取哈希码
hash_code = re.findall(r'"__hash__":"(.+?)"}', index_resp.text)[0]
img_url = 'https://passport.ganji.com/ajax.php?dir=captcha&module=login_captcha'
img_resp = session.get(img_url, headers=headers)
with open('yzm.png', 'wb') as f:
f.write(img_resp.content)
check_code = input("请输入验证码:")
login_url = 'https://passport.ganji.com/login.php'
f_data = {
'username': '17703181473',
'password': '123456abc',
'setcookie': '14',
'checkCode': check_code,
'next': '',
'source': 'passport',
}
login_resp = session.post(login_url, headers=headers, data=f_data)
print(login_resp.text)
- 示例04:12306网站点选图片验证码
import base64
from fake_useragent import UserAgent
import requests
import re
img_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand'
headers = {'User-Agent': UserAgent().chrome}
session = requests.Session()
img_resp = session.get(img_url, headers=headers)
img_str = re.findall(r'"image":"(.+?)"', img_resp.text)[0]
temp = base64.b64decode(img_str)
with open('yzm.png', 'wb') as f:
f.write(temp)
img_postion = ['45,45', '115,45', '190,50', '264,44', '46,120', '115,121', '188,121', '261,119']
img_str = ''
while True:
choose = input('请选择图片(1-8):')
img_str += img_postion[int(choose) - 1]
next = input('是否是继续选择?(y/n)')
if next == 'n':
break
img_str += ','
check_code = 'https://kyfw.12306.cn/passport/captcha/captcha-check'
check_data = {
'answer': img_str,
'rand': 'sjrand',
'login_site': 'E',
}
check_resp = session.get(check_code, headers=headers, params=check_data)
print(check_resp.text)
login_url = 'https://kyfw.12306.cn/passport/web/login'
login_data = {
'username': 'username',
'password': 'password',
'appid': 'otn',
'answer': img_str,
}
resp = session.post(login_url, headers=headers, data=login_data)
resp.encoding = 'utf-8'
print(resp.text)
info_url = 'https://kyfw.12306.cn/otn/view/index.html'
info_resp = session.get(info_url, headers=headers)
info_resp.encoding = 'utf-8'
print(info_resp.text)