前言
相信大家在做爬虫或者自动化脚本时或多或少的都能遇到反爬机制(或者说反脚本机制),最常见的反脚本机制都是在登录时进行验证,据本人大量实战(帮粉丝写脚本)发现,基本上只要有点水平的网站都会有反脚本的机制,如果是大型网站那么他的反脚本机制将更加的强大和复杂。比如淘宝、12306这些,如果策略不够强大。那么在秒杀或者抢票时,正常的用户将毫无体验可言。本文将讲解如何突破一般的反爬机制。通过阅读本文,网络上80%的网站任你的脚本程序随意操作
反脚本机制
看得见的反脚本机制
1.低难度
图形验证码、有干扰线的图形验证码、计算图形验证码的结果、请求参数简单加密(每次加密结果相同)等。
2.中等难度
请求参数AES加密(每次加密结果不同)、boss的点击验证、拉勾的滑动验证、按顺序点击图片中的文字验证等。
3.高难度
百度的将图片旋转为正确角度验证、谷歌的点击存在某样东西的图片验证等。
看不见的反脚本机制
如果你觉得各大网站只用上面那些反脚本机制那你就太天真了。上面那些只是劝退一般的爬虫工程师,真正要拦住他们的还是这些。
1.比如一些秒杀商品,等到秒杀时间时才会生成该商品的参数,你不能提前得到该商品的参数就不能够狂刷数据包下单,时间一到等你获取这个参数的时间,正常用户已经秒杀完了,这就能达到反脚本的目的。
2.当你的访问速度过快或者脚本程序爬取数据的时候不像人类的行为,这时弹出一些验证方法或者给你返回错误或者无用的数据,甚至给出循环链接,让脚本程序进入死循环,从而达到反脚本的目的。
这只是列举一些常用的反脚本策略,实际上大型网站会比这些强得多
突破反脚本机制
1.低难度
1.对于简单的图形验证码,python的第三方库pytesseract就可以进行识别。
2.有干扰线的的网上也有对应的去除干扰线的算法,不过干扰线恶心一点的那些算法也不好使。
3.去除干扰线也没法识别的、需要计算图形验证码的。你可以将图片保存下来,手动输入通过验证。
4.对于请求参数简单加密的。直接抓包取出加密后的参数就可以了。
大部分网站都是没有反脚本机制,就算有,大部分也都是这种简单的。能突破这种低难度的,60%的网站你都可以用脚本程序去达到某种目的。
2.中难度
今天的重点:请求参数AES加密(每次加密结果不同)
该反脚本机制一般有以下特征:
1.输入框中输入相同的账号密码,但是每次发出去的请求参数都不一样。
2.除了我们输入的参数外,还会有一些不停变化的参数。
下面是某网站登录的请求参数,账号密码都是20001111。
第一次请求
第二次请求
当然,有一些简单一点的不是用AES加密,可能是随机生成的字符串加密等奇奇怪怪的算法。但是这都不影响,解决思路是一样的。
解决思路
解决这种反脚本策略需要一定的前端基础,该过程也被称之为前端逆向。
1.找到前端的加密算法
1.缩小范围
通过浏览器的调试器,查看前端代码,通过搜索关键字查找缩小范围。关键字一般就是加密、编码等词语的英文或者拼音,一般是英文,拼音还没遇到过。如encrypt、encode等。
2.通过调试或者理解代码逻辑找到算法
一般会存在这很多关键字,有些地方一看就不是加密算法,然后不确定的在浏览器打上断点,跑一遍,继续缩小范围。因为有些代码是其他功能的,并不会执行。这时候基本上就能找到了。如果代码执行了,你也不确定的地方有多个,那就只能仔细阅读他的源码判断是不是加密了。
这是加密算法的部分截图
2.写出相同的算法
通过理解他的算法后写出相同的算法
3.获取算法所需要的参数
还记得前面提到的一直变化的参数吗?在该网站中那个参数是lt。但是经过调试后发现并不是,而是另外的参数pwdDefaultEncryptSalt。
既然找到参数了,那把pwdDefaultEncryptSalt和lt的值拿到就可以了,lt用来发送,pwdDefaultEncryptSalt用来加密。
至此,脚本程序已经突破了反脚本策略,掌握以上的方法,80%的网站都不是问题
其他中难度和高难度
其他的我没动手实践过,但是应该是配合着selenium突破,因为这种他的请求参数往往很复杂,如果还坚持使用上一种方法那成本太高了。用selenium只需要模拟移动鼠标点击就可以了,滑动的就找缺口,然后模拟人类的行为进行滑动,滑动速度先快后慢。至于百度和谷歌那种太变态了,没思路。
结语
其实如果不是爬虫工程师的话能够突破低等和中等难度的已经够用了。对于低难度的可能我写的比较简单,但是有些基础的看了思路应该都能懂。对于中等难度的例子,说的也不是很详细。怎么说呢,个人经验吧,看到他我就想到这个机制可能是这样做的,然后就去验证自己的想法,然后就能突破他。毕竟你都知道他是怎么做的了,那基本也能知道怎么突破。可能我也是做开发的吧,换位思考一下如果是自己,自己怎么开发这个反脚本功能。就跟网络安全一样,如果你懂攻击那么自然懂怎么防御;你懂防御自然也懂怎么攻击,都是相通的。