关于图像验证码问题,解决方案
目录前言一、使用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(localezh_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(valuechkd).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(valueTxtChkCode).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(optionsoptions) # 这里需要先运行启动浏览器在频闭以上代码后再运行get之后的操作 driver.get(url) #即可该方法需要配置浏览器的快捷方式至PC的系统变量中去PS找到goole的快捷打开方式地址一般都在C盘的Program Files (x86)中看个人的下载地址没有改下载地址的应该是C:\Program Files (x86)\Google\Chrome\Application把该至添加至PC的系统变量中再新建一个txt文本把 chrome.exe --remote-debugging-port12138 该命令行复制进去把文件后缀改成.bat可执行文件如在CMD看看chrome是否可以运行打开浏览器源码中的浏览器器路径就是该可执行文件的路径三、直接绕过登录PS该方法也是最不想说的方式直接通过访问登录时候的URL去进行之后的操作该方式限制就是需要把登录后访问的URL请求需要传的值以及是头和各项参数详细的请问项目前端就是通过直接drv.get登录后的浏览器URL。在前方设置drv访问这个URL需要传参以及限制即可(本人项目中没有好的例子就不放源码了敲也不想敲嫌弃)任性哼