Python3简单验证码识别

这次的需求是自动登录某机构网站, 其验证码很具特色, 很适合做验证码识别入门demo, 先贴主要代码, 其中图片对比使用了编辑距离算法, 脚本使用了pillow库

from PIL import Image
import requests
import re

splitter = re.compile(r‘\d{30}‘)  # 分割二值化后的图片

# distance(‘11110000‘, ‘00000000‘)
# 比较两个字符串有多少位不同, 返回不同的位数
def distance(string1, string2):
    d_str1 = len(string1)
    d_str2 = len(string2)
    d_arr = [[0] * d_str2 for i in range(d_str1)]
    for i in range(d_str1):
        for j in range(d_str2):
            if string1[i] == string2[j]:
                if i == 0 and j == 0:
                    d_arr[i][j] = 0
                elif i != 0 and j == 0:
                    d_arr[i][j] = d_arr[i - 1][j]
                elif i == 0 and j != 0:
                    d_arr[i][j] = d_arr[i][j - 1]
                else:
                    d_arr[i][j] = d_arr[i - 1][j - 1]
            else:
                if i == 0 and j == 0:
                    d_arr[i][j] = 1
                elif i != 0 and j == 0:
                    d_arr[i][j] = d_arr[i - 1][j] + 1
                elif i == 0 and j != 0:
                    d_arr[i][j] = d_arr[i][j - 1] + 1
                else:
                    d_arr[i][j] = min(d_arr[i][j - 1], d_arr[i - 1][j], d_arr[i - 1][j - 1]) + 1

    current = max(d_arr[d_str1 - 1][d_str2 - 1], abs(d_str2 - d_str1))
    # print("Levenshtein Distance is",current)
    # print(current)
    return current

# 去除字符串里面连续的1
def no_one(string):
    n_arr = splitter.findall(string)
    n_arr = filter(lambda each_str: each_str != ‘111111111111111111111111111111‘, n_arr)
    n_result = ‘‘
    for n_each in n_arr:
        n_result += str(n_each)

    return n_result

