如何防止网站被爬虫爬取的几种办法 - jackee-yz/The-crawler GitHub Wiki
防止恶意爬虫的方法很多,最常见的几样就是操作判断,若干次异常操作后跳转到一个验证码页面,或者是限制某个IP单位时间内访问的次数,nginx可以实现,内容保护的话,可以把主要内容用ajax获取 例如: 请求a页面,a页面生成验证码存入db或者第三方(redis),此页面主体内需要ajax跨域请求b接口获取内容,ajax跨域请求的时候需要传递a页面生成的验证码,b接口拿到验证码去验证验证码是否存在或者是否过期,如果验证码存在或者没有过期则b接口返回json内容并且从db中删除验证码或者设置验证码过期,否则认为是非法请求!!! 注意: 由于a页面生成验证码,只能使用一次。如果抓取方模拟a页面请求,a页面不光会生成验证码,还会走完加载b接口的流程,并且销毁掉验证码。但是抓取方无法拿到a页面的主题内容。 而一般来说,页面中含有ajax的二次请求,抓取方是第一次请求得到页面中的ajax地址后,用正则分析出a页面生成的验证码和ajax请求地址,再用php带着这个验证码去请求一次,但是可惜的是第一次模拟请求的时候已经加载完a页面的所有操作,验证码已经被销毁,所以是得不到想要的内容的,这个情况,如果抓取方和被抓取方是在同域下,是没有问题,也是就是ajax如果没有被设置为跨域请求b接口。 实际上,抓取方和被抓取方是处于不同域下的,那么如果ajax请求不是跨域请求,在抓取方得到a页面url链接的时候模拟访问,ajax请求b接口是不会成功的,因为跨域了。这样就无法实现生成的验证码销毁。抓取方还是可以模拟得到b接口的内容。所以在压面中ajax请求需要设置jsonp跨域请求。
基于iptables和shell脚本: 可以对nginx的access。log进行策略定义,例如:定义一个在一分钟内并发连接数超过30个ip为非法,如果ip不在白名单内,则加入iptables策略封掉,这种方式有个问题,容易误伤,如果定义请求连接数更小的话,那么误伤封掉的ip更多。但是如果对于某个特定的爬虫地址(网易,有道)的爬去行为很难精确,因为你无法准去知道这些爬虫的ip地址,发现由于ip库不准去造成的错误屏蔽会更多。然后需要注意的是:封ip条目iptables列表长度是65535时就会封满,服务器也会死机
基于robots。txt文件:例如阻止所有的爬虫爬去,但是效果不是很明显
基于nginx自带功能:通过http_user_agent阻塞来实现,包括GET/POST方式的请求,直接在nginx.conf配置文件中添加配置