Python 实现识别弱图片验证码

目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫。验证码的形式有多种,最常见的就是图片验证码。其他验证码的形式有音频验证码,滑动验证码等。图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错。本文主要讲解识别弱图片验证码。

1 图片验证码强度

图片验证码主要采用加干扰线、字符粘连、字符扭曲方式来增强识别难度。

  • 加干扰线

加干扰线也分为两种,一种是线条跟字符同等颜色,另一种则线条的颜色是五颜六色。

  • 字符粘连

各个字符之间的间隔比较小,互相依靠,能以分割。

  • 字符扭曲

字符显示的位置相对标准旋转一定角度。

其中最弱的验证码为不具备以上的特征,干扰因素比较小。如下:

2 识别思路

首先对图片做二值化来降噪处理,去掉图片中的噪点,干扰线等。然后将图片中的单个字符切分出来。最后识别每个字符。

图片的处理,我采用 Python 标准图像处理库 PIL。图片分割,我暂时采用谷歌开源库 Tesseract-OCR。字符识别则使用 pytesseract 库。

3 安装

  • Pillow

我使用的 Python 版本是 3.6, 而标准库 PIL 不支持 3.x。所以需要使用 Pillow 来替代。Pillow 是专门兼容 3.x 版本的 PIL 的分支。使用 pip 包管理工具安装 Pillow 是最方便快捷的。

pip install Pillow
# 如果出现因下载失败导致安装不上的情况,建议使用代理
pip --proxy http://代理ip:端口 install Pillow

  

  • Tesseract-OCR

Tesseract:开源的OCR识别引擎,初期Tesseract引擎由HP实验室研发,后来贡献给了开源软件业,后经由Google进行改进,消除bug,优化,重新发布。这才让其重焕新生。

我们可以在 GitHub 上找到该库并下载。我是下载最新的 4.0 版本。

github 的下载地址是:https://github.com/tesseract-ocr/tesseract/wiki/4.0-with-LSTM#400-alpha-for-windows

  • pytesseract

pytesseract 是 Tesseract-OCR 对进行包装,提供 Python 接口的库。同样可以使用 pip 方式来安装。

pip install pytesseract
# 如果出现因下载失败导致安装不上的情况,建议使用代理
pip --proxy http://代理ip:端口 install pytesseract

  

4 代码实现

4.1 获取并打开图片

获取图片验证码,你可以通过使用网络请求库下载。我为了方便,将图片下载到本地并放在项目目录下。

from PIL import Image
‘‘‘
获取图片
‘‘‘
def getImage():
    fileName = ‘16.jpg‘
    img = Image.open()
    # 打印当前图片的模式以及格式
    print(‘未转化前的: ‘, img.mode, img.format)
    # 使用系统默认工具打开图片
    # img.show()
    return img

  

4.2 预处理

这一步主要是将图片进行降噪处理, 把图片从 "RGB" 模式转化为 "L" 模式,也就是把彩色图片变成黑白图片。再处理掉背景噪点,让字符和背景形成黑白的反差。

‘‘‘
1) 将图片进行降噪处理, 通过二值化去掉后面的背景色并加深文字对比度
‘‘‘
def convert_Image(img, standard=127.5):
    ‘‘‘
    【灰度转换】
    ‘‘‘
    image = img.convert(‘L‘)

    ‘‘‘
    【二值化】
    根据阈值 standard , 将所有像素都置为 0(黑色) 或 255(白色), 便于接下来的分割
    ‘‘‘
    pixels = image.load()
    for x in range(image.width):
        for y in range(image.height):
            if pixels[x, y] > standard:
                pixels[x, y] = 255
            else:
                pixels[x, y] = 0
    return image

  

打开彩色图片,PIL 会将图片解码为三通道的 “RGB” 图像。调用 convert(‘L‘) 才会把图片转化为黑白图片。其中模式 “L” 为灰色图像, 它的每个像素用 8 个bit表示, 0 表示黑, 255 表示白, 其他数字表示不同的灰度。

在 PIL 中,从模式 “RGB” 转换为 “L” 模式是按照下面的公式转换的:

L = R 的值 x 299/1000 + G 的值 x 587/1000+ B 的值 x 114/1000

图像的二值化,就是将图像上的像素点的灰度值两极分化(设置为 0 或 255,0表示黑,255表示白),也就是将整个图像呈现出明显的只有黑和白的视觉效果。目的是加深字符与背景的颜色差,便于 Tesseract 的识别和分割。对于阈值的选取,我采用比较暴力的做法,直接使用 0 和 255 的平均值。

4.3 识别

经过上述处理,图片验证码中的字符已经变成很清晰了。

最后一步是直接用 pytesseract 库识别。

import pytesseract
‘‘‘
使用 pytesseract 库来识别图片中的字符
‘‘‘
def change_Image_to_text(img):
    ‘‘‘
    如果出现找不到训练库的位置, 需要我们手动自动
    语法: tessdata_dir_config = ‘--tessdata-dir "<replace_with_your_tessdata_dir_path>"‘
    ‘‘‘
    testdata_dir_config = ‘--tessdata-dir "C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"‘
    textCode = pytesseract.image_to_string(img, lang=‘eng‘, config=testdata_dir_config)
    # 去掉非法字符,只保留字母数字
    textCode = re.sub("\W", "", textCode)
    return textCode

  

Tesseract-ORC 默认是没有指定安装路径。我们需要手动指定本地 Tesseract 的路径。不然会报出这样的错误:

FileNotFoundError: [WinError 2] 系统找不到指定的文件

  

具体解决方案是:

使用文本编辑器打开 pytesseract 库的 pytesseract.py 文件,一般路径如下:

C:\Program Files (x86)\Python35-32\Lib\site-packages\pytesseract\pytesseract.py

  

将 tesseract_cmd 修改成你电脑本地的 Tesseract-OCR 的安装路径。

# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
tesseract_cmd = ‘C:/Program Files (x86)/Tesseract-OCR/tesseract.exe

  

最后执行字符识别的实例代码

def main():
    img = convert_Image(getImage(fileName))
    print(‘识别的结果:‘, change_Image_to_text(img))

if __name__ == ‘__main__‘:
    main()

  

运行结果如下:

未转化前的:  RGB JPEG
识别的结果: 9834

  

5 总结

Tesseract-ORC 对于这种弱验证码识别率还是可以,大部分字符能够正确识别出来。只不过有时候会将数字 8 识别为 0。如果图片验证码稍微变得复杂点,识别率大大降低,会经常识别不出来的情况。我自己也尝试收集 500 张图片来训练 Tesseract-ORC,识别率会有所提升,但识别率还是很低。

如果想要做到识别率较高,那么需要使用 CNN (卷积神经网络)或者 RNN (循环神经网络)训练出自己的识别库。正好机器学习很火爆很流行,学习一下也无妨。

转自:https://cloud.tencent.com/developer/article/1187805

Python学习交流群:548377875

作者:猴哥

原文地址:https://www.cnblogs.com/pythonedu/p/9594980.html

时间: 2024-11-02 11:20:46

Python 实现识别弱图片验证码的相关文章

Python简单的制作图片验证码

-人人可以学Python--这里示范的验证码都是简单的,你也可以把字符扭曲 人人可以学Python.png Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使用它来生成图片验证码PIL安装命令安装: pip install pillow 下载源码安装:复制地址 :https://github.com/python-pillow/Pillow PIL使用 例子:生成图片,并填充文字 #!/usr/bin/python #-*-coding:utf-8-*-

Python——pytessercat识别简单的验证码

什么是验证码 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computersand Humans Apart” (全自动区分计算机和人类的图灵测试)的缩写, 是一种区分用户是计算机还是人的公共全自动程序.可以防止:恶意破解密码.刷票.论坛灌水, 有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试. 这个问题可以由计算机生成并评判,但是必须只有人类才能解答.由于计算机无法解答CAPTCHA的问

随机图片验证码的生成

Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 from PIL import Image img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))   # 在图片查看器中打开 # img.show()   # 保存在本地 with open('code.png','wb') as f:     img.s

字符型图片验证码识别完整过程及Python实现

1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义. 2   关键词 关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3   免责声明 本文研究所用素材来自于某旧Web框架的网站 完全对外公开 的公共图片资源. 本文只做了该网站对外公开的公共图片资源进行了爬取, 并未越权 

python爬虫20 | 小帅b教你如何使用python识别图片验证码

当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 一来一去 就有了各种各样的变态验证码 也有了各种各样的应对方式 常见的验证码有这么几种 图像验证 语音验证 短信验证 极验验证 点击验证 今天 小帅b想跟你先说说如何识别图像验证码 那么 接下来就是 学习 python 的正确姿势 我们来看看这些图片验证码 (此图来源网络) 可以发现 这些验证码大

Python 实现简单图片验证码登录

朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来识别图片验证码了,看了一下他们的验证码,长这样,还好挺容易识别(背景色是透明的,有个坑需要处理). Python 实现了图片验证码登录 demo,用到的第三方模块有 requests, PIL, pytesseract. 1 # coding: utf-8 2 import requests 3 f

验证码识别与生成类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数字+小写.数字+大写.数字+大小写等情况. 四位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数字+小写.数字+大写.数字+大小写等情况. 简单验证码识别:验证码类型 : 数字+字母, 纯英文, 纯数字,计算题 英数_验证码识别:纯数字,纯英文,数字+英文 中英数_验证码识别:英文.数

python利用selenium库识别点触验证码

利用selenium库和超级鹰识别点触验证码(学习于静谧大大的书,想自己整理一下思路) 一.超级鹰注册:超级鹰入口 1.首先注册一个超级鹰账号,然后在超级鹰免费测试地方可以关注公众号,领取1000积分,基本上就够学习使用了.如果想一直用可以用,可以充值,不是很贵. 2.下载超级鹰的python库代码.代码 3.然后有测试案例,自己可以试着跑一跑代码. 二.使用selenium库来识别点触式验证码: 1.首先是找一个使用点触式二维码的网站:(这个真的是比较难找了,由于静谧大大书上的网站被封了,我找

【Mac + Python + Selenium】之获取验证码图片code并进行登录

初稿代码,可以忽略不计(自己留着看) #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/01/15 13:27 # @Author : zc # @File : 115test.py from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep from PIL import Image,Im