-
282024年4月
-
302024年3月
-
292024年2月
-
312024年1月
-
312023年12月
-
302023年11月
-
312023年10月
-
302023年9月
-
312023年8月
-
352023年7月
-
312023年6月
-
312023年5月
-
302023年4月
-
312023年3月
-
282023年2月
-
312023年1月
-
312022年12月
-
302022年11月
-
312022年10月
-
302022年9月
-
312022年8月
-
322022年7月
-
292022年6月
-
322022年5月
-
302022年4月
-
332022年3月
-
312022年2月
-
372022年1月
-
382021年12月
-
382021年11月
-
402021年10月
-
432021年9月
-
372021年8月
-
442021年7月
-
442021年6月
-
432021年5月
-
342021年4月
-
312021年3月
-
292021年2月
-
352021年1月
-
422020年12月
-
402020年11月
-
482020年10月
-
522020年9月
-
852020年8月
-
752020年7月
-
802020年6月
-
782020年5月
-
772020年4月
-
432020年3月
-
362020年2月
-
452020年1月
-
562019年12月
-
712019年11月
-
612019年10月
-
562019年9月
-
532019年8月
-
362019年7月
-
362019年6月
-
382019年5月
-
402019年4月
-
352019年3月
-
342019年2月
-
442019年1月
-
392018年12月
-
402018年11月
-
392018年10月
-
392018年9月
-
452018年8月
-
452018年7月
-
392018年6月
-
512018年5月
-
492018年4月
-
342018年3月
-
282018年2月
-
482018年1月
-
732017年12月
-
7292017年11月
-
7442017年10月
-
2892017年9月
-
12017年8月
反爬虫机制对于爬虫工程师来说并不陌生,可以说爬虫与反爬虫是相爱相杀的,没有爬虫就不存在反爬虫,没有了反爬虫,爬虫也不用发展了,简单粗暴的爬虫直接把服务器搞死了,其他人就没得玩了,最后自然玩不下去了。
所以,反爬虫机制的最初目标就是反抗那些简单粗暴的爬虫,他们会疯狂的访问爬取网站,给服务器带来巨大的压力,造成服务器不能正常工作。那么,当爬虫合理的行为或者说伪装度比较高的行为,对于反爬虫机制来说,未必不能网开一面,毕竟那样和真实用户没什么区别了,正所谓,水至清则无鱼,反爬虫机制不可能连真实用户也杀死。
那么反爬虫机制是怎样反抗一些简单除暴的爬虫呢?
一、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需要的路径,所以最好是在申明时指定路径。