python+Selenium之自动滑块破解滑块验证码

Python052

python+Selenium之自动滑块破解滑块验证码,第1张

头大系列:以虎嗅网注册页面的滑块验证码为例:

打开浏览器调试工具,点击左上角按钮进行页面元素跟踪,然后将鼠标移动到滑块验证码的图像上,就发现问题了,这也是关键所在:

验证码的图像是由很多个这样的10x58(宽10高58)的小方块拼接而成的。再检查一下元素标签,发现每一个小方块的元素标签里面都有background-image:url以及background-position这两个关键的信息。

既然是url,就不妨打开链接来观察。发现打开的链接是一张图片,但却是一张乱七八糟的图片。

得到这张乱七八糟的图片,第一感觉是重影。试猜想,会不会将每一个小方块的url链接图片都重叠在一起或拼接在一起就能组成我们所看到的验证码图片。

但经打开每一张图片发现,每个小方块后面的url链接的图片是一样的。

这就说明不可能是将图片进行重叠或拼接了。那就有可能是另外一种可能:将这张完整的验证码图片的部分区域切割然后打乱排序,形成一张新的图片,而这张新的图片就是我们现在所看到的乱七八糟的图片。

再观察发现,每个小方块后面还有background-position这个重要的信息。发现里面正是-157px -58px-145px -58px这种形式,是不是很像坐标的形式了。而进一步猜想,将我们刚刚的乱七八糟的图按每一个小方块的坐标进行切割,然后再进行排序,是不是就能得到原来完整的验证码图片了。

进行实践:

运用PIL模块的切割crop()以及粘贴paste(),重新将图片进行整合。效果神奇出现:

先不管其他了的。先把两张完整的图片拼接出来再进行下一步吧。

按照相同的方法,找到页面元素中鼠标点击后的出现缺口的验证码图片位置,找到缺口图片乱七八糟的url链接。

通过相同方法拼接:

已经得到两张关键的验证码图片,那接下来就是PIL大显身手的时候了,对比两张图片的像素点,缺口位置明显黑了一块,也就是RGB三色必然与周围的像素RGB三色差别明显。

将两张图片的每个像素点进行遍历对比,RGB三色任意一色差距大于一定的范围即视为是滑块的缺口。

找到缺口之后返回遍历的像素点的x坐标值(因为滑块只能X轴左右移动,所以y轴可以不需要用到),而x坐标就是滑块需要移动的距离。

完美拼接。但被吃了,也是美中不足:

快速,匀速,准确,所谓的“快,准,稳”,一样不差。

那就认定你是机器人来滑动的吧,把你吃掉!

方法1:找个验证码识别程序,自动识别

方法2:自己用PIL写一个

方法3:让用户手工输入验证码。这个比较简单

方法4:让后台程序开一个后门,让你绕过验证码

方法5:直接使用cookie,这样就不用登陆了

python抓取网页时是如何处理验证码的?下面给大家介绍几种方法:

1、输入式验证码

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

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

相关推荐:《Python入门教程》

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模拟即可。