一切福田,不離方寸,從心而覓,感無不通。

网页抓取以及一些防范的方法

随着互联网的兴起,网页抓取已经被越来越多的人所应用,可以用来做各种白色的,黑色的,灰色的程序。典型的如一淘就是正大光明的去抓取电商之间的价格来作对比。

然而,作为服务器端来说,网页抓取就是噩梦,一方面增大了服务器的压力,另一方面用机器人做了很多应该被禁止去做的事。

如何防范他们,我想,是现在服务器端一个需要研究的课题。这里就总结一下各种防范的措施。

如果严格的定义这个问题,我们就是要做人机识别。也就是我们不知道来的请求是人还是机发出来的,但是要根据行为特征或者是一些方法去判断请求到底来自人还是机(这个很像是图灵测试,但并不完全一样)。

所以,服务器在执行实际任务之前,需要对请求去判断到底是不是来自机器。而这个判断,针对不同机器人的方法方式,又有很多应对方法。

1. 常规办法。(这里的常规办法,实际上并不能完全应付网页抓取,之所以写下来,是总结一下对于抓取有障碍的地方。)

User-Agent: 通过它可以判断客户端的浏览器,但是客户端可以更改
Referer:一般用它来防盗链,referer指被请求页面的前一页,同样可以被客户端程序总结并利用
Cookie:一般用来做认证,所以这个基本上是许多客户端程序必须要做的事,要么勾住一个已有的cookie来登陆,要么模拟一个新的页面来产生新的cookie
HTTPS:一般用来防止半路被人截取消息,但是如果你本身也是客户端的话……你可以直接去解密消息,甚至附上需要的证书
2.验证码,上面讲的方式都可以被客户端程序利用,究竟什么方式才可以阻止机器呢?一个已经被广为接受的方式就是使用验证码。验证码是个比较好的方式,但是,真正要设计好却不太容易。

比较差的方式见参考2,这样的验证码通常是防不住聪明的客户端的。
另一种极端的方式即复杂到人都快要辨识不出来的,会带来很差的用户体验。
所以,稍好一点的方式是提出有一定智能才能回答的问题,比如新浪微博会问“黑龙江的省会”之类的常识性问题。(还有的会问1+1=?,我相信这也是很容易识别的)
当然,现在还有的方式是结合广告的验证码,这样还把商业模式也融入其中,比较典型的如:XX银行存款已经突破2亿,然后将其中银行两个字标成红色,剩下的蓝色,并要你输入红色的字。
但是验证码并非万能和一劳永逸的,首要的一点就是要考虑用户体验,不能用在所有的地方,只能用在关键性的入口

于是客户端程序又蠢蠢欲动了,只需要把验证码抓回来给人输入一次,后面便畅通无阻。

3.冻结IP,针对客户端程序频繁或者并发抓取的特征,可以将频繁或抓取的ip封锁(有的服务器提供配置),比如说一个网页正常人来操作需要0.7ms以上,但是客户端程序却能够0.3ms请求一次,这种频繁请求就能被判断作机器刷新,于是一个新的方式就是在系统全局范围内记录ip(比如hashtable或者memcache)以及访问时间,当访问时间较短时就暂时冻结该ip过来的请求。

好吧,道高一尺魔高一丈,客户端这时候就会采用多IP或者代理来访问(即分布式的客户端)

4.多IP的冻结,应当明白,多IP同样会有行为模式。比如来自同一个网段,一旦发现,可以封锁整个网段(虽然比较愚蠢),有的爬虫采用定时轮转,也很容易发现(时间比较规律,请求数量同样很大)。

于是又有的爬虫开始丢弃这些模式,并把自己伪装得更像人

5.利用js执行。大多数客户端程序都是直接请求html,同时只执行html而并不执行javascript(难度比较大),于是,可以在请求的js里面放入一段js,正常执行时该js会访问服务器端并留下一个痕迹,但是如果是爬虫,就会发现大量的请求后不会留下该痕迹,于是,封之。

上面说了,是大多数客户端程序。也就是说还有少数更聪明的。利用浏览器内核(比如webkit)或者配合js引擎(比如v8)来抓取……

6.。。。貌似人类已经很难阻止了爬虫了,如果要说阻止,那同样还是抓取量是一个比较明显的特征(因为爬虫不可能像人一样那么慢,否则海量网页很难完成)

参考:图灵测试 http://baike.baidu.cn/view/94296.htm

简单的验证码 http://xiaoxia.org/2011/08/04/discussion-on-certain-webpage-code-and-bypassing-validation/

防爬总结 http://www.cnblogs.com/xoray007/archive/2011/11/22/2258366.html

另一篇python如何爬网页的文章 http://www.pythonclub.org/python-network-application/observer-spider

反爬虫的实践 http://robbinfan.com/blog/11/anti-crawler-strategy

from:http://blog.csdn.net/liweisnake/article/details/8847354