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中threading超线程用法实例分析
May 16 Python
使用Django的模版来配合字符串翻译工作
Jul 27 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
python安装scipy的步骤解析
Sep 28 Python
Python递归实现打印多重列表代码
Feb 27 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
python保存图片的四个常用方法
Feb 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
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
PHP echo()函数讲解
2019/02/15 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
理解Javascript_03_javascript全局观
2010/10/11 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
Angular Excel 导入与导出的实现代码
2019/04/17 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
Python面向对象特殊成员
2017/04/24 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
Python正则表达式学习小例子
2020/03/03 Python
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
Linux的主要特性
2016/09/03 面试题
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
小学生民族团结演讲稿
2014/08/27 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
自查自纠工作总结
2014/10/15 职场文书
运动会通讯稿100字
2015/07/20 职场文书
六年级数学教学反思
2016/02/16 职场文书
MySQL注入基础练习
2021/05/30 MySQL
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL