PHP前端开发

Python3实现的简单验证码识别功能示例

百变鹏仔 2小时前 #Python
文章标签 验证码

这篇文章主要介绍了python3实现的简单验证码识别功能,涉及python针对验证码图片识别处理相关操作技巧,需要的朋友可以参考下

本文实例讲述了Python3实现的简单验证码识别功能。分享给大家供大家参考,具体如下:

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

from PIL import Imageimport requestsimport resplitter = 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# 去除字符串里面连续的1def 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_resultopener = requests.session()res = opener.get('http://60.211.254.236:8402/Ajax/ValidCodeImg.ashx').contentwith 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] &gt; 210:#       img_arr[x, y] = 1#     else:#       img_arr[x, y] = 0# img.save('after.gif')inc = 0str1 = ''str2 = ''str3 = ''cur_str = ''for x in range(size[0]):  for y in range(size[1]):    if img_arr[x, y] &gt; 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('----')  # 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) <p class="clearfix"><span class="jbTestPos"></span></p><p>