上一篇文章是爬取了12306的车次信息,那么还有登录,购票等等。
这里一步一步的文章来学习登录,图片识别,验证码等技术。不断学习中。最近太忙,都没有搞py,有时间就弄一下,欢迎简书交流。
1. 安装py库
pytesseract,详细使用说明
pytesseract 0.1.7
PIL图片常用库
安装
pip install pytesseract
pip install pillow
查看安装之后的库
pip freeze
2. 使用pytesseract库
首先进入pytesseract网页查看说明和使用例子.
pytesseract截图
在使用例子中,做了详细说明:
- 需要使用一个Tesseract-OCR Engine的东西来做识别(第一个红圈)。
- 需要找到Tesseract-OCR Engine来做识别(第一个方框)
- 需要识别的文字语言包(第二个方框)
3. 安装Tesseract-OCR Engine,语言包
- 点击上图红圈中的Google's Tesseract-OCR Engine进入pytesseract的github中,向下翻找到installing Tesseract
tesseract github.png - Install Tesseract via pre-built binary package 进入,该页面详细记录了安装linux ,mac os ,window的安装包或者源码。对应下载安装即可。
-
我使用window系统,所以下载即可。在下图中说明了下载位置,语言包等,最重要的是需要配置环境变量。但是发现配置了环境变量成功,但是在使用过程中还是指定了tesseract引擎的位置。不然就报错。
window系统说明,下载位置 - 在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的标题,我是很不满意的,只能识别很简单的字,复杂的,字体很倾斜的都基本认不出来,效率太低了。
12306验证码图片
识别结果
这种识别率太低,而且还很多都不能识别。
我也不知道这个到底行不行了。
各位要是有好的识别方法,欢迎下方留言交流。希望找出一种识别率很高的出来。不然这个验证码基本就gg了。