selenium 自动化之四----图形验证码处理

2024-09-03 03:48

本文主要是介绍selenium 自动化之四----图形验证码处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前登录功能增加了验证码的各种形式,本文主要讲解图形验证码的处理方式
需要安装 pytesseract tesseract-ocr pilow 三方库
安装结束之后,修改pytesseract 这个源文件的tesseract_cmd = ‘/usr/local/Cellar/tesseract/4.0.0/bin/tesseract’
这个绝对路径就是你安装tesseract-ocr 这个执行文件

  • 在本案例中,我们谁到了几个知识点
    • 1 .保存截图信息 使用driver.save_screenshot
    • 2.同时对保存的图片进行截取保存 ,先确定图片的坐标(left top right,height)确认X及Y抽数据,及大小,这里涉及到了两个方法 元素的size 及location 属性
    • 3.然后针对截取的图片进行截取 使用设定对象的crop(left top right,height)进行保存,使用save方法保存即可
    • 4.针对保存的文件,使用了第三方的工具进行解析pytesseract.image_to_string(imgcode).strip()]
# -*- coding: utf-8 -*-
from selenium import webdriver
from time import sleep
import pytesseract
from PIL import ImageEnhance,Image
import re ,os
mobileEmulation = {'deviceName': 'iPhone X'} ##配置浏览器操作模式
options = webdriver.ChromeOptions()
options.add_experimental_option('mobileEmulation', mobileEmulation)
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://m.xxx.cn/regOrlogin')
screenImg="/Users/xxx/Desktop/111.png"
newscreenImg="/Users/xxx/Desktop/code111.png"
driver.find_element_by_class_name('l').click()
sleep(2)
driver.find_element_by_name('mobile').send_keys('185xxxxxxx')
driver.find_element_by_name('password').send_keys('password')
sleep(3)
driver.get_screenshot_as_file(screenImg) # 保存图片
region=Image.open(screenImg)
#打开保存的截图文件
region=(812, 739, 1200, 900)
img=Image.open(screenImg).crop(region).save(screenImg)
img=Image.open(screenImg)
imgcode=img.convert('L')
imgcode = ImageEnhance.Contrast(img)#增强对比度
imgcode.enhance(2.0)	#增加饱和度
imgcode=Image.open(screenImg).crop((0,0,300,200)).save(newscreenImg)
#上边操作imgcode 不能直接save操作,会报错没有该属性方法,所以又用最笨的方式重写了一下crop调用save方法,自动获取坐标代码老是报错,智能用这种人工坐标方式。
imgcode=Image.open(newscreenImg)
print(imgcode)
code = pytesseract.image_to_string(imgcode).strip()
print(code)
driver.find_element_by_name("imgCode").send_keys(code)##赋值验证码的数据,但是识别率实在是不好啊
sleep(10)
driver.find_element_by_class_name("btn_submit").click()driver.quit()

后面研究待完善
上边举例的坐标为手工操作,实际操作中很麻烦,下边解决该问题自动获取验证码的坐标焦点进行截取解析
在这里插入图片描述
说明 假如我们这个验证码分为 ABCD 四个坐标 按照图片的坐标定位如下
A=left = img_code.location[‘x’] #验证码图片的坐标截取
C=top = img_code.location[‘y’]
B=rigth= img_code.size[‘width’]+left
D=heigth=img_code.size[‘height’]+top

from selenium import webdriver
from time import sleep
import pytesseract
from PIL import ImageEnhance,Image
import re ,os
mobileEmulation = {'deviceName': 'iPhone X'}
options = webdriver.ChromeOptions()
options.add_experimental_option('mobileEmulation', mobileEmulation)
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://m.xxxx.cn/regOrlogin')
screenImg="/Users/xxxx/Desktop/111.png"
newscreenImg="/Users/jiahongming/Desktop/code111.png"driver.find_element_by_class_name('l').click()
driver.save_screenshot(screenImg) ##截取屏幕图片保存
sleep(5)
img_code =driver.find_element_by_name("verifyCodeImg") #先查找验证码元素
left = img_code.location['x'] #验证码图片的坐标截取
top = img_code.location['y']
rigth= img_code.size['width']+left
heigth=img_code.size['height']+top
print(left,top,rigth,heigth)
img = Image.open(screenImg)
imge= img.crop((left,top,rigth,heigth))
imge.save(newscreenImg)
code = pytesseract.image_to_string(imge).strip()
print(code)
driver.find_element_by_name("imgCode").send_keys(code)
driver.find_element_by_class_name("btn_submit").click()
driver.quit()

说明:实际环境中,可能出现定位的坐标与实际截取保存的图片坐标有偏差,导致程序无法进行下去
在selenium中location 成像为100%的方式进行定位,所以电脑的显示设置也需要一直,如果出现不一致就会先元素定位坐标偏差。我们也可以不用改电脑的显示设置,可以通过代码进行修改,就是将定位的坐标都乘以哪个显示比例即可,例如,我得电脑显示成像为200%的比例值显示,那么定位坐标代码如下

left = int(code_element.location['x'])*200/100 #验证码图片的坐标截取
top = int(code_element.location['y'])*200/100
rigth= int((code_element.size['width'])*200/100+left) ## 要确认是单独获取的值乘以成像显示比例 
heigth=int((code_element.size['height'])*200/100+top)

这篇关于selenium 自动化之四----图形验证码处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131939

相关文章

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

requests处理token鉴权接口和jsonpath使用方式

《requests处理token鉴权接口和jsonpath使用方式》文章介绍了如何使用requests库进行token鉴权接口的处理,包括登录提取token并保存,还详述了如何使用jsonpath表达... 目录requests处理token鉴权接口和jsonpath使用json数据提取工具总结reques

使用Python在PDF中绘制多种图形的操作示例

《使用Python在PDF中绘制多种图形的操作示例》在进行PDF自动化处理时,人们往往首先想到的是文本生成、图片嵌入或表格绘制等常规需求,然而在许多实际业务场景中,能够在PDF中灵活绘制图形同样至关重... 目录1. 环境准备2. 创建 PDF 文档与页面3. 在 PDF 中绘制不同类型的图形python

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理

浅析Python中如何处理Socket超时

《浅析Python中如何处理Socket超时》在网络编程中,Socket是实现网络通信的基础,本文将深入探讨Python中如何处理Socket超时,并提供完整的代码示例和最佳实践,希望对大家有所帮助... 目录开篇引言核心要点逐一深入讲解每个要点1. 设置Socket超时2. 处理超时异常3. 使用sele

C#借助Spire.XLS for .NET实现Excel工作表自动化样式设置

《C#借助Spire.XLSfor.NET实现Excel工作表自动化样式设置》作为C#开发者,我们经常需要处理Excel文件,本文将深入探讨如何利用C#代码,借助强大的Spire.XLSfor.N... 目录为什么需要自动化工作表样式使用 Spire.XLS for .NET 实现工作表整体样式设置样式配置