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使用webbrowser浏览指定url的方法
Apr 04 Python
python字典get()方法用法分析
Apr 17 Python
python 3.6.4 安装配置方法图文教程
Sep 18 Python
利用Python将文本中的中英文分离方法
Oct 31 Python
int在python中的含义以及用法
Jun 27 Python
pytorch forward两个参数实例
Jan 17 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
python3中确保枚举值代码分析
Dec 02 Python
Python实现给PDF添加水印的方法
Jan 25 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
url decode problem 解决方法
2011/12/26 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
Mootools 1.2教程 类(一)
2009/09/15 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
js+css实现回到顶部按钮(back to top)
2016/03/02 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
Python+Wordpress制作小说站
2017/04/14 Python
Python中with及contextlib的用法详解
2017/06/08 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
解决pytorch DataLoader num_workers出现的问题
2020/01/14 Python
python实现的Iou与Giou代码
2020/01/18 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
Python用5行代码实现批量抠图的示例代码
2020/04/14 Python
Pytorch转onnx、torchscript方式
2020/05/25 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
应届生.NET方向面试题
2015/05/23 面试题
酒店副总岗位职责
2013/12/24 职场文书
十佳青年个人事迹材料
2014/01/28 职场文书
酒店经理职责
2014/01/30 职场文书
早恋主题班会
2015/08/14 职场文书