返回顶部
首页 > 资讯 > 后端开发 > Python >Python+Selenium+Pytesseract怎么实现图片验证码识别
  • 549
分享到

Python+Selenium+Pytesseract怎么实现图片验证码识别

2023-06-26 04:06:37 549人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家介绍python+selenium+Pytesseract怎么实现图片验证码识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、selenium截取验证码import JSONfrom&nbs

这篇文章给大家介绍python+selenium+Pytesseract怎么实现图片验证码识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。


一、selenium截取验证码

import JSONfrom io import BytesIOimport timefrom test.testBefore.testDriver import driverfrom test.util.test_pytesseract import recognizefrom PIL import Imageimport allureimport unittest ''' /处理验证码 ''' # 要截图的元素 element = driver.find_element_by_xpath('//*[@id="imgVerifyCode"]') # 坐标 x, y = element.location.values() # 宽高 h, w = element.size.values() # 把截图以二进制形式的数据返回 image_data = driver.get_screenshot_as_png() # 以新图片打开返回的数据 screenshot = Image.open(BytesIO(image_data)) # 对截图进行裁剪 result = screenshot.crop((x, y, x + w, y + h)) # 显示图片 # result.show() # 保存验证码图片 result.save('VerifyCode.png') # 调用recognize方法识别验证码 code = recognize('VerifyCode.png') # 输入验证码 driver.find_element_by_xpath('//*[@id="txtcode"]').send_keys(code) ''' 处理验证码/ '''

注意:driver是引用我自己写的文件,可以自己随便写一个。识别图片的代码单独放在util文件夹下面的,参考标题三的代码,需要时引用。以上代码定位元素都需要根据自己的项目定位元素修改。

二、安装识别环境pytesseract+Tesseract-OCR

如果没有输出,又不确定你的pytesseract环境是否安装好,可以用一张没有干扰的图片识别看看能不能有输出结果,以下样例在我的环境中可以直接输出识别结果8fnp

验证识别环境是否正常

直接使用pytesseract识别图片

001.png

Python+Selenium+Pytesseract怎么实现图片验证码识别

text = pytesseract.image_to_string('./001.png')print(text)

三、处理验证码图片

直接截图的验证码图片存在噪点或者干扰线等,直接使用pytesseract识别可能会没有输出结果,如果环境正常,但没有输出结果,那多半是因为图片没有处理好,识别不出来,可以多尝试一些处理图片的方式,以下代码处理我截图这种类似的图片效果比较好。

图片处理识别

对图片处理的过程:

图片处理过程中可以多用im.show()看看每一步处理后的图片是不是符合预期,如果效果不好调一下参数。另外在学习过程中发现有童鞋说识别不出来把图片使用cv2.resize()这个方法放大就能识别,可以参考Python中图像的缩放 resize()函数的应用

实际截取的图片

Python+Selenium+Pytesseract怎么实现图片验证码识别

处理后的图片

Python+Selenium+Pytesseract怎么实现图片验证码识别

test_pytesseract.py

