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 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python在每个字符后添加空格的实例
May 07 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
Python subprocess模块常见用法分析
Jun 12 Python
python实现字符串加密成纯数字
Mar 19 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
python输出数学符号实例
May 11 Python
对Keras中predict()方法和predict_classes()方法的区别说明
Jun 09 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 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
一个PHP模板,主要想体现一下思路
2006/12/25 PHP
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
Javascript之深入浅出prototype
2017/02/06 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
vue中监听返回键问题
2019/08/28 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
python抓取网页内容示例分享
2014/02/24 Python
跟老齐学Python之使用Python操作数据库(1)
2014/11/25 Python
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
python实现TF-IDF算法解析
2018/01/02 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
料理师求职信
2014/01/30 职场文书
安全生产责任书
2014/03/12 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL