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操作摄像头截图实现远程监控的例子
Mar 25 Python
python中xrange和range的区别
May 13 Python
Python计算字符宽度的方法
Jun 14 Python
用Django写天气预报查询网站
Oct 21 Python
python3 爬取图片的实例代码
Nov 06 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
为什么说Python可以实现所有的算法
Oct 04 Python
pytorch的batch normalize使用详解
Jan 15 Python
简单了解Python write writelines区别
Feb 27 Python
浅谈Keras中shuffle和validation_split的顺序
Jun 19 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
python+playwright微软自动化工具的使用
Feb 02 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
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
Javascript !!的作用
2008/12/04 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
解决python使用list()时总是报错的问题
2020/05/05 Python
Python绘制数码晶体管日期
2021/02/19 Python
安纳塔拉酒店度假村及水疗官方网站:Anantara Hotel
2016/08/25 全球购物
市场营销个人求职信范文
2014/02/02 职场文书
文化产业实施方案
2014/06/07 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书