1.君子协议robots.txt
2. IP层
IP报文带有的最重要的信息就是IP请求的来源地址, 来源地址极难(TCP不可能,UDP可以)伪造的特性, 使得这个字段成为反爬虫策略中最重要的字段。 封杀IP/IP段是网站可以执行的最严厉的惩罚。由于国内的ISP大量的使用了NAT技术,导致大量用户共用IP的情况越来越多, 内容提供方在做IP封杀时会越来越谨慎, 因为这样做会导致极高的误杀率,以至影响正常用户的网站访问。如果使用4G,共用同一个IP的用户会更多。 但是即使如此, 源IP也是反爬虫策略中最为核心的数据,反爬策略的执行动作一般都要围绕源IP进行。
3. HTTP层
X-Forwarded-For
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在HTTP头字段标准化草案中正式提出。XFF头由普通HTTP代理服务器添加, 在用户通过普通HTTP代理访问网站时, 用户的IP地址会被添加到这个头中。后端开发人员往往会把这个的IP地址当做用户的真实IP地址使用,很容易被爬虫利用。
Referer
Referer是浏览器在页面跳转时带入的HTTP头,指示用户上一个页面的URL, 一般来说,网站90%以上的流量应该带有Referer头, 在一些常见的反爬策略中, 大量的不带Referer头的源IP请求会触发"要求输入验证码"策略。
User-Agent
4. 应用层/浏览器层
账户访问限制
验证码
JS渲染(Ajax / SPASingle Page Application)
只需一点点的前端逆向能力,就可以找到ajax接口,直接调接口即可。(这种反爬是针对技术栈较老的后端渲染网站而言的一种反爬。)
IFRAME异步加载式
网易云音乐
网易云音乐页面一打开,html源码里几乎只有一个iframe,并且它的src是空白的:about:blank。接着js开始运行,把整个页面的框架异步塞到了iframe里面…
不过这个方式带来的难度并不大,只是在异步与iframe处理上绕了个弯(或者有其他原因,不完全是基于反爬虫考虑),无论你是用selenium还是phantom,都有API可以拿到iframe里面的content信息。
接口加密与JS混淆
但是如果前端通过JS混淆、并把ajax接口通过token进行加密的话,事情就变得比较麻烦了。 这种做法的思路是, ajax接口除了正常的HTTP请求参数外,额外还要接受一个Token参数,这个token参数是前端的js脚本通过其他的参数加密出来的, 它可能是xor、md5、或者是sha256等等。参数可以是用户名、ip、cookies的sessionid、甚至是用户的操作流程(支付宝的做法)再加上前端把js的函数调用层层嵌套、隐藏、 再加上js脚本混淆,令破解者无法方便的逆向出token计算的流程, 就可以达到一定的反爬目的。
数据混淆
爬虫的目的是获取到有效的数据。对于许多应用来说,获取到错误的数据往往比获取不到数据更加致命。(想象一下比价网站拿到的都是错误数据的场景)。这个思路的核心就是,当爬虫命中反爬规则之后,使用错误的数据代替正确的数据返回给爬虫, 这种方式非常隐蔽,又可以对对手造成足够的麻烦, 可以说非常的猥琐、也相当的有效。
字符集替换
猫眼电影 去哪儿移动侧 籍合网
猫眼电影的票房数据和评分,展示的并不是纯粹的数字。页面使用了font-face定义了字符集,并通过unicode去映射展示。
BACKGROUND拼凑
美团
与font的策略类似,美团里用到的是background拼凑。数字其实是图片,根据不同的background偏移,显示出不同的字符。并且不同页面,图片的字符排序也是有区别的。不过理论上只需生成0-9与小数点。
字符穿插式
微信公众号文章
某些微信公众号的文章里,穿插了各种迷之字符,并且通过样式把这些字符隐藏掉。
伪元素隐藏式
汽车之家
汽车之家里,把关键的厂商信息,做到了伪元素的content里。
这也是一种思路:爬取网页,必须得解析css,需要拿到伪元素的content,这就提升了爬虫的难度。
元素定位覆盖式
去哪儿
对于一个4位数字的机票价格,先用四个i标签渲染,再用两个b标签去绝对定位偏移量,覆盖故意展示错误的i标签,最后在视觉上形成正确的价格。
字符分割式
全网代理IP
IP的数字与符号分割成dom节点,再在中间插入迷惑人的数字。
行为分析
用户的操作轨迹与爬虫的操作轨迹是不同的。比如电商网站,用户可能会浏览100个或者更多相似的商品,最终选择一个进行下单。而爬虫的行为可能是浏览100000个商品,且它们之间彼此关联度很低, 最终也不会有任何购买动作。从这个维度来说,就可以判断出这个请求来源是客户还是爬虫。 结合其他的反爬手段,就可以对爬虫造成有效干扰。低级的行为分析基于规则,高级的行为分析基于机器学习。 对于用户操作比较多的网站来讲,是一种很可靠的反爬手段。
存储跟踪与flash Storage
Cookies是浏览器保持状态的一种机制。 除了Cookies,现代的浏览器还支持localStorage。
以目前国内用户的使用习惯,绝大多数用户不会设置拒绝Cookies保持。所以,拒绝Cookies跟踪的客户端可以认为就是爬虫。通过Cookies,就可以跟踪用户的行为轨迹。 除此之外,如果用户使用浏览器模拟技术,一定在每次请求时会清空Cookies。 Cookies被清空之后,我们仍然有机会使用flash来继续跟踪用户。今天的Flash确实是一个夕阳技术,但仍然保持极高的市场占用率,在PC端,90%以上的国内视频网站依然采用flash作为播放器的客户端。所以,一个以PC端流量为主的网站,可以使用flash来进行用户跟踪。值得高兴的是,在flash插件中,通过Capabilities.serverString可以获取到非常多的系统信息,包括操作系统、语言、系统分辨率、DPI等等等等。这些系统信息与JS上下文、UserAgent、用户访问日志进行一起分析,就可以判断是否是伪装为爬虫的浏览器。举个例子,如果是正常的用户, 从flash、js上下文、user-agent拿到的参数应该是一致的,而如果伪造过UA(不那么高明的伪造),则肯定会有纰漏。
navigator对象
浏览器中的window.navigator对象保持了很多的操作系统、浏览器信息。navigator对象的信息配合Useragent、flash,可以用来判断是否是伪装浏览器。
假链陷阱
假链陷阱作为反爬手段,多见于半静态网站。 它的思路主要是构建一个不可见的a标签, 如果爬虫跟踪所有的页面链接,势必会掉到构造好的陷阱,导致爬虫命中反爬策略。
浏览器指纹
浏览器指纹技术常用于客户端跟踪及反机器人的场景。核心思路是, 不同浏览器、操作系统、以及操作系统环境,会使得canvas的同一绘图操作流程产生不同的结果。如果是相同的运行环境,同一套Canvas操作流程会产生相同的结果。 浏览器指纹的优势是不需要浏览器保持本地状态,即可跟踪浏览器。 由于国内特色的Ghost系统安装,这种方式的误杀率并不低
JS引擎指纹
这种反爬的思路是,不同的JS引擎在执行相同的JS语句时,会有不同的结果。通过判断JS引擎的动作和UserAgent中声称的浏览器类型,可以判断是否是伪造浏览器。