您的位置:首页 > 其它

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

2015-10-01 22:56 561 查看
因为业务需要,所以会有一些爬虫的设计需求。

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

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

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

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

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

QtWebkit spynner

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

phantomjs (webkit) http://my.oschina.net/dacoolbaby/blog/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 确实可以爬取到想要的数据内容。

补充:

经过研究可得,slimerjs不是完整的headless webkit内核,性能方面应该是没有phantomjs优秀。用的人也不多,估计暂时没有出现针对性反爬虫的处理。

另一方面,默认的phantomjs用来做爬虫的话,需要修改源码。因为有不少的javascript可以用过某种方式来检测webkit接口是否是headless webkit。

类似的方法如下(可能需要翻墙):
http://my.oschina.net/dacoolbaby/blog/http://engineering.shapesecurity.com/2015/01/detecting-phantomjs-based-visitors.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  爬虫 OTA webkit