Python3.x 实现12306登录之利用pytesseract文字识别

上一篇文章是爬取了12306的车次信息,那么还有登录,购票等等。
这里一步一步的文章来学习登录,图片识别,验证码等技术。不断学习中。最近太忙,都没有搞py,有时间就弄一下,欢迎交流。

1. 安装py库

pytesseract,详细使用说明

pytesseract 0.1.7 
PIL图片常用库
安装
pip install pytesseract
pip install pillow
查看安装之后的库
pip freeze

2. 使用pytesseract库

首先进入pytesseract网页查看说明和使用例子.

Python3.x 实现12306登录之利用pytesseract文字识别_第1张图片
pytesseract截图

在使用例子中,做了详细说明:

  1. 需要使用一个Tesseract-OCR Engine的东西来做识别(第一个红圈)。
  2. 需要找到Tesseract-OCR Engine来做识别(第一个方框)
  3. 需要识别的文字语言包(第二个方框)

3. 安装Tesseract-OCR Engine,语言包

  1. 点击上图红圈中的Google's Tesseract-OCR Engine进入pytesseract的github中,向下翻找到installing Tesseract
    Python3.x 实现12306登录之利用pytesseract文字识别_第2张图片
    tesseract github.png
  2. Install Tesseract via pre-built binary package 进入,该页面详细记录了安装linux ,mac os ,window的安装包或者源码。对应下载安装即可。
  3. 我使用window系统,所以下载即可。在下图中说明了下载位置,语言包等,最重要的是需要配置环境变量。但是发现配置了环境变量成功,但是在使用过程中还是指定了tesseract引擎的位置。不然就报错。


    Python3.x 实现12306登录之利用pytesseract文字识别_第3张图片
    window系统说明,下载位置
  4. 在w中就是下一步安装即可,此次安装语言包我是在安装的时候下载,选择简体中文就可以咯。

4. 代码实战

到了这里,所有的准备工作和代码其实都可以说是编写完成了的,因为在pytesseract的样例中就已经写的很清楚了。下面我贴上我的代码就行。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = "雷洪飞"

"""
 利用google pytesseract做文字识别,目的是为了做12306的图片校验。
"""
try:
    import Image
    import ImageEnhance
except ImportError:
    from PIL import Image, ImageEnhance

import pytesseract
import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


def get_title_pic():
    # 读取图片
    image = Image.open("image/code.png")
    # image.convert("L")
    box = (116, 0, 180, 30)
    t = image.crop(box)
    t.save("image/temp_title.png")


def get_title_text():
    base_img_url = "image/temp_title.png"
    image = Image.open(base_img_url)
    ImageEnhance.Contrast(image).enhance(3.0).convert("L").save(base_img_url)
    really_image = Image.open(base_img_url)
    # 配置tesseract 引擎位置
    pytesseract.pytesseract.tesseract_cmd = 'K:\Program Files\Tesseract-OCR\\tesseract.exe'
    # 配置语言包
    tessdata_dir_config = '--tessdata-dir "K:\\Program Files\\Tesseract-OCR\\tessdata"'
    # 使用pytesseract文字识别
    return pytesseract.image_to_string(really_image, lang='chi_sim', config=tessdata_dir_config)

def get_picture(url):
    headers = {
        "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"}
    response = requests.get(url, headers=headers, verify=False)
    response.encoding = 'utf-8'
    if response.status_code == 200:
        with open("./image/code.png", "wb") as f:
            f.write(response.content)
            print("图片下载成功")
            return True
    else:
        get_picture(url)


if __name__ == "__main__":
    url = "https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.6523880813900003"
    # 下载图片
    get_picture(url)
    # 得到图片的标题
    get_title_pic()
    # 获取标题文字
    text = get_title_text()
    print("识别结果:" + text)

6. 结果展示

对于识别12306的标题,我是很不满意的,只能识别很简单的字,复杂的,字体很倾斜的都基本认不出来,效率太低了。


Python3.x 实现12306登录之利用pytesseract文字识别_第4张图片
12306验证码图片

识别结果

这种识别率太低,而且还很多都不能识别。
我也不知道这个到底行不行了。

各位要是有好的识别方法,欢迎下方留言交流。希望找出一种识别率很高的出来。不然这个验证码基本就gg了。

你可能感兴趣的:(Python3.x 实现12306登录之利用pytesseract文字识别)