关于图像验证码问题,解释方案

目录

前言

一、使用cv2解析验证码识别方式

二、浏览器复用(Debug模式启动浏览器)

三、直接绕过登录

前言

使用到的第三方库

请自行pip install 库名

import pytesseract  # pip install pytesseract
from PIL import Image
import cv2 as cv  # pip install opencv_python
import faker
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import os
import time
from selenium import webdriver

一、使用cv2解析验证码识别方式

如果你的图像是base64位数据流请移步,其中有相应的函数方法解析,在这里就过多聊了直接上源码

关于base64位滑块图片与UI自动化滑块解决方法_阿飞797的博客-CSDN博客

def register_verification_code():
    driver = webdriver.Chrome()  # 实例化浏览器对象
    driver.maximize_window()
    wait = WebDriverWait(driver, 5)  # 实例化等待对象
    register_url = "URL" # 项目URL
    driver.get(register_url)  # 在新的窗口打开url
    # 随机生成手机号码
    phone_number = faker.Faker(locale="zh_CN").phone_number()
    # 通过手机号码获取6位数据
    password = phone_number[0:6]
    # 显性等待手机号码输入框元素并进行输入内容
    locator = ("id", "txtUName")
    wait.until(ec.visibility_of_element_located(locator)).send_keys(phone_number)
    # 显性等待密码输入框元素并进行输入内容
    locator = ("id", "txtPassword")
    wait.until(ec.visibility_of_element_located(locator)).send_keys(password)
    # 定位验证码元素,并进行验证码图像存储
    file_name = "imgVerify.png"
    driver.find_element(value="chkd").screenshot(file_name)
    # 对存储的验证码进行均值迁移去噪声,然后二值化处理,最终覆盖源文件,进行存储
    image = cv.imread(file_name)
    blurred = cv.pyrMeanShiftFiltering(image, 10, 100)
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
    t, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imwrite(file_name, binary)
    # 使用 PIL 打开图像转化为图像对象,并使用 pytesseract 进行图像识别验证码
    image = Image.open(file_name)
    img_str = pytesseract.image_to_string(image)
    # 输入识别的验证码
    driver.find_element(value="TxtChkCode").send_keys(img_str)
    # 显性等待注册按钮元素并进行点击
    locator = ("id", "btnRegister")
    wait.until(ec.visibility_of_element_located(locator)).click()
    # 显性等待url地址发生了变化
    wait.until(ec.url_changes(register_url))


if __name__ == '__main__':
    register_verification_code()

使用cv2中的图像识别解析出图像中的数字或字母,该方式有相应的限制就是背景图比较杂乱的话识别出来的字符串可能不是图片上的所以可以做注册成功或者登录成功的判断循环注册或者登录成功的标准性元素

PS:如果是爬虫的请设置浏览器头部信息躲避检测

二、浏览器复用(Debug模式启动浏览器)

Selenium启动浏览器默认是会清除所有缓存的,所以系统如果有需要登陆验证的,每

次全部都要验证一遍。

我们可以让Selenium直接用带有缓存的浏览器,就像我们使用本机浏览器一样,去访

问系统。常规系统,比如淘宝、携程,只要完成一次登陆验证,后续登陆是不会再有验证码

的。通过Debug模式启动谷歌浏览器,就能达到这个效果。

并且Debug模式的浏览器,还可以在自动化过程中实现复用浏览器来提高调试效率:

1.当运行 selenium 自动化时,要求已经登录才能才做。这个时候我们可以提前登录,

运行脚本的时候复用已经打开的浏览器。

2.当调试了某个步骤很多的测试用例,前面N-1步已经成功,只需调试第N步。如果从

头开始运行脚本,耗时过多,这时我们可以直接复用浏览器只操作第N步。

复用浏览器的特点:

webdriver启动时将不再创建新的浏览器窗口 将运用已打开的浏览器的当前页面,对元

素的进行操作 。

废话不多说直接上源码

# 加载浏览器其中
os.popen("快捷方式路径")
time.sleep(5)
options = webdriver.ChromeOptions()
options.debugger_address = "127.0.0.1:12138"
driver = webdriver.Chrome(options=options)


# 这里需要先运行启动浏览器,在频闭以上代码后再运行get之后的操作
driver.get("url") #即可

该方法需要配置浏览器的快捷方式至PC的系统变量中去

PS(找到goole的快捷打开方式地址:一般都在C盘的Program Files (x86)中,看个人的下载地址,没有改下载地址的应该是:C:\Program Files (x86)\Google\Chrome\Application)

把该至添加至PC的系统变量中,再新建一个txt文本把  chrome.exe --remote-debugging-port=12138 该命令行复制进去把文件后缀改成.bat可执行文件,如

在CMD看看chrome是否可以运行打开浏览器

源码中的浏览器器路径就是该可执行文件的路径

三、直接绕过登录

PS:该方法也是最不想说的方式

直接通过访问登录时候的URL去进行之后的操作,该方式限制就是需要把登录后访问的URL请求需要传的值以及是头和各项参数,详细的请问项目前端,就是通过直接drv.get(登录后的浏览器URL)。在前方设置drv访问这个URL需要传参,以及限制即可(本人项目中没有好的例子就不放源码了,敲也不想敲嫌弃)

任性!!!哼😕

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值