1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Python + Selenium(九)- 解决图片验证码登录或注册问题

Python + Selenium(九)- 解决图片验证码登录或注册问题

时间:2022-09-01 04:30:29

相关推荐

Python + Selenium(九)- 解决图片验证码登录或注册问题

1. 解决思路

首先要获得这张验证码的图片,但是该图片一般都是用的js写的,不能够通过url进行下载。

解决方案:截图然后根据该图片的定位和长高,使用工具进行裁剪裁剪完毕之后,使用工具解析该图片。

2. 代码实现

2.1 裁剪出验证码图片

裁剪图片需要使用 Pillow 库,进入pip包路径后输入安装命令pip install Pillow:

之前安装的时候忘记了截图,只能够截一张安装后的图片了 ╰(:з╰∠)_

安装完成后,代码实现方式如下:

#coding=utf-8from selenium import webdriverimport timefrom PIL import Imagefrom selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Chrome()# 进入该网站driver.get(".cn/wangbao/nme/sp/root/account/signup.html")# 能否在5s内找到验证码元素,能才继续if WebDriverWait(driver,5).until(lambda the_driver:the_driver.find_element_by_id("CaptchaImg"), "查找不到该元素"):# 对于一次截屏无法到截到验证码的情况,需要滚动一段距离,然后验证码的y坐标也应该减去这段距离scroll = 500js = "document.documentElement.scrollTop='%s'" %scrolldriver.execute_script(js)# 截下该网站的图片driver.get_screenshot_as_file("E:/Python_selenium_advance/Picture/full.png")# 获得这个图片元素img_ele = driver.find_element_by_id("CaptchaImg")# 得到该元素左上角的 x,y 坐标和右下角的 x,y 坐标left = img_ele.location.get('x')upper = img_ele.location.get('y') - 500right = left + img_ele.size.get('width')lower = upper + img_ele.size.get('height')# 打开之前的截图img = Image.open("E:/Python_selenium_advance/Picture/full.png")# 对截图进行裁剪,裁剪的范围为之前验证的左上角至右下角范围new_img = img.crop((left, upper, right, lower))# 裁剪完成之后保存到指定路径new_img.save("E:/Python_selenium_advance/Picture/croped.png")time.sleep(2)driver.quit()else:print("找不到验证码元素")

2.2 使用 图鉴 商用接口来识别验证码

接口介绍网址:/docs/python.html#pageTitle

调用该接口直接使用网页上的接口文档就行,代码如下:

import jsonimport requestsimport base64from io import BytesIOfrom PIL import Imagefrom sys import version_infodef base64_api(uname, pwd, softid, img):img = img.convert('RGB')buffered = BytesIO()img.save(buffered, format="JPEG")if version_info.major >= 3:b64 = str(base64.b64encode(buffered.getvalue()), encoding='utf-8')else:b64 = str(base64.b64encode(buffered.getvalue()))data = {"username": uname, "password": pwd, "softid": softid, "image": b64}result = json.loads(requests.post("/base64", json=data).text)if result['success']:return result["data"]["result"]else:return result["message"]return ""

将其保存为一个单独的 analysis_captcha.py ,然后再导入该方法,直接使用即可:

from analysis_captcha import base64_apidef analysis_captcha(filename):'''使用 图鉴 商用接口来识别指定位置的验证码图片:param filename: 验证码图片位置:return : 验证码文本'''img_path = filenameimg = Image.open(img_path)result = base64_api(uname='kaibin', pwd='******', softid='4545454', img=img)return result

验证码识别可能会出错,到时候再点击验证码图片换一张,然后重来即可。

最后总结一下:

如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:软件测试技术群:593462778,群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

作者:暗潮汹涌

原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。