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自动化测试之从命令行运行测试用例with verbosity
Sep 28 Python
Python遍历指定文件及文件夹的方法
May 09 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
Jun 11 Python
python实现爬取图书封面
Jul 05 Python
python实现逐个读取txt字符并修改
Dec 24 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
python标准库OS模块函数列表与实例全解
Mar 10 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
Python之字符串的遍历的4种方式
Dec 08 Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 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
PHP setTime 设置当前时间的代码
2012/08/27 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
Javascript this指针
2009/07/30 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
JavaScript设计模式之单例模式实例
2014/09/24 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
Python实现登录接口的示例代码
2017/07/21 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
Python shelve模块实现解析
2019/08/28 Python
Pycharm小白级简单使用教程
2020/01/08 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
领导调研接待方案
2014/02/27 职场文书
合伙经营协议书
2014/04/18 职场文书
本科生就业推荐信
2014/05/19 职场文书
关于环保的标语
2014/06/13 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
写给同事的离职感言
2015/08/04 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书