注册
登录
提问时间:2018/11/19 15:38:35    楼主:未知网友   阅读量:304

反爬虫机制对于爬虫工程师来说并不陌生,可以说爬虫与反爬虫是相爱相杀的,没有爬虫就不存在反爬虫,没有了反爬虫,爬虫也不用发展了,简单粗暴的爬虫直接把服务器搞死了,其他人就没得玩了,最后自然玩不下去了。

所以,反爬虫机制的最初目标就是反抗那些简单粗暴的爬虫,他们会疯狂的访问爬取网站,给服务器带来巨大的压力,造成服务器不能正常工作。那么,当爬虫合理的行为或者说伪装度比较高的行为,对于反爬虫机制来说,未必不能网开一面,毕竟那样和真实用户没什么区别了,正所谓,水至清则无鱼,反爬虫机制不可能连真实用户也杀死。

那么反爬虫机制是怎样反抗一些简单除暴的爬虫呢?

一、header检验

最简单的反爬虫机制,就是检查HTTP请求的Headers信息,包括User-Agent, Referer、Cookies等。

1、User-Agent

User-Agent是检查用户所用客户端的种类和版本。最简单的解决方法就是建立一个很多浏览器User-Agent的列表,然后在每次请求中,随机选取一个真实浏览器的User-Agent。

2、Referer

Referer是检查此请求由哪里来,通常可以做图片的盗链判断。简单的解决方法可以这样:如果某个页面url是通过之前爬取的页面提取到,自动把之前爬取的页面url作为Referfer。当然,也可以自定义一个合理的Referfer列表,每次请求随机选择一个。

3、Cookies

网站可能会检测Cookie中session_id的使用次数,如果超过限制,就触发反爬策略。所以可以设置 COOKIES_ENABLED = False 让请求不带Cookies。如果网站强制开启Cookis,可以另写一个简单的爬虫,定时向目标网站发送不带Cookies的请求,提取响应中Set-cookie字段信息并保存。爬取网页时,把存储起来的Cookies带入Headers中。

二、限制IP的请求数

如果某一个IP的请求速度过快或者反人类,就会触发反爬机制,有两种解决方法,一种是放慢爬取速度,代价是效率降低,可能完不成任务;另一种是使用代理IP,代价是需要付出一些软妹币,免费的代理IP效果实在是太差,不推荐使用,这里推荐站大爷代理IP平台,IP日流水量大,高效稳定,性价比高。

三、动态加载

现在越来越多的网站使用ajax动态加载内容,这时候可以先截取ajax请求分析一下,有可能根据ajax请求构造出相应的API请求的URL就可以直接获取想要的内容,通常是json格式,反而还不用去解析HTML。

然而,很多时候ajax请求都会经过后端鉴权,不能直接构造URL获取。这时就可以通过PhantomJS+Selenium模拟浏览器行为,抓取经过js渲染后的页面。

需要注意的是,使用Selenium后,请求不再由Scrapy的Downloader执行,所以之前添加的请求头等信息都会失效,需要在Selenium中重新添加。

另外,调用PhantomJs需要指定PhantomJs的可执行文件路径,通常是将该路径添加到系统的path路径,让程序执行时自动去path中寻找。我们的爬虫经常会放到crontab中定时执行,而crontab中的环境变量和系统的环境变量不同,所以就加载不到PhamtonJs需要的路径,所以最好是在申明时指定路径: