Skip to content

IMYR666/rongan

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 

Repository files navigation

立项背景:

3月份报了驾校准备考驾照,由于是自主预约课时,所以有时会忘记,结果会导致自己想跟的教练的课程预约不到。而且到了科目三,就连排名最后的教练都会立刻预约爆满,在此背景下,想到了利用爬虫来帮助自己预约想要上的课时。项目主要涉及的技术点有:自动识别验证码,模拟登录,xpath分析抓取下来的页面。模拟登录前面之前项目已经总结过了,所以这里重点总计验证码的自动识别。

自动识别验证码

其实一开始没想做这么复杂,想着是自己用,只要手动输入验证码的方式可以 实现就够了。可是在编程的过程中,由于一直要调试,所以发现每次手动输入验证码的流程还是挺繁琐的,于是就干脆一不做二不休,做成自动化识别验证码。整个研究学习过程大概可以分为三大阶段:

1. 利用谷歌的tesseract图像识别库

这种方法在网上目前是主流且比较快捷的方法,因为Python有比较成熟的的第三发库pytesseract,只要再按装tesseract-ocr和pytesseract的相关依赖库就可以直接使用。主要流程有:下载,图片预处理(包括灰度处理,二值化等),识别。其中比较重要也是比较繁琐的就是图片预处理阶段。这个步骤主要目的就是将验证码中的噪点和干扰线去掉,而现在的验证码的噪点一般都比较复杂,这里使用的是Flood Fill算法去除,当然这里面借用了Python的科学计算库NumPy。但是最后的结果显示识别率不到5%。

2. 利用已有的机器学习库识别

由于第一种方法识别率太低了,实际使用的时候还是得手动输入,所以得继续探索还有那些可行的方案。由于之前在kaggle上面用KDTree算法做过一个识别手写数字的小项目, 所以自然联系到是否可以搬过来识别验证码,然后就准备按照以下步骤处理:
a. 图像灰度化
b. 图像二值化
c. 去噪
d. 图像分割
e. 归一化
f. 提取字符特征
g. 训练样本
h. 识别
当做到图像分割这一步的时候,偶然间发现了此网站的验证的一个特征,然后就产生了新的想法(如下)。鉴于方法3的识别率已经很高了,所以此方法目前还没有实现, 但是整体思路还是这样的,先列出来,以后有空可以试着继续做完。

3. 自己研究出来的方法

上面提到的特征是,此网站验证码的干扰线不是随机的,而是每个字符都配有一个固定的干扰线,且任意两个字符(包括对应的干扰线)不会有重叠部分。基于此特征,在将验证码二值化后,统计出每列有效像素点(值为1)的个数,这样就可以得到一个总的数字序列,然后提取出每个字符(10个数字和52个大小写字母)特有的数字序列用hash表存储。这样预处理之后,就可以将每张验证码当成一个父数字序列,而每个字符是一个子数字序列,只需寻找这个父数字序列中包含哪些字符子数字序列即可。
但在实际处理中,又遇到了新问题:虽然每个字符的干扰线是固定的,但实际上,不同验证中的相同字符,还是会有几个像素的不一样,这样如果直接使substring匹配,识别率也是很低的。改进的方法是使用LVS(最长公共子序列)算法代替,同时将数字序列再稍加处理,变成字符序列,即将每一个数字(这里是50以内)映射为一个唯一的字符。这样处理完之后,识别率直接可以达到97%,已经完全满足实际运行需求了。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages