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实现的检测web服务器健康状况的小程序
Sep 17 Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
Python中断言Assertion的一些改进方案
Oct 27 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
Python 实现遥感影像波段组合的示例代码
Aug 04 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
python如何实现word批量转HTML
Sep 30 Python
Pycharm常用快捷键总结及配置方法
Nov 14 Python
python中pandas对多列进行分组统计的实现
Jun 18 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 zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
ExtJS 入门
2010/10/29 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
jQuery代码优化 事件委托篇
2011/11/01 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
javascript实用小函数使用介绍
2013/11/11 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
Python字符编码与函数的基本使用方法
2017/09/30 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
python 切换root 执行命令的方法
2019/01/19 Python
举例讲解Python常用模块
2019/03/08 Python
详解Python中的Lock和Rlock
2021/01/26 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
教师队伍管理制度
2014/01/14 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
留学顾问岗位职责
2014/04/14 职场文书
在人间读书笔记
2015/06/30 职场文书
公司周年庆典致辞
2015/07/30 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
Nginx的gzip相关介绍
2022/05/11 Servers