[整理] Python 爬虫四种验证码的解决思路

1. 输入式验证码

这种验证码主要是通过用户输入图片中的字母、数字、汉字等进行验证。如下图

图1 图2

解决思路:这种是最简单的一种,只要识别出里面的内容,然后填入到输入框中即可。
这种识别技术叫OCR,这里我们推荐使用Python的第三方库,tesserocr。对于没有什么背影影响的验证码如图2,直接通过这个库来识别就可以。但是对于有嘈杂的背景的验证码这种,直接识别识别率会很低,遇到这种我们就得需要先处理一下图片,先对图片进行灰度化,然后再进行二值化,再去识别,这样识别率会大大提高。

2. 滑动式验证码

这种是将备选碎片直线滑动到正确的位置,如下图

解决思路:对于这种验证码就比较复杂一点,但也是有相应的办法。我们直接想到的就是模拟人去拖动验证码的行为,点击按钮,然后看到了缺口的位置,最后把拼图拖到缺口位置处完成验证。

第一步:点击按钮。然后我们发现,在你没有点击按钮的时候那个缺口和拼图是没有出现的,点击后才出现,这为我们找到缺口的位置提供了灵感。

第二步:拖到缺口位置。我们知道拼图应该拖到缺口处,但是这个距离如果用数值来表示?通过我们第一步观察到的现象,我们可以找到缺口的位置。这里我们可以比较两张图的像素,设置一个基准值,如果某个位置的差值超过了基准值,那我们就找到了这两张图片不一样的位置,当然我们是从那块拼图的右侧开始并且从左到右,找到第一个不一样的位置时就结束,这是的位置应该是缺口的left,所以我们使用selenium拖到这个位置即可。这里还有个疑问就是如何能自动的保存这两张图?这里我们可以先找到这个标签,然后获取它的location和size,然后 top,bottom,left,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width'] ,然后截图,最后抠图填入这四个位置就行。具体的使用可以查看selenium文档,点击按钮前抠张图,点击后再抠张图。最后拖动的时候要需要模拟人的行为,先加速然后减速。因为这种验证码有行为特征检测,人是不可能做到一直匀速的,否则它就判定为是机器在拖动,这样就无法通过验证了。

3.点击式的 图文验证 和 图标选择

  • 图文验证:通过文字提醒用户点击图中相同字的位置进行验证。
  • 图标选择: 给出一组图片,按要求点击其中一张或者多张。借用万物识别的难度阻挡机器。

这两种原理相似,只不过是一个是给出文字,点击图片中的文字,一个是给出图片,点出内容相同的图片。

这两种没有特别好的方法,只能借助第三方识别接口来识别出相同的内容,推荐一个超级鹰,把验证码发过去,会返回相应的点击坐标。

然后再使用selenium模拟点击即可。具体怎么获取图片和上面方法一样。

4.宫格验证码

这种就很棘手,每一次出现的都不一样,但是也会出现一样的。而且拖动顺序都不一样。

但是我们发现不一样的验证码个数是有限的,这里采用模版匹配的方法。我觉得就好像暴力枚举,把所有出现的验证码保存下来,然后挑出不一样的验证码,按照拖动顺序命名,我们从左到右上下到下,设为1,2,3,4。上图的滑动顺序为4,3,2,1所以我们命名4_3_2_1.png,这里得手动搞。当验证码出现的时候,用我们保存的图片一一枚举,与出现这种比较像素,方法见上面。如果匹配上了,拖动顺序就为4,3,2,1。然后使用selenium模拟即可。

5. 常见识别验证码的技术有哪些?

5.1 Tesseract-OCR

这个只能识别简单的验证码,也就是要求数字和字母必须规则,弯曲变形,遇到不规则的验证码,识别率并不是很高,不过可以自己去训练模型。

5.2 人工打码

这个需要花费一定的费用,但是识别率还是很高的,有很多打码平台,识别一个验证码的代价仅仅是0.01分钱,如果要爬取的网站很多的时候,遇到验证码又是各不相同,最好的方式是去花费一些金钱来做这件事情。为什么呢?因为随便照片一个爬虫工程师的工资都是15k左右吧,按照一天的工资计算800元计算。识别一个验证码按照一分钱计算。程序员一天的工资可以识别8万个验证码,所以人工打码是最好的选择。一个企业的能否生存下去,并不是因为技术的好才存活下去的。而是需要各种环境,机遇。一些大的公司也会借用小的公司的技术,比如支付宝人脸识别是自己开发的吗?所以,合理的借力也是成功的必要条件。

5.3 机器学习

使用机器学习去识别验证码,识别率比人的都高,缺点是需要大量的训练数据,这些数据小手工标记。开发周期长,耗时。

5.4 绕过验证码

为何这个在最后说呢?因为我觉得这个更重要,我在爬虫的时候遇到各种需要登录网址,也有验证码。就会手工的吧cookie信息复制下来,加到请求头上就可以了。如此简单的技术,我们为何不用呢??

5.5 万能识别库

这个在网上还是可以找到,别人已经训练好了。

5.6 软件定制

在淘宝上或者一些验证码识别群,有一些人专门从事验证码的识别工作,收费费用合理,大概100--1000元钱,普通的验证码也就两三百块钱。也可以去找他们学习这项技术,并且也不难

5.7 ADSL动态IP服务器原理

ADSL动态IP服务器,并不是什么高大上的方式,也不是什么特别高端的服务器,相反,使用起来,我们一般是用配置非常低的那一类,因为这个时候重要的是数量而不是质量。

原理很简单,在家庭网络中宽带上网只要断开再拨号一次,链接成功就会更换一次外网ip。并且链接建立后网速比较稳定。这就是动态ip了,一般这个ip池很大,一个城市一般会有5W-30W的ip。基本属于用不完。so,只要有一台接入了宽带的电脑,都可以叫做ADSL动态IP服务器。但是,你要明白这样以来时间将会有部分消耗在网络建立的时间上大约十秒。

例如某项目,页面每两次访问就会被强制跳转到验证码页面,so,为了跳过验证码就得每两次访问就换一次ip。而且,最严重的就是要是面对这样高限制ip的,那么就不能在一台机器上通过多开爬虫客户端从而实现单机器的分布式爬虫。效率低很多。要想提高效率要么是ip限制次数比较高的。比如1000/ip这种;要么就是多机器每机器单个爬虫的分布式了。

posted @ 2020-12-01 11:53  哆啦梦乐园  阅读(1944)  评论(0编辑  收藏  举报