python爬虫(下)--模拟登录与Captcha识别

本文介绍了Python模拟登录过程中遇到的验证码识别问题,探讨了验证码的演变和作用。重点讲解了针对英文字符+数字的验证码识别,通过图片预处理、OCR技术和改进型滴水算法进行字符分割和识别。实验结果显示,识别率有显著提升,但面对字符长度差异大和扭曲的情况仍存在局限性。后续计划讨论其他类型的验证码识别方法。
摘要由CSDN通过智能技术生成

前言

之前在 python爬虫(上)–请求——关于模拟浏览器方法,中我挖了一个坑,时隔一个多月,趁着最近有点空,我想是时候填填坑了,总结总结了,不然真的就忘了


验证码

虽然之前挖坑的那篇已经说了一些,现在还是稍微说一说.

在模拟登录中,其实让写爬虫的人疼头就是验证码,只要能破掉验证码,那么登录不是问题.

验证码(Chaptcha)内容从英文字符和数字识别,到数字加减乘除,再到汉字的出现,后面还有12306的看图识别,到现在的新型的基于人的行为的谷歌的reCaptcha,验证码也是经历了很长时间的演变。

对于很多人而言,对验证码的印象仅仅停留在网站登陆注册时候除了必要的用户名和密码以外还需要麻烦填的一个东西,而站在网站的角度,的确,验证码的应用对用户登陆没有什么作用,但是主要是防止机器人(包括爬虫)。服务器很怕大规模的请求,被百度或者谷歌这些大型搜索引擎收录当然是不错的,但是网上除了这两大搜索引擎以外还有许许多多爬虫,做的好的爬虫对服务器没有这么大的负担是极好的,关键是有很多其他的各种各样的爬虫,甚至会出现暴走的爬虫,这些爬虫都会对服务器造成很大的负担,而且并不会给网站带来受益.

不过讲真,验证码其实更重要的作用,并不是反爬虫的存在,尽管反爬虫场景中会经常见到验证码,但是Captcha应该属于人工智能范畴,是一种区别人和机器的存在,而由于这是计算机考察人类,所以有时候被称为’反向图灵测试’

对付验证码如果还是在cookie时代做用户登陆验证来说,分析验证码只要研究怎么从网页交互中找到从服务器发到终端的验证码字符串生成方式然后直接把这串字符串组合再发往服务器就可以了,没有必要对生成的验证码图片进行处理和识别,但是后面变成了Session 验证,所有的验证过程都发生在服务器,在终端只能拿到验证码图片,而没有验证码的字符串的存在,所以验证码图片的识别是避不开的坎,因为我们除非黑掉服务器,否则我们能利用的就只有验证码的图片了.

至于爬虫怎么拿到验证码图片,模拟浏览器的办法就是,selenium的截图功能,可以这么写:

    browser.save_screenshot('整个页面截图.png')
    element=browser.find_element_by_xpath('你的验证码的Xpath')
    #location办法可能会有偏移,但是每次都会锁定了了验证码的位置,所以稍微修正一下location的定位,后面都管用
    left   = element.location['x']#验证码图片左上角横坐标
    top    = element.location['y']#验证码图片左上角纵坐标
    right  = left + element.size['width']#验证码图片右下角横坐标
    bottom = top + element.size['height']#验证码图片右下角纵坐标

    #rangle=(806,382,913,415)#手工方法有时候可以,但是有时候也会出现第一次可以,但是后面各种偏移定位不准的奇葩现象
    im=Image.open('整个页面截图.png')
    im_crop=im.crop((left,top,right,bottom))#这个im_crop就是从整个页面截图中再截出来的验证码的图片

怎么分析交互过程来获得此时登陆所需要的那张二维码图片,我还没有实验过,你可以试试,有点麻烦就是了,所以请容许我在这里再留个坑

既然拿到了验证码,那么接下来我要做的就是一些识别验证码的实验,友情提醒本文不涉及打码平台的操作,因为我觉得打码平台不是技术,而是商业行为,对商业我不太感冒,所以本文仅仅谈论解决问题的计算机的方法,所以想要借道打码平台来迅速花钱解决问题,请绕道谷歌/百度,或者参考“打码平台”那点事儿,我觉得写的挺全面的,挖坑的上一篇应该也提到了这篇文章

<1>英文字符+数字

