当前位置: 首页 > news >正文

验证码识别--封装版

前面我们说过了数字英文的验证码识别操作,本章我们对其进行完善一下,结合selenium来实际操作操作。

import os

import time

def coding_path(path):

Base_Path = os.path.abspath(os.path.dirname(os.path.abspath(__file__)) + '/..')

Base_image = os.path.join(Base_Path + r'\PIC', path)

return Base_image

def time_():

# %Y_%m_%d_%H_%M_%S

file_name = time.strftime("%Y_%m_%d_%H_%M") + ".png"

return file_name

首先先来写一个时间戳,你没看错,我想用时间戳来保存截图。至于coding_path就是一个相对路径,读取文件位置的一个函数。里面Base_Path是获取相对路径,Base_image是用的路径拼接的方式存放截图图片的。

接下来就是正文了

class Brouse:

def __init__(self):

self.fox = webdriver.Firefox()

def save_image(self):

"""

截图

:return:

"""

self.fox.save_screenshot(coding_path(time_()))

def location_(self, loc):

"""

:param loc:

:return:获取图片位置

"""

location = loc.location

return location

def location_size(self, loc):

"""

:param loc:

:return:获取图片大小

"""

location_size = loc.size

return location_size

这里我写的是类,里面写了各种方法。因为是结合selenium来写的,所以,这里我需要初始化驱动。至于为什么是火狐,这里我没做多的判断,各位自行更改成喜欢的就好。

里面我写了一个selenium截图的方法、获取图片位置的方法、以及获取图片大小的方法。并将后两者的值全部返回,至于为什么返回,后面用的到。一下往下看。

def image_size(self, image):

"""截图验证码大小,根据实际修改"""

rangle = (int(self.location_(image)['x'] - 5), int(self.location_(image)['y'] - 5),

int(self.location_(image)['x'] + self.location_size(image)['width'] + 11),

int(self.location_(image)['y'] + self.location_size(image)['height'] + 7))

return rangle

def crop_image(self):

"""

:return: 识别截图验证码

"""

ocr = DdddOcr()

file_image = open(coding_path(time_()), 'rb')

result = ocr.classification(file_image.read())

return result

同样的,这两个方法我是写在了类中的,只是分开来写了。截取验证码这一块,根据不同的电脑尺寸来,以及现实所设置布局。所以这里需要自己做一部分调整。另外,此处也可以采用*一定的比例来进行截取,例如self.location_(image)['x'] * 1.25。

我们需要得到截取后的验证码图片,所以,我们这里也需要返回一个值。

接下来就是识别验证码了,上一篇讲过,但是这里的方法需要在后续才能展现用处,往下看。同样用的是二进制读取。并将读取的值进行返回。

def eles_crop_image(self, ele, num):

"""

元素组截图定位

:param ele:

:param num:

:return:

"""

pic = self.fox.find_elements_by_xpath(ele)[num]

sleep(1)

# 保存截图,调用时间戳

self.save_image()

# 获取位置

self.location_(pic)

# 获取大小

self.location_size(pic)

# 确定所需要的图片大小

self.image_size(pic)

# 打开之前截图图片

image = Image.open(coding_path(time_()))

# 开始裁剪

image1 = image.crop(self.image_size(pic))

# 保存裁剪后的截图

image1.save(coding_path(time_()))

# 图片内容

number = self.crop_image()

while 1:

if len(number) < 3:

number = self.crop_image()

return number

break

return number

这里我们就是用到了上述的识别验证码了。但是在这之前,需要怼图片进行一些处理,也就是上面写到了的裁剪,裁剪出属于验证码的那一部分。上述的注释写了哦,需要一步步来最后得到完整的验证码图片,并对它进行识别,返回识别的值。

def Fox_test(self):

self.fox.get('https://d2.shopxo.vip/admin.php?s=admin/logininfo.html')

self.fox.find_element_by_xpath("//input[@name='accounts']").send_keys('admin')

self.fox.find_element_by_xpath("//input[@name='pwd']").send_keys('shopxo')

self.fox.find_element_by_xpath("//input[@name='verify']").send_keys(

self.eles_crop_image("//span[@class='am-input-group-btn']", 1))

self.fox.find_element_by_xpath("//*[text()='登录']").click()

self.fox.close()

if __name__ == '__main__':

Brouse().Fox_test()

此处就不用多说了吧,selenium基础,打开网址,定位元素,再加上调用方法传值,输入验证码,最后完成登录。

此外,如果还有更好的方法,可以私信我,一起探讨。

http://www.lryc.cn/news/7948.html

相关文章:

  • 创建Wails项目
  • 深度解析UG二次开发装配的部件事件、部件原型和部件实例
  • Linux安装elasticsearch-head
  • MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)
  • Leetcode-每日一题1250. 检查「好数组」(裴蜀定理)
  • OpenStack手动分布式部署环境准备【Queens版】
  • Web自动化测试——selenium的使用
  • 虚拟交换单元技术
  • 【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时
  • [Springboot 单元测试笔记] - Mock 和 spy的使用
  • 互联网新时代要来了(二)什么是AIGC?
  • 75V的TVS二极管有哪些型号?常用的
  • 测试开发之Django实战示例 第十章 创建在线教育平台
  • Hadoop高可用搭建(二)
  • 如何用企微SCRM管理系统发掘老客户的新增长点?
  • 我用python疯狂爬取公司数据
  • EMR集群运行TPC-DS在云盘和OSS中的对比
  • 菜鸟在 windows 下 python 中安装 jupyter 踩坑要点 、被神化的 VsCode
  • k8s简单搭建
  • 计算机SCI期刊审稿人,一般关注论文的那些问题? - 易智编译EaseEditing
  • Docker迁移以及环境变量问题
  • Sphinx文档生成工具(二)
  • Python快速上手系列--JSON--入门篇
  • axios中的GET POST PUT PATCH,发送请求时params和data的区别
  • hume项目k8s的改造
  • MACD红二波选股公式,选出MACD二次翻红的标的
  • mac上安装mysql
  • Django 模型继承问题
  • Vue3篇.01-简介及基本使用,项目创建方式, 模板语法, 事件监听, 修饰符
  • 别学英语了,真的