在爬取简单的页面则很轻松的可以抓取搞定,但是如今一个b***p项目(不透露),需要抓取的网站有比较强悍的反爬虫技术,我们也提高作战技术,汇总并逐步实现反爬虫技术。
拓展链接
首先是一些比较精品的资源收集找了几百个页面还是这些比较浓缩,看完就基本能明白反反爬大概要干嘛了:
基础的反反爬:http://blog.csdn.net/u012150179/article/details/35774323
从爬虫到反反爬的系列教程:http://www.pycoding.com/tags/scrapy/
处理js的方法:http://www.pycoding.com/2016/04/15/scrapy-12.html
ip池和user agent:http://www.tuicool.com/articles/VRfQR3U
还有比较靠谱的知乎回答:http://www.zhihu.com/question/28168585/answer/39882712
携程网爬虫事故:https://segmentfault.com/a/1190000005840672
模拟浏览器框架,selenium phantomJS框架:http://blog.chinaunix.net/uid-22414998-id-3692113.html
项目分析:
该网站采用的反爬虫机制与规律如下:
1:ip限制请求次数,每天200次
2:过多大量请求会封禁
3:302跳转动态反爬
4:检测是否具有js能力再跳转链接
5:根据cookie决定是否允许
针对每一项的反爬虫,对应的解决方案是:
1:ip池维护(困难类型-淘宝你懂速度慢,或者分布式ip有限。只好V**代理,)
2:减少单ip的请求次数与设定user,减低单进程的爬取速度,将scrapy增加进程提高效率。
3:302跳转则本身scrapy可以协助跳转,但是由于有js检测导致调到js警告页面。
4:通过selenium phantomJS框架来完成js的操作。
5:cookie则要么完全禁用,但是怀疑该网站有cookie必须项,考虑伪造cookie。
明确大致方案后考虑行动方针:
其中最大的难点并不是要抓什么内容,而在于根本从爬虫访问的时候就不会返回正确的信息,所以只需要测试出能获取200返回就属于成功,在测试阶段,1/2项可以先忽略,首先实现获取。
1:伪造user发送请求
2:禁用cookie,(尝试过,但因为js拦截未知是否成功)
3:伪造cookie,需要解密浏览器的正常访问留下的cookie信息
4:最难点,构建无界面浏览器环境。并且嵌入scrapy的代码中。。
项目实践:
1:伪造user发送请求
scrapy:这部分并不是这三个user可以解决的,需要下载一个几千乃至几万行的user文件,然后每次随机取一个,
scrapy还需要参考一下set的设置。本质上也是处理请求:request.headers.setdefault(‘User-Agent’, ua)
http://www.jb51.net/article/63696.htm
scrapy的我叶补充一下代码:首先是set开启下载器中间件然后,随机选择usr_agent.txt的一行进行设置
代码语言:javascript复制
useragents = []
useragentsock = open(os.path.basename("user_agent.txt"),"r")
for record in useragentsock:
useragents.append(record.rstrip("n"))
useragentsock.close()
useragent = random.choice(useragents)
request.headers.setdefault('User-Agent',useragent)
代码语言:javascript复制
Agent_list = [
" Mozilla/4.0compatibleMSIE6.1WindowsXP",
" Mozilla/5.0WindowsNT6.1WOW64AppleWebKit/535.8KHTML,likeGeckoBeamrise/17.2.0.9Chrome/17.0.939.0Safari/535.8",
" Mozilla/5.0compatibleYodaoBot-Image/1.0http://www.youdao.com/help/webmaster/spider"
]
Agent = random.choice(Agent_list)
#print Agent
代码语言:javascript复制
同时在实现js处理的时候在请求部分也是需要处理js所发送的uesr部分如下
PhantomJS伪装成其他浏览器
在 page 对象的设置项里改变 userAgent 的值,代码如下(模拟 IE6.1 )
var page = require('webpage').create();
page.settings.userAgent = 'Mozilla/4.0 (compatible; MSIE 6.1; Windows XP)';
page.open('http://www.httpuseragent.org', function (status) {
if (status == 'success') {
var agent = page.evaluate(function () {
return document.getElementById('myagent').innerText;
});
console.log(agent);
} else {
console.log('cannot open page');
}
phantom.exit();
});
2:禁用cookie
所谓cookies,是指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密),禁止cookies也就防止了可能使用cookies识别爬虫轨迹的网站得逞。
使用:
在settings.py中设置COOKIES_ENABLES=False。也就是不启用cookies middleware,不想web server发送cookies。
3:伪造cookie
还没有实践,见下js的两个文档
4:js处理环境
这时候用上大神的分析比较合适
phantomjs事件处理使用简介 基于浏览器引擎的爬虫初探
基于浏览器引擎的爬虫初探
我最后这么处理的
首先安装phantomjs环境,然后在python-scrapy的下载器中间件中,重写请求命令,在发请求之前中断了请求,将请求改成使用phantomjs来调用一个bgp_js.js文件。来使用js处理功能去获取页面信息。再返回unicode代码存储下来。
代码语言:javascript复制
try :
content = os.popen("phantomjs ./bgp_js.js " url Agent).read().decode('utf8')
except:
print "js处理部分出错"
try :
f = open('./save_date/AS' num_1 '.txt','w')
print content.encode('utf8')
f.write(content.encode('utf-8'))
f.close()
except:
print "写入文件错误"
其中这个js文件是:,。注意有一个head是从外部参数调入的。所以要加入user那部分的代码
代码语言:javascript复制
var system = require('system');
var page = require('webpage').create();
var head= system.args[2]
page.settings.userAgent = head
page.customHeaders = {
"Connection" : "keep-alive",
"Referer" : "http://bgp.he.net",
"Cache-Control" : "max-age=0",
"Accept": "text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip,deflate,sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
};
var url = system.args[2]
page.settings.loadImages = false;
page.onLoadFinished = function(status) {
if (page.url == 'http://bgp.he.net/cc') {
;
}
else {
console.log(page.content);
phantom.exit();
}
};
page.open(url);
5:代理换ip
请见最新10项目跟进。
项目跟进:
目前情况如下
使用js处理技术可以获取到目标信息。
使用分布式redis做多机协调
使用scrapy异步多进程提高效率
使用V**自动脚本跟换ip—》已经改为代理换ip虽然不够稳定但是数量大
效率分析:
目标爬去a网站5.3万个页面,ip200/每日限制。每个页面需要js处理
一分钟约5-10个页面,20分钟换一次ip。耗时10-20s
目标爬取b站,共计2-3亿个页面。ip200/每日限制,不用js处理。大量跟换ip即可。
原创文章,转载请注明: 转载自URl-team
本文链接地址: SCRAPY学习笔记八 反反爬虫技术项目实战
Related posts:
- Scrapy-笔记一 入门项目 爬虫抓取w3c网站
- Scrapy-笔记二 中文处理以及保存中文数据
- Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
- Scrapy笔记五 爬取妹子图网的图片 详细解析
- Scrapy笔记零 环境搭建与五大组件架构
- scrapy学习笔记十一 scrapy实战效率测评