昨天晚上花了几个小时用Jsoup写了一个网站收集器,帮一个高中同学收集了一个工业信息门户上的芯片待售信息。网站上显现的数据多达60w+条, 我写的程序跑了7个小时只收集了一半,算是能够交差了。
这现已是我第2次写这种收集器了。之前在做 波菜网 的时分,写过一个更杂乱的。其时网站上线今后苦于没有原生态的内容,我就写了一个收集器从“ 百度身边 ”收集各大城市的饭馆和菜品信息,并经过google地图的接口获取饭馆的地理位置,然后转存到咱们自己的网站上。
我有必要供认,做这些事儿都是不光彩的,归于坐收渔利,弄不好还得背上法令责任。可是在国内这个互联网的环境下,这种小规模的数据收集想上升到法令层面去制止,仍是不切实际的。那么从一个网站的开发或许运营的视点,怎么来防备他人的歹意收集呢?怎么做到在防备的一起又不影响搜索引擎的蜘蛛的收集作业呢?
从我个人的收集经历来看,我觉得这种防护能够从两个方面着手。
服务器端的装备 。至少能够经过防火墙来屏蔽某些ip的高频率拜访,或许在web服务器设置规矩来制止要害页面被某些ip高频恳求。也能够先经过防火墙设置预警机制,一旦发现异常当即告诉web服务器采纳屏蔽办法。不论是专业的收集器仍是像我的这种纯代码等级的收集,最基本的原理便是仿照用户阅览网站行为,发送http恳求到网站的server,然后解析回来的成果。出于功率起见这种收集行为都有几个一起的特色。一是宣布恳求的ip地址比较固定,二是恳求的频率比较稳定,三是拜访的页面也比较固定。防火墙的设置能够根据前面两个特征,web服务器的过滤规矩能够根据后边两个特征。当然这些办法仅仅从物理层面的防护,放不了真实的高手。我在我的收集器里边完成的多线程收集,就会把收集频率用随机时刻来操控,也便是发送收集恳求的频率是随机的,有可能是3秒钟一次,有可能是2秒钟一次。别的假如我是黑客,我能够发起多个ip的肉机来发送恳求。总归一句话,服务器上的防护,防得了正人,防不了高档的小人,可是有总比没有好。
代码等级的防护 。收集器能够仿照阅览器大部分的行为,可是必定有仿照不到的当地。比如说带参数的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%,你假如发现你的数据被收集了,就采纳法令办法吧。前段时刻群众点评申述“食神摇一摇”抄袭数据,便是一个很好的比如。