import pytesseractfrom fnmatch import fnmatchimport cv2import osdef clear_border(img, img_name):    '''    去除边框    '''    h, w = img.shape[:2]    for y in range(0, w):        for x in range(0, h):            # if y ==0 or y == w -1 or y == w - 2:            if y < 2 or y > w - 2:                img[x, y] = 255            # if x == 0 or x == h - 1 or x == h - 2:            if x < 1 or x > h - 1:                img[x, y] = 255    return imgdef interference_line(img, img_name):    '''    干扰线降噪    '''    h, w = img.shape[:2]    # !!!OpenCV矩阵点是反的    # img[1,2] 1:图片的高度,2:图片的宽度    for r in range(0, 2):        for y in range(1, w - 1):            for x in range(1, h - 1):                count = 0                if img[x, y - 1] > 245:                    count = count + 1                if img[x, y + 1] > 245:                    count = count + 1                if img[x - 1, y] > 245:                    count = count + 1                if img[x + 1, y] > 245:                    count = count + 1                if count > 2:                    img[x, y] = 255    return imgdef interference_point(img, img_name, x=0, y=0):    """点降噪    9邻域框,以当前点为中心的田字框,黑点个数    :param x:    :param y:    :return:    """    # todo 判断图片的长宽度下限    cur_pixel = img[x, y]  # 当前像素点的值    height, width = img.shape[:2]    for y in range(0, width - 1):        for x in range(0, height - 1):            if y == 0:  # 第一行                if x == 0:  # 左上顶点,4邻域                    # 中心点旁边3个点                    sum = int(cur_pixel) \                          + int(img[x, y + 1]) \                          + int(img[x + 1, y]) \                          + int(img[x + 1, y + 1])                    if sum <= 2 * 245:                        img[x, y] = 0                elif x == height - 1:  # 右上顶点                    sum = int(cur_pixel) \                          + int(img[x, y + 1]) \                          + int(img[x - 1, y]) \                          + int(img[x - 1, y + 1])                    if sum <= 2 * 245:                        img[x, y] = 0                else:  # 最上非顶点,6邻域                    sum = int(img[x - 1, y]) \                          + int(img[x - 1, y + 1]) \                          + int(cur_pixel) \                          + int(img[x, y + 1]) \                          + int(img[x + 1, y]) \                          + int(img[x + 1, y + 1])                    if sum <= 3 * 245:                        img[x, y] = 0            elif y == width - 1:  # 最下面一行                if x == 0:  # 左下顶点                    # 中心点旁边3个点                    sum = int(cur_pixel) \                          + int(img[x + 1, y]) \                          + int(img[x + 1, y - 1]) \                          + int(img[x, y - 1])                    if sum <= 2 * 245:                        img[x, y] = 0                elif x == height - 1:  # 右下顶点                    sum = int(cur_pixel) \                          + int(img[x, y - 1]) \                          + int(img[x - 1, y]) \                          + int(img[x - 1, y - 1])                    if sum <= 2 * 245:                        img[x, y] = 0                else:  # 最下非顶点,6邻域                    sum = int(cur_pixel) \                          + int(img[x - 1, y]) \                          + int(img[x + 1, y]) \                          + int(img[x, y - 1]) \                          + int(img[x - 1, y - 1]) \                          + int(img[x + 1, y - 1])                    if sum <= 3 * 245:                        img[x, y] = 0            else:  # y不在边界                if x == 0:  # 左边非顶点                    sum = int(img[x, y - 1]) \                          + int(cur_pixel) \                          + int(img[x, y + 1]) \                          + int(img[x + 1, y - 1]) \                          + int(img[x + 1, y]) \                          + int(img[x + 1, y + 1])                    if sum <= 3 * 245:                        img[x, y] = 0                elif x == height - 1:  # 右边非顶点                    sum = int(img[x, y - 1]) \                          + int(cur_pixel) \                          + int(img[x, y + 1]) \                          + int(img[x - 1, y - 1]) \                          + int(img[x - 1, y]) \                          + int(img[x - 1, y + 1])                    if sum <= 3 * 245:                        img[x, y] = 0                else:  # 具备9领域条件的                    sum = int(img[x - 1, y - 1]) \                          + int(img[x - 1, y]) \                          + int(img[x - 1, y + 1]) \                          + int(img[x, y - 1]) \                          + int(cur_pixel) \                          + int(img[x, y + 1]) \                          + int(img[x + 1, y - 1]) \                          + int(img[x + 1, y]) \                          + int(img[x + 1, y + 1])                    if sum <= 4 * 245:                        img[x, y] = 0    return imgdef _get_dynamic_binary_image(filedir, img_name):    '''    自适应阀值二值化    '''    filename = './' + img_name.split('.')[0] + '-binary.png'    img_name = filedir + '/' + filename    im = cv2.imread(img_name)    im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)    th2 = cv2.adaptiveThreshold(im, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 1)    return th2def recognize(image):    filedir = './'  # 验证码路径    for file in os.listdir(filedir):        if fnmatch(file, image):            img_name = file            # 自适应阈值二值化            im = _get_dynamic_binary_image(filedir, img_name)            # # 去除边框            im = clear_border(im, img_name)            # 对图片进行干扰线降噪            im = interference_line(im, img_name)            # 对图片进行点降噪            im = interference_point(im, img_name)            filename = './' + img_name.split('.')[0] + '-interferencePoint.png'  # easy_code为保存路径            cv2.imwrite(filename, im)  # 保存图片            text = pytesseract.image_to_string(im, lang="eng",                                               config='--psm 6 digits')  # config=digits只识别数字    return text    '''    --psm 参数含义    0:定向脚本监测(OSD)    1: 使用OSD自动分页    2 :自动分页,但是不使用OSD或OCR(Optical Character Recognition,光学字符识别)    3 :全自动分页,但是没有使用OSD(默认)    4 :假设可变大小的一个文本列。    5 :假设垂直对齐文本的单个统一块。    6 :假设一个统一的文本块。    7 :将图像视为单个文本行。    8 :将图像视为单个词。    9 :将图像视为圆中的单个词。    10 :将图像视为单个字符。    '''

关于Python+Selenium+Pytesseract怎么实现图片验证码识别就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Python+Selenium+Pytesseract怎么实现图片验证码识别

