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

相关文章

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Python实现自动化表单填写功能

《Python实现自动化表单填写功能》在Python中,自动化表单填写可以通过多种库和工具实现,本文将详细介绍常用的自动化表单处理工具,并对它们进行横向比较,可根据需求选择合适的工具,感兴趣的小伙伴跟... 目录1. Selenium简介适用场景示例代码优点缺点2. Playwright简介适用场景示例代码

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir