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 控制语句
Nov 03 Python
python中函数传参详解
Jul 03 Python
Python学习小技巧之列表项的拼接
May 20 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
使用Python脚本zabbix自定义key监控oracle连接状态
Aug 28 Python
python获取栅格点和面值的实现
Mar 10 Python
python 数据分析实现长宽格式的转换
May 18 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
python中常见错误及解决方法
Jun 21 Python
Python如何定义有可选参数的元类
Jul 31 Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 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
我的论坛源代码(一)
2006/10/09 PHP
ajax缓存问题解决途径
2006/12/06 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
JavaScript 事件系统
2010/07/22 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
python时间日期操作方法实例小结
2020/02/06 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
Spartoo西班牙官网:法国时尚购物网站
2018/03/27 全球购物
美国渔具店:FishUSA
2019/08/07 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
外贸采购员岗位职责
2014/03/08 职场文书
赔偿协议书范本
2014/09/12 职场文书
维稳工作承诺书
2015/01/20 职场文书
公积金贷款承诺书
2015/04/30 职场文书
银行安全保卫工作总结
2015/08/10 职场文书