opener = requests.session()
res = opener.get(‘http://60.211.254.236:8402/Ajax/ValidCodeImg.ashx‘).content

with open(‘verify.gif‘, ‘wb‘) as v:
    v.write(res)

img = Image.open(‘verify.gif‘)
img = img.convert(‘L‘)

size = img.size
# img = img.point(table, ‘1‘)
img_arr = img.load()

# for x in range(size[0]):
#     for y in range(size[1]):
#         if img_arr[x, y] > 210:
#             img_arr[x, y] = 1
#         else:
#             img_arr[x, y] = 0

# img.save(‘after.gif‘)
inc = 0

str1 = ‘‘
str2 = ‘‘
str3 = ‘‘
cur_str = ‘‘
for x in range(size[0]):
    for y in range(size[1]):
        if img_arr[x, y] > 210:
            cur_str += ‘1‘
        else:
            cur_str += ‘0‘
        # print(img_arr[i, j], end=‘‘)
        # cur_str += str(img_arr[x, y])

    inc += 1
    # if inc % 18 == 0:
    #     print(‘\n----‘)
    # else:
    #     print(‘‘)
    if inc == 18:
        str1 = cur_str
        cur_str = ‘‘
    elif inc == 36:
        str2 = cur_str
        cur_str = ‘‘
    elif inc == 54:
        str3 = cur_str
        cur_str = ‘‘

str1 = str1[:-60]
str2 = str2[:-60]
str3 = str3[:-60]
str1 = no_one(str1)
str2 = no_one(str2)
str3 = no_one(str3)
str1 = str1.strip(‘1‘)
str2 = str2.strip(‘1‘)
str3 = str3.strip(‘1‘)
# print(str1)
# print(str3)

with open(‘./dict/plus‘) as plus:
    with open(‘./dict/minus‘) as minus:
        p = plus.read()
        m = minus.read()
        is_add = 1 if distance(p, str2) < distance(m, str2) else 0

arr1 = []
arr3 = []

for each in range(1, 10):
    with open(‘./dict/{}‘.format(each)) as f:
        ff = f.read()
        arr1.append([each, distance(ff, str1)])
        arr3.append([each, distance(ff, str3)])

arr1 = sorted(arr1, key=lambda item: item[1])
arr3 = sorted(arr3, key=lambda item: item[1])
result = arr1[0][0] + arr3[0][0] if is_add else arr1[0][0] - arr3[0][0]
print(result)
# login_url = ‘http://60.211.254.236:8402/Ajax/Login.ashx?Method=G3_Login‘
# login_data = {
#     ‘loginname‘: usn,
#     ‘password‘: pwd,
#     ‘validcode‘: result,
#
# }
# opener.get(login_url, login_data)

字库已经部署到GitHub上, 链接

时间: 2024-08-06 09:06:27

Python3简单验证码识别的相关文章

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

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

基于决策树的简单验证码识别

原理 核心思想:相似的输入必会产生相似的输出. 原理:首先从训练样本矩阵中选择第一个特征进行划分,使每个子表中该特征的值全部相同(比如第一个特征是男女,则可以划分出两个子表,男表和女表),然后再在每个子表中选择下一个特征按照同样的规则继续划分更小的子表(比如第二个特征是年龄,我可以划分成三个子表(当然根据情况的不同而不同),小于18,大于18小于60,大于60,则在男女表中分别又有三个子表,每个子表下的特征值都相同),不断重复直到所有的特征全部使用完为止,此时便得到叶级子表,其中所有样本的特征值

简单验证码识别 tessnet2

今天突然间对识别验证码感兴趣,于是网上搜了一下 最简单的是引用tessnet2.dll,然后通过它来识别,代码如下 1 private void button1_Click(object sender, EventArgs e) 2 { 3 string strUrl = @"http://www.gz.gov.cn/sofpro/gecs/common/image.jsp?dt=Thu%20Nov%2024%202011%2017:20:21%20GMT+0800%20(China%20Sta

python 验证码识别示例(四) 简单验证码识别

今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:http://wsxf.mca.gov.cn/zfp/Random.cmd?d=1565452532947 需要识别的验证码是: 识别结果是: 识别率百分之八十.10个有两个错误. 识别代码: #coding:utf-8 from common.contest import * from PIL import Image import pytesseract def recog

python 验证码识别示例(五) 简单验证码识别 &#187; 立即查看

今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:http://wscx.gjxfj.gov.cn/zfp/webroot/xfsxcx.html 需要识别的验证码是: 因为这个验证码有干扰点,所以直接识别的效果非常不好. 首先对验证码进行二值化和降噪. 效果如下: 识别结果: 识别率只有百分之四十,针对这么低的识别率,可以去切割分类,目前这个验证码很容易去切割.提高验证码的识别率问题. 二值化代码: # coding:utf

python 验证码识别示例(三) 简单验证码识别

今天介绍一个简单验证的识别. 主要是标准的格式,没有扭曲和变现.就用 pytesseract 去识别一下. 验证码地址:https://user.www.gov.cn/sso/verifyimg_edit?rd=0.22469390770687414 需要识别的验证码是: 识别结果是: 识别代码是: #coding:utf-8 from common.contest import * from PIL import Image import pytesseract def recognize_c

C#简单验证码码识别

写在最前 最近做一个小玩意需要识别验证码,之前从来没接触过验证码识别这块,这可难到了我.所以,只有三番五次的麻烦度娘帮我找找验证码识别这块的资料.所幸,许多前辈分享的博文帮到了我.最终,完美的把问题解决. 我要识别的验证码属于非常简单的一种,如下图: 1.图片灰度化(把彩色的验证码图片转换成灰色图片) for(int i = 0; i < bmp.Width; i++) { for(int j = 0; j < bmp.Height; j++) { Color color = bmp.GetP

验证码识别之二值化

前言 二值化顾名思义就是将数变成两种值,一般非0即1.而在验证码处理中,如果直接使用灰度图,那么每个像素的值会在0-255,这样肯定会增加计算时间,而二值化后每个像素的值只是0和1. 在前面的简单验证码识别中,我的二值化代码是这样写的:a = (a > 180) * 255,至于这里为什么不乘1而乘255,因为我要显示图片看看效果.如果只是用于算法识别的话,乘1会更好.但是,这里的180也就是二值化的阈值是如何得到的,开始是通过一个一个试然后看效果哪个好就选哪个,因为我们一般只识别某个网站的验证

简单的验证码识别

https://blog.csdn.net/qq_35923581/article/details/79487579 这是我尝试写的第一篇技术博客,借鉴了很多博客和教程,写出了自己的代码,代码较为冗杂而且程序十分耗时.所以本文主要提供验证码识别的一个简单的思路,代码实现的部分还望各位大佬指点. 看了好几篇验证码图片识别的博文,不难归纳出验证码识别的大概思路是收集训练集-->图像处理-->得到图片特征值-->训练-->识别,其中图像处理部分又包括了灰度化.二值化.去噪.分割等过程.本