本文链接: https://lsjlt.com/news/306683.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python+Selenium+Pytesseract实现图片验证码识别
    目录一、selenium截取验证码二、安装识别环境pytesseract+Tesseract-OCR验证识别环境是否正常三、处理验证码图片图片处理识别一、selenium截取验证码 ...
    99+
    2024-04-02
  • Python+Selenium+Pytesseract怎么实现图片验证码识别
    这篇文章给大家介绍Python+Selenium+Pytesseract怎么实现图片验证码识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、selenium截取验证码import jsonfrom&nbs...
    99+
    2023-06-26
  • Python+Pillow+Pytesseract怎么实现验证码识别
    这篇“Python+Pillow+Pytesseract怎么实现验证码识别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Py...
    99+
    2023-06-30
  • Python+Pillow+Pytesseract实现验证码识别
    目录一、环境配置二、验证码识别实例1实例2实例3昨天十行代码实现文字识别,感觉怎样,是不是很爽 今天咋们继续利用pillow和pytesseract来实现验证码的识别 一、环境配置 ...
    99+
    2024-04-02
  • Selenium&Pytesseract模拟登录+验证码识别
    验证码是爬虫需要解决的问题,因为很多网站的数据是需要登录成功后才可以获取的.验证码识别,即图片识别,很多人都有误区,觉得这是爬虫方面的知识,其实是不对的.验证码识别涉及到的知识:人工智能,模式识别,机器视觉,图像处理.主要流程:1 图像采集...
    99+
    2023-01-30
    验证码 Selenium Pytesseract
  • Python怎么实现图形验证码识别
    这篇文章主要介绍了Python怎么实现图形验证码识别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么实现图形验证码识别文章都会有所收获,下面我们一起来看看吧。环境使用python 3.9pycha...
    99+
    2023-07-05
  • Python系列之图片验证码识别
    Python系列之图片验证码识别 引言 图片验证码已经成为现代网络应用中常见的一种身份验证形式。本文将介绍如何使用 Python 进行图片验证码的识别。我们将使用基于机器学习的方法,通过训练模型来自动...
    99+
    2023-09-07
    python 开发语言
  • python下调用pytesseract识别某网站验证码的实现方法
    一、pytesseract介绍 1、pytesseract说明 pytesseract最新版本0.1.6,网址:https://pypi.python.org/pypi/pytesseract Python...
    99+
    2022-06-04
    验证码 方法 网站
  • 非常简单的Python识别图片验证码实现过程
    很久之前,分享过一次Python代码实现验证码识别的办法。 当时采用的是pillow+pytesseract,优点是免费,较为易用。但其识别精度一般,若想要更高要求的验证码识别,初学...
    99+
    2024-04-02
  • Python实现图片滑动式验证识别方法
    1 abstract 验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现。目前最常见的一种形式就是...
    99+
    2022-06-04
    方法 图片 滑动式
  • Python通过pytesseract库实现识别图片中的文字
    目录前言一、pytesseract1.pytesseract是什么2.安装pytesseract3.查看pytesseract版本4.安装PIL5.查看PIL版本二、Tesserac...
    99+
    2023-05-19
    Python pytesseract识别图片中文字 Python pytesseract识别文字 Python pytesseract
  • 如何使用Python实现极验验证码识别验证码
    这篇“如何使用Python实现极验验证码识别验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Python实现极验...
    99+
    2023-07-05
  • php怎么实现图片验证码
    本文操作环境:Windows7系统、PHP7.1版,DELL G3电脑。php怎么实现图片验证码?PHP实现图片验证码功能验证码: captcha, 是一种用于区别人和电脑的技术原理(Completely Automated Public ...
    99+
    2017-09-20
    php
  • Python+selenium怎么破解拼图验证码
    这篇文章主要介绍“Python+selenium怎么破解拼图验证码”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python+selenium怎么破解拼图验证码”文章能帮助大家解决问题。实现思路很多...
    99+
    2023-06-29
  • python 识别图片验证码/滑块验证码准确率极高的 ddddocr 库
    前言 验证码的种类有很多,它是常用的一种反爬手段,包括:图片验证码,滑块验证码,等一些常见的验证码场景。 识别验证码的python 库有很多,用起来也并不简单,这里推荐一个简单实用的识别验证码的库 d...
    99+
    2023-09-05
    python 开发语言 numpy
  • Python中怎么使用ddddocr库识别图片与滑块验证码
    这篇“Python中怎么使用ddddocr库识别图片与滑块验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中...
    99+
    2023-07-05
  • java实现图片验证码
    本文实例为大家分享了java实现图片验证码的具体代码,供大家参考,具体内容如下 目的: 1) 验证操作者是否是人 2) 防止表单重复提交 生成验证码的要点: 1) 使用java代码生...
    99+
    2024-04-02
  • python实现腾讯滑块验证码识别
    腾讯滑块验证码识别,识别凹槽的x轴位置,mock滑块的加速度。该项目公开API,提供识别和加速度模拟部分,第二部分模拟滑动进行识别返回数据请求 项目地址:https://github.com/zhaojunlike/...
    99+
    2022-06-02
    python 验证码识别 python 滑块验证码识别 python 腾讯验证码
  • javaWeb怎么实现随机图片验证码
    这篇文章给大家分享的是有关javaWeb怎么实现随机图片验证码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实现步骤Java后台生成一张随机数字/字母/汉字验证码的图片。存入redis或者session。用户输入...
    99+
    2023-06-14
  • Python验证码识别处理实例
    一、准备工作与代码实例 (1)安装PIL:下载后是一个exe,直接双击安装,它会自动安装到C:Python27Libsite-packages中去, (2)pytesser:下载解压后直接放C:Python...
    99+
    2022-06-04
    验证码 实例 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作