在这个人均python时代,产品运营同学也能分分钟写出一个爬虫来产出数据报表,我这段时间也是想要写一个爬虫来刷一刷我发的帖子的点击率,从而开始调查起了爬虫,又调查起了反爬,又看起了反反爬……现在已经被精神招安了!今天就和大家一起讨论一下螺旋上升,永无止尽的反爬道路。
首先,我们能用爬虫做到哪些事情呢?根据调查大头一定是抢火车票(12306是全国最难爬的网站),还有像是预定场地、操纵僵尸粉、比价、刷点击率、分析用户数据达到个人目的等。
其实一般的公司可能根本没有采用反爬措施,还有一些网站可能只对数字做了字体映射,并不会更换字体文件或算法,但我们这篇文章的前提是保护有价值的数据,所以要尽可能的增加黑客们爬数据的成本,另一方面也是降低服务器的压力。
我们把爬数据分为最主要的两种途径,爬接口和爬页面(SSR)。
爬接口的话一般采用网络封包截取工具来拦截请求,代码模仿请求来进行大批量的数据获取。而爬页面则会使用Selenium或者puppeteer来模仿人类行为获得网页,从中摘取特定的信息。对于爬页面目前还会有元素匹配和OCR识别两种主流的内容匹配方式。元素匹配是根据HTML或者页面上的元素信息通过元素选择器,如正则、xpath等进行选择并匹配;而OCR识别则是将网页当做图片进行文本识别,并根据文本的展示特征,如颜色、尺寸、位置等进行匹配。
这两种途径会有一些共通的防范措施:
首先最基础的是校验user-agent、referer等请求头。虽然绝大部分成熟的爬虫会对这些header进行处理,但是这也是必须要去做的,同时也帮助我们的网站实现防盗链等其他安全目标。
是用户信息相关
在某个cookie/canvas指纹/ip发出大量不合理的请求次数后采用封禁
无论是接口反爬还是SSR反爬,都需要对数字和一些常用字进行映射加密,增加破解成本,主要的方式有:
如果是表单类
如果已经有标记为攻击者的网站请求数据,可以进行投毒处理,故意返回错误的数据误导攻击者。
接下来是一些详例:
接口反爬
让我们先看一个反爬的例子~
拦截了一个生活网站数据的请求,可以看到header中有一个x-sign
如果我们手动改变了参数,会提示不接受请求,因为服务端计算的sign值和前端提交的不同。
这种方式叫做验签,如果前端使用了验签进行参数加密,那黑客需要去代码中查看混淆后的加密逻辑,如果定期更换加密方式,也可以增加黑客的心智成本。
除了接口验签以外,加密也是一个非常常用的反爬手段,下面是一个知名旅行预订网站的例子:
对应的接口返回如下:
可以看到,接口中价格数据与实际在屏幕上看到的数据并不相同,这里就是接口上对数据进行了加密,并且每次接口请求采用的加密算法都会有所调整,通过t1000字段将解码的所需的信息提供给前端展示时使用。同时,界面在展示的时候还进行了混淆,通过定位的方式将真实的价格中每个数字调整了位置和顺序。然而,标签中的title信息反而成了反爬中的漏洞,将价格直接标注了出来,这也是我们在反爬的实践中需要注意的点——任何漏洞都会成为黑客利用的目标。
SSR反爬
老样子,先看一个