博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
验证码爬取并识别-云大urp教务系统大作战(1)
阅读量:5943 次
发布时间:2019-06-19

本文共 2673 字,大约阅读时间需要 8 分钟。

1. 穷举爬取urp的验证码

因为小道消息得知urp的验证码是有限数量的,因此通过数百万次的请求,下载所有验证码图片到本地,并生成了一份验证码图片的文件名的文件。

爬取所有验证码图片的代码:

#encoding: utf-8  import sys  reload(sys)  sys.setdefaultencoding('utf8')#上述代码解决中文乱码问题 import urllib2import jsonimport requestsfrom requests import exceptions##导入所需要的包URL = 'http://202.203.209.96/v5api/api/xk/Captcha'png_names = set()#此处取巧使用set自动去重.fw =open('png_name.txt','a')#下载验证码同时保存图片名。def basic_oauth():    auth ='添加选课界面f12获取到的auth值'    headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',            'Authorization':'%s'%auth}    try:        num = len(png_names)        response = requests.get(URL,headers=headers)        print response.text        png_names.add(response.text)        #此处只有当前新获取的验证码是一张集合里并没有存在过的。        #也就是引起了set长度变大。则将它才写入文件并下载保存。        #切片[1:-1]去除掉双引号。        if len(png_names)>num:            c =response.text[1:-1]            print "add"            fw.write(response.text+'\n')            #下面保存验证码图片到本地            file =open('./captcha/'+str(c)+'.png','wb')            req = urllib2.urlopen('http://202.203.209.96/vimgs/'+str(c)+'.png')            buf = req.read()            file.write(buf)            print "**************"            print ("第%d张正在保存"%len(png_names))    except Exception as e:        print e        passfor x in xrange(1,100):    basic_oauth()

爬取过程
已爬取到本地的验证码
经统计urp真实验证码存量为999张。

urp验证码数量

2. 使用验证码识别api识别urp验证码

既然已经拿到了所有的验证码,我们对于验证码进行识别工作。

可以进行人工的肉眼识别,不过这样太过劳累,既然我们是python程序员,我们应该寻找一些偷懒的方法。(毕竟人生苦短)
阿里云市场的验证码识别接口
价格为:10元1000次

下载python版本sdk

# -*- coding: utf-8 -*-from com.aliyun.api.gateway.sdk.util import showapiimport jsonimport base64# png_name.txt内我们在上一步爬取时保存的是图片名fr = open('png_name.txt','r')for line in fr:    png_name = line.strip()    f=open(r'./captcha/%s.png'%(png_name),'rb')    b_64=base64.b64encode(f.read())    f.close()    #appcode 要改为自己购买后得到的appcode    req=showapi.ShowapiRequest( "http://ali-checkcode.showapi.com/checkcode","appcode" )    json_res= req.addTextPara("typeId","3000")\        .addTextPara("img_base64",b_64)\        .addTextPara("convert_to_jpg","1")\        .post()    print ('json_res data is:', json_res)    data =json.loads(json_res)    print data    jsonobj = json.loads(data)    print jsonobj['showapi_res_body']['Result']    #datalist.txt中存入了[图片名,识别到的验证码值]    fw = open('data_list.txt','a')    fw.write(str(png_name)+',')    fw.write(str(jsonobj['showapi_res_body']['Result'])+'\n')    fw.close()

经过对于api的请求我们可以得到一份验证码的字典文件。通过此文件可以通过key=验证码的文件id,得到验证码的真实值。

验证码字典表文件

此时我们似乎已经大功告成解决了验证码这一难题。

可是有一个悲伤的消息:云大urp的验证码过于复杂,api的识别率有限,我们还需要进一步提升该字典表的精度。下一篇我们介绍如何使用GUI小程序来进一步提高它的精准度,满足我们的要求。

转载地址:http://fjzxx.baihongyu.com/

你可能感兴趣的文章
NopCommerce架构分析之八------多语言
查看>>
转:Eclipse自动补全功能轻松设置
查看>>
ES6新特性:Javascript中的Reflect对象
查看>>
hibernate逆向工程生成的实体映射需要修改
查看>>
mysql update操作
查看>>
Robots.txt - 禁止爬虫(转)
查看>>
MySQL数据库
查看>>
项目分析_xxoo-master
查看>>
SQLServer2012自增列值跳跃的问题
查看>>
ViewBag对象的更改
查看>>
Mysql 监视工具
查看>>
hdu1025 Constructing Roads In JGShining's Kingdom(二分+dp)
查看>>
Android PullToRefreshListView和ViewPager的结合使用
查看>>
禅修笔记——硅谷最受欢迎的情商课
查看>>
struts2入门(搭建环境、配置、示例)
查看>>
Caused by: org.apache.ibatis.reflection.ReflectionException我碰到的情况,原因不唯一
查看>>
linux top命令查看内存及多核CPU的使用讲述【转】
查看>>
Linux下golang开发环境搭建
查看>>
jQuery操作input
查看>>
layer弹出信息框API
查看>>