码迷,mamicode.com
首页 > 其他好文 > 详细

使用浏览器内核爬取OTA数据

时间:2015-10-02 00:21:45      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:

因为业务需要,所以会有一些爬虫的设计需求。

目前这一部分的内容都是外包项目,领导说需要根据实际情况,研究一下自己研发的可能性。


但是绝大部分这些OTA网站都做了大量的异步加载,并且接口都做了加密处理。

也就是说,我们从控制台上面拦截下来的请求数据都是加密的数据,只有经过页面客户端解析后的数据,才能真正的渲染成我们想要的页面。

因此,为了能够正确地抓取到这些数据,我们必须使用浏览器内核来实现。


现在常用的浏览器内核工具有:

QtWebkit spynner

selenium 但是由于selenium需要开启本地浏览器支持,不适合大规模爬去。

phantomjs (webkit)  http://phantomjs.org

slimerjs (gecko)  https://slimerjs.org

除了selenium以外,都做了测试,QtWebkit 和 slimerjs 可以成功地渲染页面。

而phantomjs则一直卡在异步加载无法完成的状态。

slimerjs的代码可以使用和phantomjs完全一样的代码,因为接口是完全兼容的。

function render(page){
	page.render(‘qunar.png‘);
	phantom.exit();
}

var page = require(‘webpage‘).create();
var system = require(‘system‘);

page.onResourceRequested = function (request) {
	// 可以过滤一些不必要的请求
    // system.stderr.writeLine(‘= onResourceRequested()‘);
    // system.stderr.writeLine(‘  request: ‘ + JSON.stringify(request, undefined, 4));
};

page.open(‘*ar.com/city/guangzhou/#fromDate=2015-10-01&toDate=2015-10-02&fom=qunarindex‘, function(status) {
	var title = page.evaluate(function() {
		return document.title;
	});
	console.log(‘Page title is ‘ + title);

	console.log("Status: " + status); //页面返回状态
	if(status === "success") {
		// setTimeout(render,1000,page);
		console.log("I am ready!");
	}  
});

var t = 3;
var interval = setInterval(function(){
    if ( t > 0 ) {
        console.log(t--);
    } else {
        var htmlContent = page.evaluate(function () {
	        return document.documentElement.outerHTML;
	    });
	    console.log(htmlContent);
        page.render("qunar.png");
        phantom.exit();
    }
}, 1000);

目前这个是原生的phantomjs瞎支持的代码,通过等待一定时间,来完成页面的ajax资源加载。

接下来是基于casperjs 的解析方案


最后,仍然要解决的问题还有不少。

phantomjs这种引擎数据持久化的问题。

webkit内核无法生成页面的原因,甚至在测试携 程网的适合,直接就是请求失败。

var casper = require(‘casper‘).create({
	verbose: true,
	ogLevel: ‘debug‘,     //~~添加debug参数~~
	userAgent: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36‘,

});

//监听 requested 消息
casper.on(‘resource.requested‘, function(requestData, request){
	// 通过正则过滤掉一些不必要的加载
	if (requestData.url.match(/google|gstatic|doubleclick/)){
		request.abort();
		return;
	}else{
		this.echo(requestData.url);
	}

});

casper.start(‘*nar.com/city/taipei/‘, function() {
	
	this.echo("strat -2before");
	// this.scrollToBottom();	//滚动到页面底部

    this.waitForSelector(‘.hotel_price‘, function() {                  //等到‘.tweet-row‘选择器匹配的元素出现时再执行回调函数
        this.captureSelector(‘qunar.png‘, ‘html‘);                 //成功时调用的函数,给整个页面截图
    }, function() {
    	this.capture(‘qunar.png‘);
        this.die(‘Timeout reached. Fail whale?‘).exit();             //失败时调用的函数,输出一个消息,并退出
    }, 5000);                                                        //超时时间,两秒钟后指定的选择器还没出现,就算失败 
});

casper.run();

目前而言,使用slimerjs 确实可以爬取到想要的数据内容。















使用浏览器内核爬取OTA数据

标签:

原文地址:http://my.oschina.net/dacoolbaby/blog/513142

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!