反爬虫技术之验证码识别

反爬虫技术介绍

      • 一,使用js代码将变量用其他编码方式(ascii,utf-8)隐藏起来
      • 二、使用动态id修饰div或者input防止被定位。
      • 三,滑块验证码
          • - bilibili滑块验证码
          • - 腾讯验证码
          • - 顶象数据反爬虫

一,使用js代码将变量用其他编码方式(ascii,utf-8)隐藏起来

来源:https://www.nike.com/cn/launch/

js代码如下:反爬虫技术之验证码识别_第1张图片
这段js代码中bmak数据是关键数据,但是该对象下面的属性调用不是直接调用的,而是通过bmak[_ac[268]]这样的方式进行的。这样做的目的是防止爬虫直接看到数据赋值方式。
可以用python将数据替换,如下:
源代码:
反爬虫技术之验证码识别_第2张图片
替换后:

反爬虫技术之验证码识别_第3张图片
替换后就可以更换的阅读啦!

二、使用动态id修饰div或者input防止被定位。

反爬虫技术之验证码识别_第4张图片
反爬虫技术之验证码识别_第5张图片
对比上面两张图片,是同一个地方的网页源码。但是input的id确实不一样的。

解决办法

通过其他的方式定位比如xpath,class属性或者其他属性

三,滑块验证码

- bilibili滑块验证码

哔哩哔哩首页

反爬虫技术之验证码识别_第6张图片
解决办法

1.该图片被拆分为不同大小的小图片并乱序了,但是仔细观察后发现是按照固定顺序打乱的通过重新组合后就能拿到原图。
2.可以直接截图最方便快捷。
3.最稳妥最靠谱的是分析出js组合代码,自己执行后拿到原图。比较费时间。

识别

  1. 乱序图片的重组:
    重组其实就是通过观察将图片裁剪然后重新拼图,玩过拼图游戏的应该对这个比较熟悉,这个算是很简单的拼图游戏。拼好后大概会得到像下面这样的图片
    反爬虫技术之验证码识别_第7张图片
    但是仔细观察后就会发现问题,可能是哔哩哔哩的第二重防御(反爬虫策略)。不要觉得这样就大功告成了,如果直接拿这个图进行差异化查找肯定会出错,因为目标图的像素为260160的。但是得到的图片大小为312160。计算后大了52*160,继续下一步操作。

  2. 图片微修
    这一步就是重新将上面的图进行裁剪,裁剪为26个小图,但是每个小图中间要去掉2160个像素,两边各去掉1160个像素。然后重新拼接在一起,就得到了以下图啦:
    反爬虫技术之验证码识别_第8张图片
    这张图才是重组后真正的原图。然后再和缺失了滑块的图做对比。

  3. 对比出坐标
    重复1,2步骤得到缺失了滑块的图:
    反爬虫技术之验证码识别_第9张图片
    通过遍历将查找出不相同的像素点的位置。即是正确答案。

- 腾讯验证码

体验地址

腾讯滑块验证码,通过多张图仔细研究可以发现验证码的轮廓的位置是固定的偏白色的像素。或者在白色阈内可以通过查找到边缘线来确定滑块的位置。

反爬虫技术之验证码识别_第10张图片

反爬虫技术之验证码识别_第11张图片

可以遍历图片然后查找出角落的位置来得到答案。

反爬虫技术之验证码识别_第12张图片

观察发现该图片的大小固定,只有每条边的中间会突出去或凹进来,那么比较简单的方式是查找出两条竖着的白线然后确定出位置。

反爬虫技术之验证码识别_第13张图片

- 顶象数据反爬虫

chebada登陆

反爬虫技术之验证码识别_第14张图片
反爬虫技术之验证码识别_第15张图片
反爬虫技术之验证码识别_第16张图片
反爬虫技术之验证码识别_第17张图片

顶象的滑块有5大难点:

  • 图片背景素材相似度比较高,都是一些不易拼的图。
  • 滑块的干扰,他会在随机区域添加一个干扰项。让程序难以判断哪一个才是正确的。
  • 图形的不确定性,可以看出以上4幅图就有3种不同的滑块,增加了想要通过深度学习来识别的难度。
  • 原图的裁剪并乱序,这一点和哔哩哔哩类似。不过有点区别的是哔哩哔哩是一分为二后再裁剪出不同的小图,这里是一张图直接分为很多的小图。由于顶象的数据图素材都是一些相似度很高的图。增加来想要拼接的难度。而且就算拼接出来了,顶象数据并没有将未抠图的原图返回,也不好识别出正确答案。
  • 哔哩哔哩的滑块每幅图好像是固定的分割方式,只需要拼接完成一组图可以重复用在其他地方。但是顶象的每一幅图的分割方式并非固定,因此必须找出每次的分区重组的逻辑代码。

尝试破解

  • 一般加载图片的关键字有onload, canvas, drawImage,通过调试发现网站会加载顶象的3个js文件。分别是index.js, greenseer.js, basic-Captcha-js.js。如下:
    反爬虫技术之验证码识别_第18张图片
    搜索3个文件中的关键字发现basic-Captcha-js.js 文件中包含onload函数,使用格式化代码并调试后发现在
    4080行的onload比较可疑。

反爬虫技术之验证码识别_第19张图片
调试后找出可疑数组i 一共有32个不重复的乱序数字。很像是分解图片的正确顺序。
反爬虫技术之验证码识别_第20张图片
以上的数组i对应的图片为:
反爬虫技术之验证码识别_第21张图片
图片大小为(400, 200), 一共33块。前面每块大概12个像素,最后一张小图16个像素。从图上的大小来看比较符合,因为可以明显看出最后一张切图要大一些。

  • 尝试重组:通过python分割然后重组后发现居然成功了。如图:

反爬虫技术之验证码识别_第22张图片

  • 继续分析:通过追踪调试(就是往前查找数组i的来源)。发现i是通过函数xr计算出来的,参数就是图片的唯一标识“https://static.dingxiang-inc.com/picture/dx/dl6s0IeHOK/zib3/5c8dd7f2c5ca480782bfbdeb8d5f7425.webp” 对应这个图片那么就是"5c8dd7f2c5ca480782bfbdeb8d5f7425"这一串字符。最后调用的函数就是xr(“5c8dd7f2c5ca480782bfbdeb8d5f7425”)。

反爬虫技术之验证码识别_第23张图片

  • xr函数:
    反爬虫技术之验证码识别_第24张图片
  • 查找"Grd8"

反爬虫技术之验证码识别_第25张图片

  • python execJS库测试得到正确答案,到目前为止还只是攻破了顶象的第一道防线,只解决了5大难点的后面两道。
    反爬虫技术之验证码识别_第26张图片
    提交参数解惑

当尝试滑动滑块后会发现调用接口地址为"https://cap.dingxiang-inc.com/api/v1" 提交的参数如下图:
其中ac一看就是一个难点,ak,c,uid,jsv,sid,aid这几个参数在前面都能找到,暂时不看。x,y就是提交的滑块坐标。通过搜索sid发现还是在basic-Captcha-js.js文件中存在。

反爬虫技术之验证码识别_第27张图片

在该js文件中搜索sid发现了关键位置如下,查看1336行就是ac参数生成方式。

反爬虫技术之验证码识别_第28张图片

破解ac参数关键在于A函数,在webstorm里面通过Ctrl+B 搜索到A函数的定义如下:

反爬虫技术之验证码识别_第29张图片

你可能感兴趣的:(Python)