前言
有些注册页面会含有验证码,本篇描述在selenium中对验证码的处理实例
需求
打开万维易源注册页面:https://www.showapi.com/auth/reg (这个是第三方api平台易源接口,后面验证码识别用的就是他的)
在注册页面中包含验证码的操作
需求分析
1)打开控制台,点击上方截图中的验证码图片,在network中会有一条请求信息(这里为获取验证码图片的请求)
2)浏览器直接打开(发现打开的图片验证码并不是我们在注册页面看到的,浏览器刷新一下,发现每次图片都是变化的不固定的,因此我们不能直接通过请求来获取这个验证码图片)
3) 那我们怎么将验证码图片保存下来呢?
解决办法:在注册页面将验证码图片的位置获取到,利用python中的pillow模块将图片切下后保存下来
代码第一部分(保存验证码图片)
1)使用PIL裁切图片需使用PIL引用Image模块(pip install pillow直接安装)
2)Image.open(file)方法可以返回打开的图片
3)使用crop((x0,y0,x1,y1))方法可以对图片做裁切;依次为起始点的横坐标、起始点的纵坐标、距离原点的宽度、高度
3)查找到元素,通过element.location可以得到x0,y0;通过element.size计算得到x1,y1即可
# coding:utf-8
from selenium import webdriver
from PIL import Image
driver = webdriver.Chrome()
driver.get("https://www.showapi.com/auth/reg")
# 1.将注册页面截图保存,这里需要以png结尾,其他图片格式会有warning
driver.save_screenshot("img/scr_img.png")
# 2.定位到验证码图片元素
code_ele = driver.find_element_by_id("checkImg")
# 3.元素的位置,结果:{'y': 478, 'x': 565},为图片左上角的位置
print(code_ele.location)
# 4.元素的大小,结果:{'height': 37, 'width': 135}
print(code_ele.size)
# 5.得到将元素的具体位置
x0 = code_ele.location["x"] # 565
y0 = code_ele.location["y"] # 478
x1 = code_ele.size["width"] + x0
y1 = code_ele.size["height"] + y0
img = Image.open("img/scr_img.png")
image = img.crop((x0,y0,x1,y1)) # 左、上、右、下
image.save("img/code_img.png") # 将验证码图片保存为code_img.png
打开img文件夹,验证码的图片被保存下来了
识别验证码
1)首先想到使用到python中的pytesseract模块(安装以及简单使用教程),但是试了一下没有将验证码字符串打印出来,这个模块只适合没有干扰项,特别简单的验证码,然而在一般的项目中非常简单的这种是不存在的
2)一般关于验证码的处理会在测试过程中直接去掉,或者设置成万能验证码,如果一定要对验证码操作的话,为保证正常获取的话需要借助第三方平台,这种平台很多,他们会提供调用的接口,我们直接调用拿到结果就可以了,但是一般都是收费的,这里就做简单演示吧(我这里花了0.1元购买了试了一下,确实好用,哈哈)
3)查看一下关于python 语言的调用方式
(具体调用:https://www.showapi.com/apiGateway/view/apiCode=184&pointCode=4)
4)首先下载SDK(下载下来是一个zip文件,解压后为一个py文件,直接copy到我们的项目中)
5)在我们读取验证码的py文件中直接调用
① 这里为copy的调用案例
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) # 返回信息
②上方的my_appId,my_appSecret需要付费后在个人中心-我的应用查看
代码部分(完整)
# coding:utf-8
from selenium import webdriver
from PIL import Image
from ShowapiRequest import ShowapiRequest
driver = webdriver.Chrome()
driver.get("https://www.showapi.com/auth/reg")
# 1.将注册页面截图保存,这里需要以png结尾,其他图片格式会有warning
driver.save_screenshot("img/scr_img.png")
# 2.定位到验证码图片元素
code_ele = driver.find_element_by_id("checkImg")
# 3.元素的位置,结果:{'y': 478, 'x': 565},为图片左上角的位置
# print(code_ele.location)
# 4.元素的大小,结果:{'height': 37, 'width': 135}
# print(code_ele.size)
# 5.得到将元素的具体位置
x0 = code_ele.location["x"] # 565
y0 = code_ele.location["y"] # 478
x1 = code_ele.size["width"] + x0
y1 = code_ele.size["height"] + y0
img = Image.open("img/scr_img.png")
image = img.crop((x0,y0,x1,y1)) # 左、上、右、下
image.save("img/code_img.png") # 将验证码图片保存为code_img.png
# 6.识别验证码
r = ShowapiRequest("http://route.showapi.com/184-4","103296","db501a2c5da647fa9a07d3b4xxxxxxxx" )
r.addBodyPara("img_base64", "")
r.addBodyPara("typeId", "30")
r.addBodyPara("convert_to_jpg", "0")
r.addFilePara("image", "img/code_img.png") # img/code_img.png为存放的图片文件
res = r.post()
code_text = res.json()["showapi_res_body"]["Result"]
print(code_text) # 打印返回结果
查看执行结果
打开img目录查看验证码图片(正确返回了验证码内容,之后就可以直接在验证码输入框输入啦)
至此,在selenium中对验证码的处理梳理完毕