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


Posted in Python onMay 02, 2018

本文实例讲述了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地址:https://github.com/hldh214/validCode/

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现把utf-8格式的文件转换成gbk格式的文件
Jan 22 Python
Python中的super用法详解
May 28 Python
python中map()与zip()操作方法
Feb 27 Python
python版简单工厂模式
Oct 16 Python
python使用fork实现守护进程的方法
Nov 16 Python
Python内置函数 next的具体使用方法
Nov 24 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
Python线程同步的实现代码
Oct 03 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 Python
Visual Studio code 配置Python开发环境
Sep 11 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 Python
利用Python在一个文件的头部插入数据的实例
May 02 #Python
python在文本开头插入一行的实例
May 02 #Python
Python实现的根据文件名查找数据文件功能示例
May 02 #Python
对Python3中的print函数以及与python2的对比分析
May 02 #Python
python print 按逗号或空格分隔的方法
May 02 #Python
Django 跨域请求处理的示例代码
May 02 #Python
python 按照固定长度分割字符串的方法小结
Apr 30 #Python
You might like
利用static实现表格的颜色隔行显示
2006/10/09 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
一些技巧性实用js代码小结
2009/10/14 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
python求pi的方法
2014/10/08 Python
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
运动会广播稿30字
2014/01/21 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技