python 识别登录验证码图片功能的实现代码(完整代码)


Posted in Python onJuly 03, 2020

在编写自动化测试用例的时候,每次登录都需要输入验证码,后来想把让python自己识别图片里的验证码,不需要自己手动登陆,所以查了一下识别功能怎么实现,做一下笔记。

首选导入一些用到的库,re、Image、pytesseract、selenium、time

import re # 用于正则
from PIL import Image # 用于打开图片和对图片处理
import pytesseract # 用于图片转文字
from selenium import webdriver # 用于打开网站
import time # 代码运行停顿

首先需要获取验证码图片,才能进一步识别。

创建类,定义webdriver和find_element_by_selector方法,用来打开网页和定位验证码图片的元素

class VerificationCode:
  def __init__(self):
    self.driver = webdriver.Firefox()
    self.find_element = self.driver.find_element_by_css_selector

然后打开浏览器截取验证码图片

def get_pictures(self):
    self.driver.get('http://123.255.123.3') # 打开登陆页面
    self.driver.save_screenshot('pictures.png') # 全屏截图
    page_snap_obj = Image.open('pictures.png')
    img = self.find_element('#pic') # 验证码元素位置
    time.sleep(1)
    location = img.location
    size = img.size # 获取验证码的大小参数
    left = location['x']
    top = location['y']
    right = left + size['width']
    bottom = top + size['height']
    image_obj = page_snap_obj.crop((left, top, right, bottom)) # 按照验证码的长宽,切割验证码
    image_obj.show() # 打开切割后的完整验证码
    self.driver.close() # 处理完验证码后关闭浏览器
    return image_obj

未处理前的验证码图片如下:

python 识别登录验证码图片功能的实现代码(完整代码)

未处理的验证码图片,对于python来说识别率较低,仔细看可以发现图片里有很对五颜六色扰乱识别的点,非常影响识别率。

下面对获取的验证码进行处理。

首先用convert把图片转成黑白色。设置threshold阈值,超过阈值的为黑色

def processing_image(self):
    image_obj = self.get_pictures() # 获取验证码
    img = image_obj.convert("L") # 转灰度
    pixdata = img.load()
    w, h = img.size
    threshold = 160 # 该阈值不适合所有验证码,具体阈值请根据验证码情况设置
    # 遍历所有像素,大于阈值的为黑色
    for y in range(h):
      for x in range(w):
        if pixdata[x, y] < threshold:
          pixdata[x, y] = 0
        else:
          pixdata[x, y] = 255
    return img

经过灰度处理后的图片

python 识别登录验证码图片功能的实现代码(完整代码)

然后删除一些扰乱识别的像素点。

def delete_spot(self):
    images = self.processing_image()
    data = images.getdata()
    w, h = images.size
    black_point = 0
    for x in range(1, w - 1):
      for y in range(1, h - 1):
        mid_pixel = data[w * y + x] # 中央像素点像素值
        if mid_pixel < 50: # 找出上下左右四个方向像素点像素值
          top_pixel = data[w * (y - 1) + x]
          left_pixel = data[w * y + (x - 1)]
          down_pixel = data[w * (y + 1) + x]
          right_pixel = data[w * y + (x + 1)]
          # 判断上下左右的黑色像素点总个数
          if top_pixel < 10:
            black_point += 1
          if left_pixel < 10:
            black_point += 1
          if down_pixel < 10:
            black_point += 1
          if right_pixel < 10:
            black_point += 1
          if black_point < 1:
            images.putpixel((x, y), 255)
          black_point = 0
    # images.show()
    return images

经过去除噪点处理后的图片

python 识别登录验证码图片功能的实现代码(完整代码)

最后把处理后的图片转成文字。

先设置pytesseract的路径,因为默认路径是错的,然后转换图片为文字,由于个别图片中识别会出现处理遗漏,会被识别成空格或则点或则分号什么的,所以增加了一个去除验证码中特殊字符的处理。

PS:tesseract文件下载链接

def image_str(self):
    image = self.delete_spot()
    pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # 设置pyteseract路径
    result = pytesseract.image_to_string(image) # 图片转文字
    resultj = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", result) # 去除识别出来的特殊字符
    result_four = resultj[0:4] # 只获取前4个字符
    # print(resultj) # 打印识别的验证码
    return result_four

完整代码如下:

