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

相关文章

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约