先举个栗子:这里写图片描述
对于这种我们采用的是图片预处理和OCR识别技术

预处理:因为验证码的图片经常会有噪点,干扰线(像上面这种),还有最麻烦的字符本身的扭曲/拉伸/旋转等变形和字符之间的粘连和重叠等,这里我们可以用python自家的PIL做简单的处理,如果再高级的就是OpenCV,本来有打算要不要使用OpenCV的,不过最后PIL就搞定了,没用到OpenCV.

OCR识别:可以用自己建立特征库的办法,或者是机器学习(神经网络)的办法,既然已经有现成的开源OCR工具==>TesseractOCR :D

①首先我们先做了灰度化和二值化

im_grey=im.convert('L')#灰度化
im_peak=im_grey.convert('1')#二值化

灰度化以后长这样:这里写图片描述
二值化以后长这样:这里写图片描述

②可以看到二值化后的图片,出现和很多原图和灰度化后所看不见的离散黑点,这些黑点都可以用中值滤波器滤除,一遍的效果不好,就循环几遍就好了,而令我惊奇的是,干扰线也变成了离散的点.
那么二话不说先做它个10+次中值滤波:

from PIL import ImageFilter,ImageEnhance

im_filter=im_peak.filter(ImageFilter.MedianFilter)
for j in range(15):
    im_filter=im_filter.filter(ImageFilter.MedianFilter)

横向对比滤波次数效果:
1次:这里写图片描述
=====>1次的话还是有一点在字符的周围
2次:这里写图片描述
=====>2次的话比上一次的干净很多
3次:这里写图片描述
=====>3次的话基本上就很干净了
….
15次:这里写图片描述
为什么需要10+次,因为我们测试了很多情况,发现有些情况必须10+次才获得比较干净的图

不知道你们有没有发现,随着我中值滤波去掉离散的噪点,干扰线也一并去掉了,这也是我当时最惊喜的地方

③然后丢给了TesseractOCR做识别,一开始我是用Kali源里面的Tesseract直接用apt-get直接装的,不过后面会发现出现一些奇奇怪怪的问题,所以还是推荐用github里面Tesseract项目的源码安装比较好,而且源码安装后不要把源码安装包给删除了,因为源码安装目录内一般安装成功后都会生成一个卸载的脚本,万一遇到Tesseract出问题需要卸载重装的情况(尽管这种情况在源码安装的情况下发生不多,但还是有可能有发生,(我就遇到一次在用unicharset_extractor这一Tesseract训练工具之一生成.tr文件的时候,死活生成的是.txt不是.tr的文件),虽然说自己慢慢找到来删除是可以,可是这样并不干净,而且非常劳累,所以还是别在装软件上折腾太多时间,这并不是我们的关注点.

这里提一句TesseractOCR的源码安装:
TesseractOCR的github项目地址在这里,其实它的安装就是平时安装源码的那一套,不过首先你得先源码安装好Leptonica,因为Tesseract是依赖于这个库的,Leptonica的官网在这里,解压并进入Leptonica源码目录,./configure==>make==>sudo make install==>make check,就安装完毕,然后配置好环境变量[我这里以linux为例子,修改~/.bashrc或者/etc/environment,增加$PATH环境变量内容/usr/local/lib/(不然Tesseract编译的时候就找不到Leptonica了)],接下来请按照TesseractOCR官方源码安装教程安装,链接点这里,这个页面还包含Tesseract训练工具的安装,这个训练工具是为了方便我们可以用足够多的样本形成一个针对性的专用训练集(fonttype.traineddata)存在的,这个训练集是提高识别率重要的一环,安装方法也是依照刚才的官方教程就好了,顺便提一句,我墙裂推荐调整box的工具用jTessBoxEditor,图形化界面,而且启动方便简单,我现在总算是看破了,要集中注意力在你想要实现的东西上,而不要被其他事情分散注意力,尽管它们都是一些很有趣的事情
最后安装完Tesseract以后,别忘记新建一个环境变量$TESSDATA_PREFIX=/usr/local/share/tessdata/或者其他Tesseract放置语言包的地方,然后把你训练好的训练集(fonttype.traineddata)放进这个目录,其实Tesseract也有自己的已经做好的语言训练集(Language Data),你可以到这里下载全部语言的.traineddata,不过这个包不

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值