第十二阶段 -- 爬虫05:【Tesseract识别验证码】

1. Tesseract介绍

tesseract 是一个google支持的开源ocr项目

其项目地址:https://github.com/tesseract-ocr/tesseract

目前最新的源码可以在这里下载

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版本,都是三方维护和管理的安装包,有好几个发行机构,分别是:

3. 小结

  1. 官方发布的3.02版本下载地址

    http://downloads.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Ftesseract-ocr-alt%2Ffiles%2F&ts=1464880498&use_mirror=jaist

  2. 德国曼海姆大学发行的3.05版本下载地址

    http://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.00dev.exe

  3. 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 的使用

  1. 示例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)

  1. 示例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)

  1. 示例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)

  1. 示例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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值