当前位置: 首页 > 后端技术 > Python

蟒盘纪念币系列二:身份验证码01

时间:2023-03-26 16:54:53 Python

上次因为泰山币的预约时间已经过去,最近没有发行其他纪念币,所以我的预约界面不是我们想要的。而今天,巧妙地找到了预约界面,虽然是阉割版。预约界面像这样打开预约界面(可以在公众号后台发送“预约网址”获取网址):可以看到需要的信息包括:姓名,证件类型(默认为身份证),证件号码,手机号,图形验证码,短信验证码兑换网点(阉割,不能选择)预约次数(直接阉割到不显示)预约日期(不能输入)为了实现自动化,我们一般会保存固定信息如姓名、身份证号、手机号等预先在配置文件中,使用程序自动读取,后面实战中会详细讲到。不过对于短信验证码目前还没有很好的解决方案,不过本文的主要内容不在这里,这里不再赘述。接下来我们来看看本文的重点——图形验证码。如果等到预约的时候,一个一个的去核对,手动填写,如果遇到一个火爆的,很可能是刚填完名额,就没有了。这里我们打算利用深度学习利用神经网络来帮助我们解决这个问题(其实OCR也会是一个很好的方式,因为这个验证码并不复杂,至少比12306验证码简单很多)。既然我们决定使用深度学习来分析数据源,那么首先要做的就是收集足够的数据。毕竟,神经网络是从大量数据中学习的。说到数据,就要用到写爬虫的技巧了。首先我们看一下这张图片的验证码是如何生成的:在浏览器中按F12选择小箭头,找到验证码的位置。点击观察源码窗口,可以看到对应的代码块中有一个src属性。熟悉HTML的人都知道,验证码是从这里出来的,所以我们复制过来,如下图https://eapply.abchina.com/coin/Helper/ValidCode.ashx?0.5805915363836303打开隐身标签即可查看这个验证码是否需要cookies才能显示:从结果可以看到在隐身窗口下还是可以打开的。但是现在只有一张图片,不知这个链接是不是永久链接?刷新一下:验证码变了!经过上面的过程,我们发现图片验证码是由一个固定的连接生成的,这个连接会动态的向前台返回不同的验证码。完美,这样我们的数据源就不用担心了。收集资料这里的图片验证码其实就是一张图片。本质上,我们其实是想抓取网页图片。本文只写关键步骤。详细具体的操作方法可以参考之前一篇关于爬取网页图片的文章公众号,链接在这里。我会使用requests库来爬取图片,然后以二进制方式写入本地文件:data=requests.get(image_url).contentwithopen('./{}.jpg'.format(image_index),'wb')asf:f.write(data)至此,我们已经可以将图片验证码保存到自己的机器上了。那么一个新的问题出现了,我们需要多少张图片?如果图太少,模型将不是最优的;如果图表太多,训练将花费太多时间。考虑到这个验证码的复杂度不高,其他10个数字加上26个英文字母一共构成了36个类别,每个类别由100张训练图片计算,需要3600个字母或数字。因为一个验证码有4个字母或数字,所以一共需要800张验证码图片。另外需要注意的是,模型训练好后,需要数据进行测试,所以测试用的验证码图片要提前预留,算作200张图片,所以最后我们需要收集1000张图片验证码。通过上面的核心代码,我很快就得到了这1000张图片的验证码:看到这么多验证码,我已经想买了,但是已经来不及了,具体处理留待下一期。本系列所有源码都会放在这个github仓库,有需要的可以参考,有问题请指正,谢谢!下一期预告:验证码图片预处理第一期:Python盘纪念币系列之一:简介