验证码识别--封装版

简介: 验证码识别--封装版

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

import os

import time



defcoding_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



deftime_():

   # %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是用的路径拼接的方式存放截图图片的。接下来就是正文了

classBrouse:


       def__init__(self):

           self.fox = webdriver.Firefox()


       defsave_image(self):

           """
           截图
           :return:
           """

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


       deflocation_(self, loc):

           """
           :param loc:
           :return:获取图片位置
           """

           location = loc.location

           return location


       deflocation_size(self, loc):

           """
           :param loc:
           :return:获取图片大小
           """

           location_size = loc.size

           return location_size

这里我写的是类,里面写了各种方法。因为是结合selenium来写的,所以,这里我需要初始化驱动。至于为什么是火狐,这里我没做多的判断,各位自行更改成喜欢的就好。里面我写了一个selenium截图的方法、获取图片位置的方法、以及获取图片大小的方法。并将后两者的值全部返回,至于为什么返回,后面用的到。一下往下看。

   defimage_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


       defcrop_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。我们需要得到截取后的验证码图片,所以,我们这里也需要返回一个值。接下来就是识别验证码了,上一篇讲过,但是这里的方法需要在后续才能展现用处,往下看。同样用的是二进制读取。并将读取的值进行返回。

   defeles_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()

           while1:

               if len(number) < 3:

                   number = self.crop_image()

                   return number

               break

           return number


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

   defFox_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基础,打开网址,定位元素,再加上调用方法传值,输入验证码,最后完成登录。这里只写了元素组的方法,全部代码可参考:https://gitee.com/qinganan/OCR.git,在pro_pic_orc文件中。此外,如果还有更好的方法,可以私信我,一起探讨。

目录
相关文章
|
Kubernetes Cloud Native Linux
云原生|kubernetes|kubernetes集群部署神器kubekey的初步使用(centos7下的kubekey使用)
云原生|kubernetes|kubernetes集群部署神器kubekey的初步使用(centos7下的kubekey使用)
558 1
|
Python 索引 容器
Python中类型错误(TypeError)
【6月更文挑战第1天】
451 5
|
存储 人工智能 缓存
AI 提示词模板相关的架构设计
现在很多企业纷纷研发大语言模型以解决业务问题。提示词在与模型交互中起到关键作用。为优化提示词模板的修改、提高渲染效率及确保安全性,架构设计注重可修改性、安全性、可靠性和性能。设计包括:将提示词存储在OSS以方便修改和版本控制;使用本地缓存提升读取性能;模板引擎增强灵活性;秘钥安全存储在加密系统中;并通过配置中心动态调整。此设计旨在提供高效、安全且可靠的AI交互体验等。
1017 78
AI 提示词模板相关的架构设计
|
存储 Linux iOS开发
Fiddler的安装和使用
Fiddler的安装和使用
584 0
|
人工智能 自然语言处理 测试技术
软件测试/人工智能|如何使用ChatGPT帮我们写自动化测试脚本
软件测试/人工智能|如何使用ChatGPT帮我们写自动化测试脚本
软件测试/人工智能|如何使用ChatGPT帮我们写自动化测试脚本
|
JSON Java 数据格式
http请求传参的几种类型
postman及java应用中对http请求传参的类型总结
401 0
|
关系型数据库 应用服务中间件 Go
|
测试技术 网络性能优化 Docker