如何防止网站关键数据被人恶意采集

昨天晚上花了几个小时用Jsoup写了一个网站采集器,帮一个高中同学采集了一个工业信息门户上的芯片待售信息。网站上显示的数据多达60w+条, 我写的程序跑了7个小时只采集了一半,算是可以交差了。

这已经是我第二次写这种采集器了。之前在做波菜网的时候,写过一个更复杂的。当时网站上线以后苦于没有原生态的内容,我就写了一个采集器从“百度身边”采集各大城市的餐馆和菜品信息,并通过google地图的接口获取餐馆的地理位置,然后转存到我们自己的网站上。

我必须承认,做这些事儿都是不光彩的,属于不劳而获,弄不好还得背上法律责任。但是在国内这个互联网的环境下,这种小规模的数据采集想上升到法律层面去禁止,还是不切实际的。那么从一个网站的开发或者运营的角度,如何来防范别人的恶意采集呢?如何做到在防范的同时又不影响搜索引擎的蜘蛛的采集工作呢?

从我个人的采集经验来看,我觉得这种防御可以从两个方面着手。

  1. 服务器端的配置。至少可以通过防火墙来屏蔽某些ip的高频率访问,或者在web服务器设置规则来禁止关键页面被某些ip高频请求。也可以先通过防火墙设置预警机制,一旦发现异常立即通知web服务器采取屏蔽措施。不管是专业的采集器还是像我的这种纯代码级别的采集,最基本的原理就是模拟用户浏览网站行为,发送http请求到网站的server,然后解析返回的结果。出于效率起见这种采集行为都有几个共同的特点。一是发出请求的ip地址比较固定,二是请求的频率比较稳定,三是访问的页面也比较固定。防火墙的设置可以基于前面两个特征,web服务器的过滤规则可以基于后面两个特征。当然这些措施只是从物理层面的防御,放不了真正的高手。我在我的采集器里面实现的多线程采集,就会把采集频率用随机时间来控制,也就是发送采集请求的频率是随机的,有可能是3秒钟一次,有可能是2秒钟一次。另外如果我是黑客,我可以发动多个ip的肉机来发送请求。总之一句话,服务器上的防御,防得了君子,防不了高级的小人,但是有总比没有好。
  2. 代码级别的防御。采集器可以模拟浏览器大部分的行为,但是肯定有模仿不到的地方。比如说带参数的ajax请求。从我的经验来看,你至少可以在通过以下三种方式来优化你的代码,以防止恶意采集。
    1>  关键信息通过ajax请求来获取,最好是需要带有临时token作为参数的请求。网站在发布的时候需要做javascript代码压缩和混淆,这样程序人员就很难通过阅读代码或者捕获请求来建立模拟采集。这里说的关键信息,是指那种对业界同行来说比较重要的信息,比如说价格等。除了这些关键信息以为的信息就最好不要用ajax请求来显示了,那样不利于SEO优化,搜索引擎的蜘蛛也不能模拟如此复杂ajax请求。另外如果有分页,一定要用ajax请求来分页。具体例子可以看看花瓣网的首页。至于通过表单请求来获取数据,有些采集器已经能模拟带session或者cookie信息的表单请求了,至少Jsoup是可以做到的。
    2>  关键信息通过图片来显示。这种是技术含量比较低的防御了,唯一的好处是有利于SEO优化,因为图片通过alt来携带更加丰富的信息。京东的商品价格就是用图片来显示的,采集器采集到的价格信息需要做OCR文字识别,如果在图片的格式做些手脚或者加入混淆信息,那别人采集过去的信息准确度就会大大降低。另外通过图片来显示的另外一个好处就是可以把图片服务器独立出来,然后通过防火墙设置来只允许来自已知域名的请求。
    3>  网页代码结构化混淆。简单的说就是关键信息的显示不是规律性的。这种做法对网站开发人员要求比较高。毕竟html是一种结构化的语言,想要通过不规律的html标签勾勒出美观的结构化界面是比较难的,但不是不可能。比如说同一张页面的上商品价格列表,你可以随机用div,li,span等这些文字标签来封装,然后通过定制css来达到规范布局。不同的页面(分页)上价格列表,最顶层的div的id或者class不一样,而且跟其他页面的的id无规律可循。这样做可以让采集程序很难发掘到采集的规律,那么采集的难度就大大加大了,即使能采集,效率也会相当低下。这种做法基本上不影响SEO优化。

不过话说回来,不管你采取哪种防御措施,想防住真正的高手是不可能的,只要能防住98%的人就可以了。剩下的那2%,你如果发现你的数据被采集了,就采取法律措施吧。前段时间大众点评起诉“食神摇一摇”抄袭数据,就是一个很好的例子。

Loading

Add a Comment

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.