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 相关文章推荐
pyqt4教程之widget使用示例分享
Mar 07 Python
Python选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
Python标准库sched模块使用指南
Jul 06 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
python对于requests的封装方法详解
Jan 03 Python
python 同时运行多个程序的实例
Jan 07 Python
python2爬取百度贴吧指定关键字和图片代码实例
Aug 14 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
Python异步编程之协程任务的调度操作实例分析
Feb 01 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 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一行代码获取文件后缀名实例分析
2014/11/12 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
js实现右键菜单功能
2016/11/28 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
深入了解js原型模式
2019/05/30 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
JS动态显示倒计时效果
2019/12/12 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
[07:43]《辉夜杯》公开赛晋级外卡赛战队—TRG训练生活探秘
2015/12/11 DOTA
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
一些网络技术方面的面试题
2014/05/01 面试题
医药大学生求职简历的自我评价
2013/10/17 职场文书
高中自我鉴定范文
2013/11/03 职场文书
英语系本科生求职信范文
2013/12/18 职场文书
班级团队活动方案
2014/08/14 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
优秀教师先进材料
2014/12/16 职场文书
收银员岗位职责范本
2015/04/07 职场文书
2016年11月份红领巾广播稿
2015/12/21 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
bat批处理之字符串操作的实现
2022/03/16 Python