广告
返回顶部
首页 > 资讯 > 后端开发 > Python >爬虫Python验证码识别入门
  • 648
分享到

爬虫Python验证码识别入门

2024-04-02 19:04:59 648人浏览 独家记忆

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

摘要

目录爬虫python验证码识别 1、批量下载验证码图片2、识别代码看看效果 3、折腾降噪、去干扰爬虫Python验证码识别 前言: 二值化、普通降噪、8邻域降

爬虫Python验证码识别

前言:

二值化、普通降噪、8邻域降噪
tesseract、tesserocr、PIL
参考文献--代码地址:https://GitHub.com/liguobao/python-verify-code-ocr

 1、批量下载验证码图片


import shutil
import requests
from loguru import logger

for i in range(100):
    url = 'Http://xxxx/create/validate/image'
    response = requests.get(url, stream=True)
    with open(f'./imgs/{i}.png', 'wb') as out_file:
        response.raw.decode_content = True
        shutil.copyfileobj(response.raw, out_file)
        logger.info(f"download {i}.png successfully.")
    del response
 
 

2、识别代码看看效果


from PIL import Image
import tesserocr
img = Image.open("./imgs/98.png")
img.show()
img_l = img.convert("L")# 灰阶图
img_l.show()
verify_code1 = tesserocr.image_to_text(img)
verify_code2 = tesserocr.image_to_text(img_l)
print(f"verify_code1:{verify_code1}")
print(f"verify_code2:{verify_code2}")
 

毫无疑问,无论是原图还是灰阶图,一无所有。

 3、折腾降噪、去干扰

Python图片验证码降噪 - 8邻域降噪


from PIL import Image
# https://www.cnblogs.com/jhao/p/10345853.html Python图片验证码降噪 — 8邻域降噪

 
def noise_remove_pil(image_name, k):
    """
    8邻域降噪
    Args:
        image_name: 图片文件命名
        k: 判断阈值
    Returns:
    """

    def calculate_noise_count(img_obj, w, h):
        """
        计算邻域非白色的个数
        Args:
            img_obj: img obj
            w: width
            h: height
        Returns:
            count (int)
        """
        count = 0
        width, height = img_obj.size
        for _w_ in [w - 1, w, w + 1]:
            for _h_ in [h - 1, h, h + 1]:
                if _w_ > width - 1:
                    continue
                if _h_ > height - 1:
                    continue
                if _w_ == w and _h_ == h:
                    continue
                if img_obj.getpixel((_w_, _h_)) < 230:  # 这里因为是灰度图像,设置小于230为非白色
                    count += 1
        return count

    img = Image.open(image_name)
    # 灰度
    gray_img = img.convert('L')

    w, h = gray_img.size
    for _w in range(w):
        for _h in range(h):
            if _w == 0 or _h == 0:
                gray_img.putpixel((_w, _h), 255)
                continue
            # 计算邻域非白色的个数
            pixel = gray_img.getpixel((_w, _h))
            if pixel == 255:
                continue

            if calculate_noise_count(gray_img, _w, _h) < k:
                gray_img.putpixel((_w, _h), 255)
    return gray_img


if __name__ == '__main__':
    image = noise_remove_pil("./imgs/1.png", 4)
    image.show()
 

看下图效果:

这样差不多了,不过还可以提升

提升新思路:

这边的干扰线是从某个点发出来的红色线条,

其实我只需要把红色的像素点都干掉,这个线条也会被去掉。


from PIL import Image
import tesserocr
img = Image.open("./imgs/98.png")
img.show()

# 尝试去掉红像素点
w, h = img.size
for _w in range(w):
    for _h in range(h):
        o_pixel = img.getpixel((_w, _h))
        if o_pixel == (255, 0, 0):
            img.putpixel((_w, _h), (255, 255, 255))
img.show()

img_l = img.convert("L")
# img_l.show()
verify_code1 = tesserocr.image_to_text(img)
verify_code2 = tesserocr.image_to_text(img_l)
print(f"verify_code1:{verify_code1}")
print(f"verify_code2:{verify_code2}")

看起来OK,上面还有零星的蓝色像素掉,也可以用同样的方法一起去掉。

