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使用PyGame模块播放声音的方法
May 20 Python
Python基本语法经典教程
Mar 11 Python
Python计时相关操作详解【time,datetime】
May 26 Python
详解Python pygame安装过程笔记
Jun 05 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
Python之读取TXT文件的方法小结
Apr 27 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
python django中8000端口被占用的解决
Dec 17 Python
PyCharm第一次安装及使用教程
Jan 08 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 Python
利用Python第三方库实现预测NBA比赛结果
Jun 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自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
JavaScript箭头(arrow)函数详解
2017/06/04 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
python中使用print输出中文的方法
2018/07/16 Python
使用pycharm设置控制台不换行的操作方法
2019/01/19 Python
Python字典的核心底层原理讲解
2019/01/24 Python
python 字典的打印实现
2019/09/26 Python
Python 3.8 新功能大揭秘【新手必学】
2020/02/05 Python
python 如何调用远程接口
2020/09/11 Python
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
乌克兰最大的家用电器和电子产品连锁店:Eldorado
2019/10/02 全球购物
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
中秋节礼品促销方案
2014/02/02 职场文书
求职信模板
2014/05/23 职场文书
班级标语大全
2014/06/21 职场文书
应届生求职信范文
2014/06/30 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
导游词之湖北武当山
2019/09/23 职场文书
mysql如何查询连续记录
2022/05/11 MySQL