首先存在大量爬虫的现状
真实世界的爬虫比例
大家应该听过一句话吧,大概意思是说,整个互联网上大概有 50%以上的流量其实是爬虫。
举个例子,某公司,某个页面的接口,每分钟访问量是 1.2 万左右。这里面有多少是正常用户呢?
50%?60%?还是?
正确答案是:500 以下。
也就是说,一个单独的页面,12000 的访问量里,有 500 是正常用户,其余是爬虫。
举例:
举个例子,这个世界存在 3 家公司,售卖相同的电商产品。三家公司的名字分别是 A,B,C。
这个时候,客户去 A 公司查询了下某商品的价格,看了下发现价格不好。于是他不打算买了。他对整个行业的订单贡献为 0。
然而 A 公司的后台会检测到,我们有个客户流失了,原因是他来查询了一个商品,这个商品我们的价格不好。没关系,去爬爬别人试试。
于是他分别爬取了 B 公司和 C 公司。
B 公司的后台检测到有人来查询价格,但是呢,最终没有下单。他会认为,嗯,我们流失了一个客户。怎么办呢?
可以爬爬看,别人什么价格。于是他爬取了 A 和 C。
C 公司的后台检测到有人来查询价格……
过了一段时间,三家公司的服务器分别报警,访问量过高
反爬的意义
1.降低服务器压力--因为有各种情况的爬虫存在
1.1因为存在十分低级的应届毕业生,需要数据,所以会有很多低级爬虫
1.2十分低级的创业小公司,想做大数据可是手头没有数据,于是会有爬虫
1.3不小心写错了没人去停止的失控小爬虫
携程上的点评有的时候可能高达60%的访问量是爬虫。我们已经选择直接封锁了,它们依然孜孜不倦地爬取。
1.4成型的商业对手
1.5抽风的搜索引擎
大家不要以为搜索引擎都是好人,他们也有抽风的时候,而且一抽风就会导致服务器性能下降,请求量跟网络攻击没什么区别。
2.保证数据安全性
2.1携程酒店价格,机票价格等
2.2淘宝京东价格--比价网
2.3领英数据
2.4法院判决书--抄底接盘破产
2.5历年高考各院校分数线(智能推荐)
常见反爬的思路和手段还有各自的优缺点(举例)
爬虫判定和处理:
1.基于用户行为
1.1 .1固定的IP或者账号访问频率
超过正常阈值(一般阈值会设置为一分钟不超过多少次)会弹出验证码,或者对ip进行短时间封禁,长时间封禁和永久封禁,但是这种歌方式会有几率误伤用户,所以在验证码方式上是一个比较常见的处理方式,这样爬虫也会相应的降低访问频率而达到对服务器压力的减轻
优点:有效降低服务器压力,增加爬虫调取验证码破解的成本(打码平台和付费代理IP)
缺点:无法保证数据不被爬取(爬虫增加成本后),并且验证码如果过于频繁弹出影响用户体验
使用推荐:可以使用,成本较低,较有效的降低服务器压力(链家安居客等网站和APP在使用这种方式)
1.1.2访问总数和时段
当用户每天进行访问的次数超过一般认定为正常人(一天24小时,并且总数超过自定义的阈值,可以被判定为疑似爬虫)
一般这样的会对ip或者对应账号进行处理
优点:基本封禁掉的都是实的锤爬虫程序,降低服务器压力
缺点:爬虫作出模拟正常用户动作后就无效了(比如设置时段访问,设置随机时间,模拟正常用户)
1.1.3 只下载网页,没有后续的js、CSS请求 ,大量重复简单的网站浏览行为 (绝大多数情况,只有机器人才会做深翻页
这样的行为本身就说明了不正常,基本不会是正常用户,对这样的ip、账号、设备号可以直接封掉
优点:基本封禁掉的都是实的锤爬虫程序,降低服务器压力
缺点:爬虫作出模拟正常用户动作后就无效了(比如使用自动化工具设置上下滑动停留时间,点击等,模拟正常用户)
使用推荐:不推荐,因为需要增加用户行为监控分析,性价比较低
1.1.4通过一些陷阱来发现爬虫,例如一些通过CSS对用户影藏的链接,只有爬虫才会访问
使用推荐:不推荐,因为只对于通用爬虫有效,对于我们app来说专门的爬虫很难掉入陷阱
2.基于用户特征
2.1.1通过请求头识别
headers,是否携带UA,referer(没有这部分信息的就是爬虫无疑了,很多图片网站的防盗链就是检测referer是否为本站点)
cookie(有些app或者网站的信息需要登陆后才能拿到,因为cookie会过期,所以不携带的会被识别为爬虫)
优点:非常有效的进行爬虫识别,不会误伤用户
缺点:爬虫如果使用了随机的UA选择维护大量账号的cookie池,携带了必要的referer后就会伪装过去
使用推荐:可以使用,成本较低,但是对伪装后的爬虫效果不强
反爬的方式
1.加密参数
很多APP和网站都会使用这种方式,比如抖音美拍等会在视频真实地址中进行加密,最右皮皮搞笑会对所有内容的刷新检测一个sign值,这种方法都是会使用JS对参数进行加密解密处理,返回出来的有价值的数据地址不会让你直接请求到,所以对大量爬虫是一个非常有效的反爬方式(举例,网站中美拍的video参数如何生成的真实地址,百度翻译的sign)
例子一:美拍视频video参数的JS加密
抓包发现的接口,返回的数据里面并没有真实的视频地址
找到JS也需要从这六千多行的代码中找出你需要的部分,然而读别人的代码是痛苦且耗时的,尤其是对于并不精通前端JS的爬虫工程师而言
例子二:百度翻译sign的JS加密
此处的sign如果不能破解就无法获取翻译功能
优点:能阻断大量的爬虫,破解难度较大(需要花费爬虫大量时间去读你的加密代码)
缺点:无法完全阻止所有爬虫
第一种破解方式就是进行JS逆向破解,只要有耐心和一定的JS水平,就能解开加密方式。
第二种是使用自动化工具(mitmdump+APPNUM或者按键精灵)监控接口,也能拿到数据
使用推荐:推荐使用,需要定期或不定期更换加密方式,因为看别人代码总比自己写要难(中国法院判决书网站就是这种做法,定期更新加密方式,很有效)
2.css混淆
2.1 FONT-FACE拼凑式
例子:猫眼电影
猫眼电影里,对于票房数据,展示的并不是纯粹的数字。
页面使用了font-face定义了字符集,并通过unicode去映射展示。也就是说,除去图像识别,必须同时爬取字符集,才能识别出数字。
通过检查元素这个6267数值根本就没有写在span标签中,并且,每次刷新页面,字符集的url都是有变化的,无疑更大难度地增加了爬取成本。
2.2 BACKGROUND拼凑式
与font的策略类似,美团里用到的是background拼凑。数字其实是图片,根据不同的background偏移,显示出不同的字符,也就是平时我们说的雪碧切法
并且不同页面,图片的字符排序也是有区别的。不过理论上只需生成0-9与小数点,获取到它的字符图片就能自己根据偏移量进行映射对应的数值,如下图:
2.3 伪元素隐藏式 例子:汽车之家
汽车之家里,把关键的厂商信息,做到了伪元素的content里。
这也是一种思路:爬取网页,必须得解析css,需要拿到伪元素的content,这就提升了爬虫的难度。
2.4 元素定位覆盖式 去哪儿网
对于一个4位数字的机票价格,先用四个i标签渲染,再用两个b标签去绝对定位偏移量,覆盖故意展示错误的i标签,最后在视觉上形成正确的价格…
这样其实如果不注意,多半就是拿到来错误数据(数据分析中错误数据比没有数据更可怕)
2.5 字符集替换式 去哪儿网APP
移动版的去哪儿网直接把字符集替换来,所以必须根据它最新的字符集去映射你在页面中所见到的数据
html里明明写的3211,视觉上展示的却是1233。原来他们重新定义了字符集,3与1的顺序刚好调换得来的结果
使用推荐:不推荐,不适合我们的产品(我们页面中没有敏感的关键数据,比如酒店机票价格等)
3.脏数据(蜜罐)
这种反爬方式在淘宝和京东中有使用,因为本人没有大规模抓取过他们的敏感数据,所以这种方式也是听业内面对过这种情况的大佬所提过,具体的思路是在判定你是爬虫后不对你进行封禁或者别的处理(此时爬虫也拿到了数据),只是在判定为爬虫后给你返回假的数据(也就是脏数据,错误的价格错误的数量等)
这种方式强就强在你根本不知道他们是如何把你识别判定为爬虫的,因为数据量巨大也不可能人工去识别(那样就本末倒置了)从而让你根本不敢去使用这些数据,心里完全没底。
使用推荐:不推荐,因为我们公司展现的数据为新闻或者视频,无法有效利用这种手段
我们公司产品的爬虫方式(哪几种方式获得新闻数据)
1.通过root后等手机修改自己的上网状态(使用4g)成功抓包后找到接口
图示1为访问接口代码部分(只携带了一个必须的请求头参数)
图示2为返回的数据
格式化数据后:
其中可以看出来dataId就是关键参数,这时我们通过微信分享文章的功能,直接就能获得一篇新闻的url:https://h5.makezixun.com/news/article/0/CF816CCF816C6DE2B36060B1D0A5320A2548005B644CF6?from=app
此时替换掉中间的CF816****F6为之前的dataId就可以访问到这篇新闻了,我们的新闻也就这样会被爬到
2 e都市门户
通过观察我们的网站中所有数据直接通过访问首页就写在了response里面(新闻详情页)
并且新闻详情页里面的新闻数据也是这样直接写在了返回的html页面中(也就是说新闻数据是没有任何保护的)
推荐我们APP的反爬具体措施
1.从前端
使用业内比较常见的id加密,通过js返回真实地址(需要反编译??)
2.从后端
通过异常行为进行判断,然后进行固定时限封禁ip或者账号设备号(有余力可以这样操作)
结语:因为所见即所得,为了真实用户,所以爬虫是不能完全禁止的,只有增加抓取成本,让他们在成本考虑下失去对你的兴趣(因为大量的新手练手或者为了证明自己技术比你牛逼,再就是为了数据的价值)所以当你增加一定的反爬成本(可承受的开发时间,软硬件压力--稳定性在于增加逻辑后需要验证,验证码需要多次调用)是可以达到一定的反爬目的(是从服务器压力考虑还是数据安全性考虑来选取对应方法)
另外我们的app其实在抓包上,也就是第一步就比较有难度,已经可以阻挡大部分水平一般的爬虫了