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利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
python查询mysql中文乱码问题
Nov 09 Python
分析Python中解析构建数据知识
Jan 20 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
Python3多线程基础知识点
Feb 19 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
安装docker-compose的两种最简方法
Jul 30 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 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 set_time_limit()函数的使用详解
2013/06/05 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
jquery键盘事件使用介绍
2011/11/01 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
JavaScript中的pow()方法使用详解
2015/06/15 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
Bootstrap4一次重大更新 几乎涉及每行代码
2016/05/16 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
使用store来优化React组件的方法
2017/10/23 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python中用format函数格式化字符串的用法
2015/04/08 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
素质拓展感言
2014/01/29 职场文书
片区教研活动总结
2014/07/02 职场文书
学生退学证明
2015/06/23 职场文书
公司与个人合作协议书
2016/03/19 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python