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服务器端收发请求的实现代码
Sep 29 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
用python写的一个wordpress的采集程序
Feb 27 Python
python各种语言间时间的转化实现代码
Mar 23 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
python射线法判断一个点在图形区域内外
Jun 28 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
Python logging模块handlers用法详解
Aug 14 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
python中sys模块的介绍与实例
Apr 17 Python
Python Django获取URL中的数据详解
Nov 01 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 身份验证方面的函数
2009/10/11 PHP
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php知道与问问的采集插件代码
2010/10/12 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
2017/03/09 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
微信小程序实现人脸识别
2018/05/25 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
浅谈python之新式类
2018/08/12 Python
Python docx库用法示例分析
2019/02/16 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
Numpy中的数组搜索中np.where方法详细介绍
2021/01/08 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
信息系统专业个人求职信范文
2013/12/07 职场文书
小学体育教学反思
2014/01/31 职场文书
模具专业求职信
2014/06/26 职场文书
总经理检讨书范文
2015/02/16 职场文书
聘任书范文大全
2015/09/21 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python