1.反爬虫宗旨爬虫与反爬虫是一个循环往复、互相博弈的过程,并没有一种一劳永逸的办法杜绝所有爬虫的爬取(更何况搜索引擎也算是爬虫的一种)。在应用反爬虫的过程中,只能做到尽可能的识别爬虫,尽可能的提高爬虫爬取的成本。对于某些个人的爬虫来说,如果爬取网站的成本太大(如需多台“肉鸡”、需过长的时间识别反爬虫策略或破解验证码等),个人爬虫可能大部分都会考虑放弃,毕竟个人资源时间有限。而对于一些商业组织来说,可能就有充足的资源来针对我们应用破解反爬虫策略,从而来爬取我们的网站。这类有能量的爬虫我们可能很难防御下来,但我们可以通过提高他的爬取成本(增加他的破解难度,增加开发时间,也算是增加了人力成本等)。当爬取成本过高时,那相对收益就会减小,当爬虫的相对收益较小时,他也就不会浪费精力来爬取我们的网站。2.反爬虫措施因爬虫是具有可进行性的(进行的方式可能取决于反爬虫策略或爬虫工作者的绩效)。故制定一个一劳永逸的完美的反爬虫方案是不可行的。但我们可以一步步的增加反爬虫措施,从最低级的爬虫开始防御,慢慢增加应对措施以应对更高级的爬虫。下面,从反爬虫的级别及难易程度逐步提出一些反爬虫措施: 2.1. Headers校验User-Agent、Referer或自定义头部校验等虽然Headers非常好伪装,校验后的防范效果可能收效不大。但仍可能有一部分初学者或学校的学生,来爬取网站时并不知道要伪装Headers,加上此校验,好歹还是能防掉一些低级的爬虫。服务端可维护一个正常的User-Agent列表,对请求校验其User-Agent是否在列表中,对非正常的请求拒绝服务或弹出验证码等措施。要注意的是User-Agent校验要注意将搜索引擎加入白名单,例如GoogleBot等。如将搜索引擎的抓取屏蔽可以影响公司官网在搜索引擎中的显示。搜索引擎的名单可参考其他网站的robots.txt.如淘宝网: 图2-1 淘宝网robots.txt文件实现难度:简单,但需要持续的维护User-Agent列表负面影响:对于一些未收集到的搜索引擎爬虫,可能会导致B2C在其搜索引擎中的显示排名。2.2. 提供robots.txt由搜索引擎发起的“君子约定”,一般提供在网站根目录下,由一行User-Agent开始,后面跟多行Disallow标明不希望爬虫爬取的路径。搜索引擎发起这项约定就是为了保证我们的网页能展现在搜索引擎结果的同时,又避免爬取我们应用不希望开放的地址。robots.txt文件格式参考 “图2-1”,User-Agent标明针对的客户端类型,Allow标明允许爬取的地址,Disallow标明不希望爬取的地址。也可参考同行官网的robots.txt:东方航空:http://www.ceair.com/robots.txt南方航空:http://www.csair.com/robots.txt中国航空:http://www.airchina.com.cn/robots.txt同时,可以在robots中提供sitemap,来指导搜索引擎去爬取页面,给搜索引擎指明了爬取路径,也可以避免它自己去识别网站可爬取页面时,误爬我们不希望开放的地址。如国航robots.txt中: sitemap: http://www.airchina.com.cn/sitemap.xml 图2-2 国航官网sitemap文件sitemap格式可参考:http://lzj0470.iteye.com/blog/905962爬虫开发思考的第一个问题就是是否要遵守“robots协议”,虽然可能一些个人爬虫不了解或者不会遵守该约定。但是既然存在这个协议,那应该大部分还是会遵守的。加上的话,最少能避免搜索引擎来爬取信息时,对我们的航班动态进行太多查询,导致查定比升高。实现难度:简单负面影响:无2.3. 钓鱼链接爬虫爬取页面时,会筛选出页面中所有的URL地址去访问,特别是一些没有明确目的的爬虫,更是收集到的URL都会陆续的去请求以获取更多的数据。 这样,我们就可以通过在页面上卖店,放置一些钓鱼链接,正常用户不会去访问,只有爬虫爬取才会访问,一访问就记录下这个客户端(IP或用户或session),该客户端的每次访问都采取限制措施(如验证码,或者单位时间内拒绝请求)。 如在页面设置a标签,<a href=”xxx.com/spider”> ,通过CSS样式将该元素在页面上隐藏。正常用户就看不到了,而服务器端只要检测到这个地址的请求,就可以将该客户端记录为爬虫。实现难度:简单负面影响:存在误伤搜素引擎的可能2.4. 前端JS校验在提交请求前,通过前端JS生成一段校验码(hash或任何方式都行,主要目的是逼迫爬虫去执行JS),在后端可校验校验码是否正确,来判断是否爬虫。此举不在于完全过滤爬虫,非必须考虑JS生成校验码的逻辑被破解,爬虫可通过模拟浏览器或引入JS引擎执行JS,但这样已经提高了爬虫的成本。直接的URL访问,一次爬取时间可能也就几十到几百毫秒,但改成模拟浏览器渲染,时间就会增加到好几秒。且模拟浏览器更耗资源,也不足以支持单纯URL访问的并发数。2.5. 敏感数据处理对于航班价格、座位数等敏感数据,可进行数据处理,让爬虫无法直接获取真正的数值。如将价格加工成图片返回前端,前端直接显示图片,爬虫想要爬取,就需要进行图像识别,会大幅增加爬虫成本,降低其爬取效率。或者自定义字体,调整字体中数字的顺序,接口返回的数字并不是最终显示的数字。如下图所示,为参考去哪儿网反爬时发现的其字体反爬技巧: 同时,为了防止爬虫识别出此策略,可在后端维护一个字体池,通过定时任务定时生成字体变化其顺序,然后服务端的数字做一下转换,那爬虫在网页源代码爬取到的值就是虚假的值。实现难度:较难负面影响:字体实现方式需要考虑兼容性问题,如果在某些不兼容的环境下显示的错误的数值,会给正常用户以误导。