用python识别验证码

前言

经常大家在做自动化测试或者做网络爬虫的时候,都很容易遇到验证码。
今天,我们就简单的说下,怎么用python来处理验证码。
(注意:我所有的python相关的文章用的都是python3。)

准备工作

1、tesseract-ocr软件

Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封。
数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。
总之,tesseract-ocr是一个做图形识别必须用到第一个软件,不仅可以处理验证码,也可以识别图片上的文字等等。

我已经把软件上传了我的网盘,大家可以直接下载,不需要安装,解压即可。
下载地址:
链接:https://pan.baidu.com/s/1bpMz3OV 密码:108a

2、Pytesseract包

Pytesseract是一个python的第三方的包,主要作用就是用来连接操作tesseract-ocr工具。
为我们用python来处理图形打好了基础。
可以使用pip工具直接安装。

3、Pillow包

python的图形处理库,用来处理调整图形的各种内容。
Pillow由PIL而来,所以该导入该库使用import PIL。
Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。
可以使用pip工具直接安装。

配置环境

第一步、把Tesseract-OCR添加到环境变量。

我们下载好Tesseract-OCR后,直接将其解压,然后把所在路径添加到环境变量中。
如图所示:


Tesseract路径.png

复制路径:D:\Program Files\Tesseract-OCR
添加到环境变量PATH中


环境变量.png

第二步、安装Pytesseract和Pilllow包

打开cmd,使用pip工具依次安装Pytesseract和Pilllow包
如图所示:


pytesseract.gif

第三步、检查是否安装成功

1、检查tesseract-ocr
打开cmd,输入tesseract


image.png

2、检查Pytesseract和Pillow包
在python里导入试试吧,没有报错,那就说明成功了。


image.png

OK!没问题,说明我们已经安装成功了,那我们就开始写代码了。

识别验证码

要识别验证码,那我们首先就要获取验证码。
我一般有两种常用的方式去获取验证码。
第一种是通过接口保存验证码。
第二种是通过截图保存验证码。
我们依次说明。

1、通过接口保存验证码并识别。

通过接口去获取的话,我们是需要借助requests这个包的。
这里我们主要讲识别验证码,requests我会在其他文章里详细的说明。

import requests
import pytesseract
from PIL import Image
'''
调用接口请求验证码,保存到本地,识别验证,检查识别的验证码对不对。
'''
# 获取图片的接口地址
url = hurl + "/file/getCaptcha1"
# headers需要的参数
headers = None
# 接口需要的参数
querystring = {"w": "70", "h": "29"}
# 发送请求
response = requests.request("GET", url, headers=headers, params=querystring, verify=False)
# 接口返回的数据以二进制的方式展示
img = response.content
# 选择保存的路径和图片格式
with open('F:\MyPython\TestCode\data\code.jpg', 'wb') as f:
    # 保存
    f.write(img)
# 用Image模块打开上一步保存的验证码
image = Image.open('F:\MyPython\TestCode\data\code.jpg')
# 识别验证码
optCode = pytesseract.image_to_string(image)
# 打印出验证码
print("验证码:", optCode)

2、通过截图保存验证码并识别。

要截图的话肯定需要界面,那么我们就需要借助selenium去操作了。
selenium这里也不讲,大家应该都会吧。

import pytesseract
from PIL import Image
from selenium import webdriver
'''
调用接口请求验证码,保存到本地,识别验证,检查识别的验证码对不对。
'''
driver = webdriver.Chrome()
打开有验证码的界面
driver.get("https://www.XXXX.com/login")
# 比较好理解、截图并保存到这个路径
driver.get_screenshot_as_file('F:/VScode/LoarRunner/Vcode/homepage.png')
# 打开刚刚保存的图片
im = Image.open('F:/VScode/LoarRunner/Vcode/homepage.png')
# 设置要裁剪的区域(验证码所在的区域)
box = (1214, 82, 1285, 111)
# 截图,生成只有验证码的图片
region = im.crop(box)
# 保存到本地路径
region.save("F:/VScode/LoarRunner/Vcode/image_code.jpg")
# 读取验证码图片
image = Image.open("F:/VScode/LoarRunner/Vcode/image_code.jpg")
# 开始识别验证码
optCode = pytesseract.image_to_string(image)
# 打印出验证码
print(optCode)

总结

简单的来说,识别图片,验证码,文字啊,都可以这样子操作。
但是验证码的处理远远没有这么简单。
毕竟啊,现在的验证码是越来越变态。
希望大家可以灵活应用图形处理方法。
可以尝试下识别照片上的文字什么的。

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 19,163评论 6 415
  • GitHub 上有一个 Awesome - XXX 系列的资源整理,资源非常丰富,涉及面非常广。awesome-p...
    若与阅读 12,413评论 4 407
  • 原文链接: http://www.jianshu.com/p/9c6ae64a1bd7 GitHub 上有一个 A...
    李绍俊阅读 4,749评论 0 94
  • 前言 相信大家利用 Python 写的爬虫应该遇到过要输入验证码的尴尬局面,又或者写了个自动填充表单的小程序,结果...
    迦度蓝洛阅读 14,503评论 2 35
  • 1.为什么学习设计模式 对于设计模式,我们并不陌生。一谈起设计模式,脑海里马上就想到单例模式,委托模式,观察者模式...
    coder小鹏阅读 2,852评论 13 16