import re # 用于正则
from PIL import Image # 用于打开图片和对图片处理
import pytesseract # 用于图片转文字
from selenium import webdriver # 用于打开网站
import time # 代码运行停顿
 
 
class VerificationCode:
  def __init__(self):
    self.driver = webdriver.Firefox()
    self.find_element = self.driver.find_element_by_css_selector
 
  def get_pictures(self):
    self.driver.get('http://123.255.123.3') # 打开登陆页面
    self.driver.save_screenshot('pictures.png') # 全屏截图
    page_snap_obj = Image.open('pictures.png')
    img = self.find_element('#pic') # 验证码元素位置
    time.sleep(1)
    location = img.location
    size = img.size # 获取验证码的大小参数
    left = location['x']
    top = location['y']
    right = left + size['width']
    bottom = top + size['height']
    image_obj = page_snap_obj.crop((left, top, right, bottom)) # 按照验证码的长宽,切割验证码
    image_obj.show() # 打开切割后的完整验证码
    self.driver.close() # 处理完验证码后关闭浏览器
    return image_obj
 
  def processing_image(self):
    image_obj = self.get_pictures() # 获取验证码
    img = image_obj.convert("L") # 转灰度
    pixdata = img.load()
    w, h = img.size
    threshold = 160
    # 遍历所有像素,大于阈值的为黑色
    for y in range(h):
      for x in range(w):
        if pixdata[x, y] < threshold:
          pixdata[x, y] = 0
        else:
          pixdata[x, y] = 255
    return img
 
  def delete_spot(self):
    images = self.processing_image()
    data = images.getdata()
    w, h = images.size
    black_point = 0
    for x in range(1, w - 1):
      for y in range(1, h - 1):
        mid_pixel = data[w * y + x] # 中央像素点像素值
        if mid_pixel < 50: # 找出上下左右四个方向像素点像素值
          top_pixel = data[w * (y - 1) + x]
          left_pixel = data[w * y + (x - 1)]
          down_pixel = data[w * (y + 1) + x]
          right_pixel = data[w * y + (x + 1)]
          # 判断上下左右的黑色像素点总个数
          if top_pixel < 10:
            black_point += 1
          if left_pixel < 10:
            black_point += 1
          if down_pixel < 10:
            black_point += 1
          if right_pixel < 10:
            black_point += 1
          if black_point < 1:
            images.putpixel((x, y), 255)
          black_point = 0
    # images.show()
    return images
 
  def image_str(self):
    image = self.delete_spot()
    pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # 设置pyteseract路径
    result = pytesseract.image_to_string(image) # 图片转文字
    resultj = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", result) # 去除识别出来的特殊字符
    result_four = resultj[0:4] # 只获取前4个字符
    # print(resultj) # 打印识别的验证码
    return result_four
 
if __name__ == '__main__':
  a = VerificationCode()
  a.image_str()

看评论有很多人需要tesseract.exe文件,但是由于文件过大,发邮件会出现无法下载的情况,有需要的可以在一下连接里下载tesseract.exe文件

到此这篇关于python 识别登录验证码图片(完整代码)的文章就介绍到这了,更多相关python识别登录验证码图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
Python统计列表中的重复项出现的次数的方法
Aug 18 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
Python部署web开发程序的几种方法
May 05 Python
Python实现的递归神经网络简单示例
Aug 11 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 Python
Django多数据库的实现过程详解
Aug 01 Python
新手入门学习python Numpy基础操作
Mar 02 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 #Python
keras topN显示,自编写代码案例
Jul 03 #Python
python如何使用代码运行助手
Jul 03 #Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 #Python
python3 简单实现组合设计模式
Jul 02 #Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 #Python
django 装饰器 检测登录状态操作
Jul 02 #Python
You might like
php 把数字转换成汉字的代码
2015/07/21 PHP
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
详谈Node.js之操作文件系统
2017/08/29 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
Python中文编码那些事
2014/06/25 Python
Python中实现对list做减法操作介绍
2015/01/09 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
python 深度学习中的4种激活函数
2020/09/18 Python
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
业务员的岗位职责
2014/03/15 职场文书
导师推荐信范文
2014/05/09 职场文书
文秘自荐信
2014/06/28 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
怒海潜将观后感
2015/06/11 职场文书
驻村工作简报
2015/07/20 职场文书
KTV员工管理制度
2015/08/06 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python
Redis如何使用乐观锁(CAS)保证数据一致性
2022/03/25 Redis
MySQL创建管理子分区
2022/04/13 MySQL