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