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 Mysql自动备份脚本
Jul 14 Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
通过Python 接口使用OpenCV的方法
Apr 02 Python
python环形单链表的约瑟夫问题详解
Sep 27 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
Dec 13 Python
django框架模板语言使用方法详解
Jul 18 Python
Pytorch模型转onnx模型实例
Jan 15 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
python爬虫中url管理器去重操作实例
Nov 30 Python
python中的时区问题
Jan 14 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
其他功能
2006/10/09 PHP
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
php_xmlhttp 乱码问题解决方法
2009/08/07 PHP
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
Javascript的闭包
2009/12/31 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python实现自动上京东抢手机
2018/02/06 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python3.x上post发送json数据
2018/03/04 Python
对Python 数组的切片操作详解
2018/07/02 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
为什么需要版本控制?
2013/08/08 面试题
无工作经验者个人求职信范文
2013/12/22 职场文书
化妆品促销活动总结
2015/05/07 职场文书
2016年元旦主持词
2015/07/06 职场文书