【详解】简单验证码的解析

来源:互联网 发布: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后能够输出识别出来的字符串。

经过多次测试验证,我们发现只有非常容易辨认,或者说对比度比较大的图片,才能够准确辨认。

所以,该方法只适用于简单验证码的识别。


0 0
原创粉丝点击