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写的windows服务不能启动的问题
Apr 15 Python
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
用Python抢过年的火车票附源码
Dec 07 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
python实现类之间的方法互相调用
Apr 29 Python
Python中logging实例讲解
Jan 17 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
Python 日期区间处理 (本周本月上周上月...)
Aug 08 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
Python OpenCV形态学运算示例详解
Apr 07 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 根据IP地址控制访问的代码
2010/04/22 PHP
Codeigniter实现处理用户登录验证后的URL跳转
2014/06/12 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
用户注册常用javascript代码
2009/08/29 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
禁止按回车键提交表单的方法
2015/06/11 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
Vue.js在使用中的一些注意知识点
2017/04/29 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
Python设计模式之观察者模式实例
2014/04/26 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
Python饼状图的绘制实例
2019/01/15 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
python自动生成证件号的方法示例
2021/01/14 Python
护士实习自我鉴定
2013/10/22 职场文书
自荐信怎么写好
2013/11/11 职场文书
幼儿园实习自我鉴定
2013/12/15 职场文书
一分钟演讲稿
2014/04/30 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
体育专业求职信
2014/07/16 职场文书
安全责任书怎么写
2014/07/28 职场文书
端午节寄语2015
2015/03/23 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
在职证明书模板
2015/06/15 职场文书
2015年城管执法工作总结
2015/07/23 职场文书