验证码识别--封装版

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

这里是清安,前面我们说过了数字英文的验证码识别操作,本章我们对其进行完善一下,结合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文件中。此外,如果还有更好的方法,可以私信我,一起探讨。

目录
相关文章
|
3月前
|
JSON 文字识别 数据格式
文本,文字识别,Flask实现内部接口开发,OCR外部接口的开发,如何开发一个识别接口,通过post调用,参数是图片的路径,内部调用,直接传图片路径就行
文本,文字识别,Flask实现内部接口开发,OCR外部接口的开发,如何开发一个识别接口,通过post调用,参数是图片的路径,内部调用,直接传图片路径就行
|
5月前
|
Java 计算机视觉
java实现人脸识别源码【含测试效果图】——Servlet层(FaceServlet)
java实现人脸识别源码【含测试效果图】——Servlet层(FaceServlet)
|
5月前
|
Java 计算机视觉
java实现人脸识别源码【含测试效果图】——Dao层(IBaseDaoUtil)
java实现人脸识别源码【含测试效果图】——Dao层(IBaseDaoUtil)
|
数据采集 算法 开发者
如何使用Python爬虫处理多种类型的滑动验证码
如何使用Python爬虫处理多种类型的滑动验证码
|
5月前
|
人工智能 文字识别 Java
AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)
【2月更文挑战第1天】Lept4J和Tess4J都是基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本,本次介绍Tess4J
520 0
|
前端开发
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法1
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法1
55 0
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法1
|
前端开发
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法2
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法2
55 0
前端学习笔记202306学习笔记第三十八天-封装检测数据类型得方法2
|
机器学习/深度学习 人工智能 文字识别
从图片提取文字的终极解决方法 ——【通用文字识别 API】
通用文字识别技术,也称为OCR(Optical Character Recognition,光学字符识别),就是一种将图像或扫描件中的文字识别出来并转化为可编辑、可搜索的数字化文本的技术。
723 1
从图片提取文字的终极解决方法 ——【通用文字识别 API】
|
API
火山中文编程 -- 封装信息框API
火山中文编程 -- 封装信息框API
162 0
火山中文编程 -- 封装信息框API
驱动开发:内核特征码搜索函数封装
在前面的系列教程如`《驱动开发:内核枚举DpcTimer定时器》`或者`《驱动开发:内核枚举IoTimer定时器》`里面`LyShark`大量使用了`特征码定位`这一方法来寻找符合条件的`汇编指令`集,总体来说这种方式只能定位特征较小的指令如果特征值扩展到5位以上那么就需要写很多无用的代码,本章内容中将重点分析,并实现一个`通用`特征定位函数。
326 0
驱动开发:内核特征码搜索函数封装