一、准备
1、环境基础:Python3 + pycharm + selenium + request + Pillow,chrome浏览器的驱动程序
1)python:这里用的是Python3.7的,安装略;
2)pycharm:编辑器建立Python工程,安装略;
3)selenium:Python3环境应该自带pip.exe,只需在cmd命令窗口输入pip install selenium 进行安装;
4)request:用于接口识别,只需在cmd命令窗口输入pip install request 进行安装;
5)Pillow:用于图片切割,只需在cmd命令窗口输入pip install pillow 进行安装;
6)chrome浏览器的驱动程序:到:http://chromedriver.storage.googleapis.com/index.html? 下载合适的 chromedriver.exe,64位的向下兼容,可以下载32的。解压后放在Python安装目录下,见 。
2、易源网站-算法的接口(收费的)
1)需要注册后购买验证码接口算法,一般测试人员不会花时间去写图片识别的算法;
2)准备 用户id(my_appId)和 密码(my_appSecret),网站里有用户使用说明;
3)识别率高达 90%,只能识别 中文、数字、英文。
二、实现
1、在易源网站-图片验证码识别-请求示例,下载Python-SDK,解压后放在Python安装目录库下(如:D:\Python37\Lib)。
2、使用selenium启动chrome浏览器,进入验证码填写页面:
'''调用chrome浏览器,打开最大化浏览器'''
driver = webdriver.Chrome() # 打开浏览器
driver.get("验证码页面地址")# 打开地址
driver.maximize_window()
time.sleep(2)
3、截图浏览器中的图片,进行切割(Pillow库),编写图片切割函数:
'''截图浏览器中的图片,进行切割(Pillow库),从网页中提取出验证码图片'''
def jietu():
driver.save_screenshot("D:/yemian.png")
'''使用坐标方式,拿到验证码左上角坐标'''
left_top = driver.find_element_by_id("captchaImg").location
print("左上角坐标",left_top)
x1 = left_top['x']# 验证码框的左上角的x轴坐标
y1 = left_top['y']# 验证码框的左上角的y轴坐标
'''取出右下角坐标'''
img = driver.find_element_by_id("captchaImg")# 定位图片
x2 = img.size['width']+x1 # 获取图片的宽度+ x1 =====》右坐标
y2 = img.size['height']+y1 # 获取图片的高度+ y1 =====》 下坐标
print("四个点的坐标",x1,y1,x2,y2)
'''利用这四个坐标切割图片'''
yan_img = Image.open("D:/yemian.png")# 打开图片
yan_ma = yan_img.crop((x1,y1,x2,y2))
yan_ma.save("D:/yanzhengma.png")# 保存到硬盘上
4、针对验证码进行识别,(易源的接口),易源网站-图片验证码识别中有对应的使用方法:
易源网站示例:
from ShowapiRequest import ShowapiRequest
r = ShowapiRequest("http://route.showapi.com/184-4","my_appId","my_appSecret" )
r.addFilePara("image", "替换为你的文件")
r.addBodyPara("typeId", "34")
r.addBodyPara("convert_to_jpg", "0")
r.addBodyPara("needMorePrecise", "0")
res = r.post()
print(res.text) # 返回信息
自写实现方法:
'''再针对验证码进行识别(易源的接口)'''
def shibieyanzhengma():
# 使用接口环境访问接口地址===>前提要注意联网
yun1 = ShowapiRequest("http://route.showapi.com/184-4","my_appId","my_appSecret")
# 增加接口请求的参数
yun1.addBodyPara("typeId","36")#“36”:英数组合,6位验证码
yun1.addBodyPara("convert_to_jpg","0")#“0”:不需要图片转换
# 告诉接口识别的验证码图片文件
yun1.addFilePara("image","D:/yanzhengma.png")
# 访问接口
result = yun1.post().json()
print(result)
# 从json提炼出有效的数据
text = result['showapi_res_body']['Result']
print("验证码是",text)
return text
三、脚本
注:上面实现方法写的是 验证码识别英数_文件 类型的验证码。
1、验证识别-英数组合6位:
__author__ = "三天乐趣"
from PIL import Image
from selenium import webdriver
from ShowapiRequest import ShowapiRequest
import time
'''1、调用chrome浏览器,打开最大化浏览器'''
driver = webdriver.Chrome() # 打开浏览器
driver.get("验证码页面地址")# 打开地址
driver.maximize_window()
time.sleep(2)
'''2、截图浏览器中的图片,进行切割(Pillow库),从网页中提取出验证码图片'''
def jietu():
driver.save_screenshot("D:/yemian.png")
'''使用坐标方式,拿到验证码左上角坐标'''
left_top = driver.find_element_by_id("captchaImg").location
print("左上角坐标",left_top)
x1 = left_top['x']# 验证码框的左上角的x轴坐标
y1 = left_top['y']# 验证码框的左上角的y轴坐标
'''取出右下角坐标'''
img = driver.find_element_by_id("captchaImg")# 定位图片
x2 = img.size['width']+x1 # 获取图片的宽度+ x1 =====》右坐标
y2 = img.size['height']+y1 # 获取图片的高度+ y1 =====》 下坐标
print("四个点的坐标",x1,y1,x2,y2)
'''利用这四个坐标切割图片'''
yan_img = Image.open("D:/yemian.png")# 打开图片
yan_ma = yan_img.crop((x1,y1,x2,y2))
yan_ma.save("D:/yanzhengma.png")# 保存到硬盘上
'''3、再针对验证码进行识别(易源的接口)'''
def shibieyanzhengma():
# 使用接口环境访问接口地址===>前提要注意联网
yun1 = ShowapiRequest("http://route.showapi.com/184-4","my_appId","my_appSecret")
# 增加接口请求的参数
yun1.addBodyPara("typeId","36")
yun1.addBodyPara("convert_to_jpg","0")
# 告诉接口识别的验证码图片文件
yun1.addFilePara("image","D:/yanzhengma.png")
# 访问接口
result = yun1.post().json()
print(result)
# 从json提炼出有效的数据
text = result['showapi_res_body']['Result']
print("验证码是",text)
return text
# 运行
if __name__=="__main__":
jietu()
# 调用验证码函数获取结果
yanzhengma = shibieyanzhengma()
# 将验证码放到网页上
driver.find_element_by_name("inputCode").send_keys(yanzhengma)
# time.sleep(3)
# driver.quit()
效果1:
2、验证码识别-算数识别_base64:
__author__ = "三天乐趣"
from PIL import Image
from selenium import webdriver
from ShowapiRequest2 import ShowapiRequest
import time
import base64
'''1、调用chrome浏览器,打开最大化浏览器'''
driver = webdriver.Chrome() # 打开浏览器
driver.get("验证码页面地址")# 打开地址
driver.maximize_window()
time.sleep(2)
'''2、截图浏览器中的图片,进行切割(Pillow库),从网页中提取出验证码图片'''
def jietu():
driver.save_screenshot("D:/yemian.png")
'''使用坐标方式,拿到验证码左上角坐标'''
left_top = driver.find_element_by_xpath("/html/body/div[1]/div/div/div[2]/form[1]/div[3]/div[2]/img").location
print("左上角坐标",left_top)
x1 = left_top['x']# 验证码框的左上角的x轴坐标
y1 = left_top['y']# 验证码框的左上角的y轴坐标
'''取出右下角坐标'''
img = driver.find_element_by_xpath("/html/body/div[1]/div/div/div[2]/form[1]/div[3]/div[2]/img")# 定位图片
x2 = img.size['width']+x1 # 获取图片的宽度+ x1 =====》右坐标
y2 = img.size['height']+y1 # 获取图片的高度+ y1 =====》 下坐标
print("四个点的坐标",x1,y1,x2,y2)
'''利用这四个坐标切割图片'''
yan_img = Image.open("D:/yemian.png")# 打开图片
yan_ma = yan_img.crop((x1,y1,x2,y2))
yan_ma.save("D:/yanzhengma.png")# 保存到硬盘上
with open("D:/yanzhengma.png",'rb') as f:
data64 = base64.b64encode(f.read())
text64 = data64.decode()# 转换成图片的base64字符串
print(text64)
return text64
'''3、再针对验证码进行识别(易源的接口)'''
def shibieyanzhengma():
# 使用接口环境访问接口地址===>前提要注意联网
yun1 = ShowapiRequest("http://route.showapi.com/184-6","my_appId","my_appSecret")
# 增加接口请求的参数
yun1.addBodyPara("img_base64",jietu())
print(yun1.post().text)
# 从json提炼出有效的数据
result = yun1.post().json()
text = result['showapi_res_body']['Result']
print("验证码是",text)
return text
# # 运行
if __name__=="__main__":
# # 调用验证码函数获取结果
yanzhengma = shibieyanzhengma()
# 将验证码放到网页上
driver.find_element_by_name("captcha").send_keys(yanzhengma)
# time.sleep(3)
# driver.quit()
效果2:
谢谢,继续努力!
2019-08-25