标签:
因为业务需要,所以会有一些爬虫的设计需求。
目前这一部分的内容都是外包项目,领导说需要根据实际情况,研究一下自己研发的可能性。
但是绝大部分这些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 确实可以爬取到想要的数据内容。
标签:
原文地址:http://my.oschina.net/dacoolbaby/blog/513142