【详解】简单验证码的解析
来源:互联网 发布:windows线程优先级 编辑:程序博客网 时间:2024/06/10 07:38
首先把大致思路说一下,解析验证码就是先获取验证码图片,然后通过Python的PIL库以及其它相关库,实现IMAGE_TO_STRING。
即,把图片进行处理解析,输出图片中的数字或字母,就达到了解析验证码的目的。
经过研究,发现用这种方法进行准确的验证码解析并不现实,准确率太低了。而且不同网站的验证码生成方式都是不一样的。
对比字库如果一直不变的话,对准确率也会产生影响。
我们目前找到的方法,对于相当简单,一目了然的清晰验证码肯定是有效的。如纯数字,解析很可靠。(理论上来说是这样的)
对于B站的数字加字母,并且还发生扭曲重合的情况,最终我们还是只能获取验证码图片,然后人工识别输入。
接下来我们首先介绍识别简单验证码的方法。
【识别简单验证码】
首先贴出全部代码如下:
#!/usr/bin/python# -*- coding: utf-8 -*-__author__ = "$Author: wangxin.xie$"__version__ = "$Revision: 1.0 $"__date__ = "$Date: 2015-12-11 9:51$"################################################################ 功能:抓取验证码图片,识别简单验证码。。。但是准确率太低###############################################################import urllib2import datetimeimport sysimport osfrom pytesser import *#####################全局变量###########################################today = datetime.datetime.today()todayStr = datetime.datetime.strftime(today, "%Y-%m-%d")lastDayDate = today - datetime.timedelta(1)lastDayDateStr = datetime.datetime.strftime(lastDayDate, "%Y-%m-%d")os.chdir('C:\Python27\Lib\site-packages\pytesser_v0.0.1')picname="vdcode.png"vdUrl="https://account.bilibili.com/captcha"#################################################################def printStr(): # 二值化 threshold = 140 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) #打开图片 im = Image.open(picname) #转化到亮度 imgry = im.convert('L') #imgry.save('g'+picname) #二值化 out = imgry.point(table,'1') #out.save('b'+picname) #识别 text = image_to_string(out) #识别 text = text.strip() text = text.upper() text = text.replace(' ','') print textdef checkVdCode(): resp=urllib2.urlopen(vdUrl) f = open(picname, 'wb') f.write(resp.read()) f.close() print('Pic Saved!')def main(): print "===%s start===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S")) checkVdCode() printStr() print "===%s end===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))#################################################################################if __name__ == "__main__": main()
按程序的运行顺序来进行解释。
我们进入主函数,先进入
checkVdCode()获取验证码图片。图片储存路径如下
os.chdir('C:\Python27\Lib\site-packages\pytesser_v0.0.1')picname="vdcode.png"
为何要将图片放在pytesser的目录下?
【ERROR2的报错解决方法】
我们在编码过程中,执行到
#识别 text = image_to_string(out)时,遇到过windows error2的报错。error2的意思是系统找不到指定路径。
网上找到的唯一解决办法是,将验证码图片的路径引到pytesser的文件夹路径下。所以就只能
os.chdir('C:\Python27\Lib\site-packages\pytesser_v0.0.1')picname="vdcode.png"
显示了Pic Saved!后,进入
printStr()开始解析验证码图片。
解析的基本思想是:亮度处理、二值化、pytesser的image_to_string函数转字符串。
如果执行被注释的这两行代码
#imgry.save('g'+picname)
#out.save('b'+picname)
我们可以看到处理中的效果。就是去噪点调节对比度什么的,和PS的原理是一样的。让图片更加清晰容易辨认而已。
然后经过
text = image_to_string(out)
后,涉及到了三个字符串处理函数。#识别 text = text.strip() text = text.upper() text = text.replace(' ','')【strip函数】
s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
当rm为空时,默认删除空白符
【upper函数】
转成大写字母
【replace函数】
去除字符串中间的空格
最后执行print text后能够输出识别出来的字符串。
经过多次测试验证,我们发现只有非常容易辨认,或者说对比度比较大的图片,才能够准确辨认。
所以,该方法只适用于简单验证码的识别。
- 【详解】简单验证码的解析
- 解析Java实现随机验证码功能的方法详解
- C#简单数字验证码解析
- 简单图形验证码生成 代码解析
- 简单的验证码
- 简单的验证码
- 简单的验证码
- 简单的验证码
- 简单的验证码
- servlet简单的验证码登录验证
- 简单验证码的产生
- 简单验证码的产生
- 简单验证码的产生
- 简单验证码的识别
- 简单的验证码程序
- 简单验证码的产生
- 验证码的简单例子
- 简单的写验证码
- 比JDK高效的array equals
- 缓冲技术
- javascript函数式编程要掌握的知识点讲解
- OC_04_03
- 【罗塞塔石碑】—My Lover(One.iso)
- 【详解】简单验证码的解析
- Ajax中 async的作用
- 程序7——一棵二叉树是不是另外一棵二叉树的子结构
- [leetcdoe] 119. Pascal's Triangle II 解题报告
- 每天睡6小时和8小时的区别 【链接】
- 微软官方SqlHelper
- subgrid更新后刷新主表单
- 使用monyog监控mysql教程
- 3.2版本调用soapclient报错