甚至OCR都直接出效果了
好了,完结撒花。
不过,后面发现,有些红色线段和蓝色点,是和验证码重合的。
这个时候,如果直接填成白色,就容易把字母切开,导致识别效果变差。
当前点是红色或者蓝色,判断周围点是不是超过两个像素点是黑色。
是,填充为黑色。
否,填充成白色。

最终完整代码:


from PIL import Image
import tesserocr
from loguru import logger


class VerfyCodeOCR():
    def __init__(self) -> None:
        pass

    def ocr(self, img):
        """ 验证码OCR

        Args:
            img (img): imGobject/imgPath

        Returns:
            [string]: 识别结果
        """
        img_obj = Image.open(img) if type(img) == str else img
        self._remove_pil(img_obj)
        verify_code = tesserocr.image_to_text(img_obj)
        return verify_code.replace("\n", "").strip()

    def _get_p_black_count(self, img: Image, _w: int, _h: int):
        """ 获取当前位置周围像素点中黑色元素的个数

        Args:
            img (img): 图像信息
            _w (int): w坐标
            _h (int): h坐标

        Returns:
            int: 个数
        """
        w, h = img.size
        p_round_items = []
        # 超过了横纵坐标
        if _w == 0 or _w == w-1 or 0 == _h or _h == h-1:
            return 0
        p_round_items = [img.getpixel(
            (_w, _h-1)), img.getpixel((_w, _h+1)), img.getpixel((_w-1, _h)), img.getpixel((_w+1, _h))]
        p_black_count = 0
        for p_item in p_round_items:
            if p_item == (0, 0, 0):
                p_black_count = p_black_count+1
        return p_black_count

    def _remove_pil(self, img: Image):
        """清理干扰识别的线条和噪点

        Args:
            img (img): 图像对象

        Returns:
            [img]: 被清理过的图像对象
        """
        w, h = img.size
        for _w in range(w):
            for _h in range(h):
                o_pixel = img.getpixel((_w, _h))
                # 当前像素点是红色(线段) 或者 绿色(噪点)
                if o_pixel == (255, 0, 0) or o_pixel == (0, 0, 255):
                    # 周围黑色数量大于2,则把当前像素点填成黑色;否则用白色覆盖
                    p_black_count = self._get_p_black_count(img, _w, _h)
                    if p_black_count >= 2:
                        img.putpixel((_w, _h), (0, 0, 0))
                    else:
                        img.putpixel((_w, _h), (255, 255, 255))

        logger.info(f"_remove_pil finish.")
        # img.show()
        return img


if __name__ == '__main__':
    verfyCodeOCR = VerfyCodeOCR()
    img_path = "./imgs/51.png"
    img= Image.open(img_path)
    img.show()
    ocr_result = verfyCodeOCR.ocr(img)
    img.show()
    logger.info(ocr_result)


到此这篇关于爬虫Python验证码识别入门的文章就介绍到这了,更多相关Python验证码识别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 爬虫Python验证码识别入门

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 爬虫Python验证码识别入门
    目录爬虫Python验证码识别 1、批量下载验证码图片2、识别代码看看效果 3、折腾降噪、去干扰爬虫Python验证码识别 前言: 二值化、普通降噪、8邻域降...
    99+
    2022-11-12
  • python入门教程之识别验证码
    前言 验证码?我也能破解? 关于验证码的介绍就不多说了,各种各样的验证码在人们生活中时不时就会冒出来,身为学生日常接触最多的就是教务处系统的验证码了,比如如下的验证码: 识别办法 模拟登陆有着复杂的...
    99+
    2022-06-04
    验证码 入门教程 python
  • Python通用验证码识别OCR库之ddddocr验证码识别
    目录前言传统验证码滑动验证码文字点选验证码总结前言 相信做自动化测试的同学一定不可忽视的问题就是验证码,他几乎是一个网站登录的标配,当然,我一般是不建议在这上面浪费时间去做识别的。 ...
    99+
    2022-11-11
  • Python爬虫爬验证码实现功能详解
    主要实现功能: - 登陆网页 - 动态等待网页加载 - 验证码下载 很早就有一个想法,就是自动按照脚本执行一个功能,节省大量的人力——个人比较懒。花了几天写了写,本着想完成验证码的识别,从根本上解决问...
    99+
    2022-06-04
    爬虫 验证码 详解
  • python 验证码识别库pytesse
    笔者环境 centos7 python3 pytesseract只是tesseract-ocr的一种实现接口。所以要先安装tesseract-ocr(大名鼎鼎的开源的OCR识别引擎)。   依赖安装 yum install-y auto...
    99+
    2023-01-30
    验证码 python pytesse
  • python简单验证码识别
    在学习python通过接口自动登录网站时,用户名密码、cookies、headers都好解决但是在碰到验证码这个时就有点棘手了;于是通过网上看贴,看官网完成了对简单验证码的识别,如果是复杂的请看大神的贴这里解决不了; 以上两张为网站的上...
    99+
    2023-01-31
    验证码 简单 python
  • Python网站验证码识别
    0x00 识别涉及技术 验证码识别涉及很多方面的内容。入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足。 验证码图像处理 验证码图像识别技术主要是操作图片内的像素点,通过对图片...
    99+
    2022-06-04
    验证码 网站 Python
  • 详解Python验证码识别
    以前写过一个刷校内网的人气的工具,Java的(以后再也不行Java程序了),里面用到了验证码识别,那段代码不是我自己写的:-) 校内的验证是完全单色没有任何干挠的验证码,识别起来比较容易,不过从那段代码中可...
    99+
    2022-06-04
    验证码 详解 Python
  • Python教学|Python验证码识别
    大致介绍 在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 计算验证码 滑块验证码 识图验证码 语音验证码 这篇博客主要写的就是识图验证码,识别的是简...
    99+
    2023-09-01
    python opencv 开发语言
  • Python爬虫之超级鹰验证码应用
    目录超级鹰平台基础使用剪切验证码超级鹰平台 验证码的破解可以有以下方式: 简单的数字字母组合可以使用图像识别(python 现成模块),成功率不高使用第三方打码平台(破解验证码平台)...
    99+
    2022-11-11
  • Python爬虫怎么破解滑块验证码
    这篇文章主要介绍“Python爬虫怎么破解滑块验证码”,在日常操作中,相信很多人在Python爬虫怎么破解滑块验证码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python爬虫怎么破解滑块验证码”的疑惑有所...
    99+
    2023-06-20
  • Python爬虫技术入门实例代码分析
    这篇“Python爬虫技术入门实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python爬虫技术入门实例代码分析...
    99+
    2023-07-05
  • Python爬虫模拟登录带验证码网站
    爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法。python提供了强大的url库,想做到这个并不难。这里以登录学校教务系统为例,做一个简单的例子。 首先得明白cookie的作用,coo...
    99+
    2022-06-04
    爬虫 验证码 网站
  • 怎么用Python爬虫破解滑动验证码
    这篇文章给大家分享的是有关怎么用Python爬虫破解滑动验证码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型...
    99+
    2023-06-14
  • 如何使用Python实现极验验证码识别验证码
    这篇“如何使用Python实现极验验证码识别验证码”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用Python实现极验...
    99+
    2023-07-05
  • Python验证码识别处理实例
    一、准备工作与代码实例 (1)安装PIL:下载后是一个exe,直接双击安装,它会自动安装到C:Python27Libsite-packages中去, (2)pytesser:下载解压后直接放C:Python...
    99+
    2022-06-04
    验证码 实例 Python
  • Python+Pillow+Pytesseract实现验证码识别
    目录一、环境配置二、验证码识别实例1实例2实例3昨天十行代码实现文字识别,感觉怎样,是不是很爽 今天咋们继续利用pillow和pytesseract来实现验证码的识别 一、环境配置 ...
    99+
    2022-11-12
  • Python爬虫入门中8个常用爬虫技巧盘点分别是怎样的
    今天就跟大家聊聊有关Python爬虫入门中8个常用爬虫技巧盘点分别是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。编程对于任何一个新手来说都不是一件容易的事情,Python对于...
    99+
    2023-06-02
  • python网络爬虫之模拟登录 自动获取cookie值 验证码识别的具体实现
    目录1、爬取网页分析2、验证码识别3、cookie自动获取4、程序源代码chaojiying.pysign in.py1、爬取网页分析 爬取的目标网址为:https://www.gu...
    99+
    2022-11-12
  • Python系列之图片验证码识别
    Python系列之图片验证码识别 引言 图片验证码已经成为现代网络应用中常见的一种身份验证形式。本文将介绍如何使用 Python 进行图片验证码的识别。我们将使用基于机器学习的方法,通过训练模型来自动...
    99+
    2023-09-07
    python 开发语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作