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 Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka