Meteor应用程序呈现不稳定的蜘蛛状态

时间:2013-01-25 10:53:50

标签: javascript meteor phantomjs

情况:

我想在我的vps ubuntu服务器上运行一些应用程序以进行爬网测试。 我的应用使用来自'氛围'的meteor-routermrt包管理器。 在我的本地mac os x 10.8上安装了brew的phantomjs,一切都很顺利。我通过添加

获得了我的页面的快照
  

http://sample.com/?_escaped_fragment_=

到网址。

问题:

让我在ubuntu vps服务器上尝试相同的操作。 2种方式:

1)将未捆绑的应用程序复制到服务器并使用mrt run命令运行它:它不稳定。有时它呈现好。但有时我的动态内容是空白的。就像我的数据库是空的。

2)将未捆绑的应用程序复制到服务器并mrt bundle fname.tgz,然后解压缩.tgz并使用节点运行其main.js。这种方式的蜘蛛工作绝对错误。我每次尝试都会得到空白而不是动态数据。

我的想法:

我的ubuntu机器比我的本地机器拥有更少的内存和处理器资源。这就是为什么生成动态内容需要更多时间,但幻影认为页面已经结束并在流星渲染之前制作快照。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我想我解决了这个问题。 这是spiderable.js文件中的一个问题。 这个模块在REPL状态下运行phantomjs并通过stdin给他这样的代码:

var url = '" + url + "';
var page = require('webpage').create();
page.open(url);

setInterval(function() {
  var ready = page.evaluate(function () {
    if (typeof Meteor !== 'undefined'
        && typeof(Meteor.status) !== 'undefined'
        && Meteor.status().connected) {
      Meteor.flush();
      return Meteor._LivedataConnection._allSubscriptionsReady();
    }
    return false;
  });

  if (ready) {
    var out = page.content;
    out = out.replace(/<script[^>]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '');
    out = out.replace('<meta name=\"fragment\" content=\"!\">', '');

    console.log(out);
    phantom.exit();
  }
}, 100);

问题是当所有Meteor条件都通过时,它认为page.content是100%更新的。但事实并非如此。我找到并测试的解决方案是在if中包裹setTimeout块(500毫秒对我来说很好):

  if (ready) {
    setTimeout(function () {
      var out = page.content;
      out = out.replace(/<script[^>]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '');
      out = out.replace('<meta name=\"fragment\" content=\"!\">', '');

      console.log(out);
      phantom.exit();
    }, 500);
  }

答案 1 :(得分:0)

我认为正确的方法是将回调传递给# ./test.pl Malformed UTF-8 character (unexpected non-continuation byte 0x72, immediately after start byte 0xfc) at ./test.pl line 13. Baden-Wrttemberg Baden-Wrttemberg ,就像这样(see the docs):

page.open

另外,如果你想依靠快照的超时,我会减少超时并将其包装在一个循环中以加速它并使其更可靠:

page.open(url, function (status) {
    ...
};

我还认为我的最后一个代码段经常会在没有超时的情况下执行,因为page.open(url, function (status) { if(status !== 'success') { phantom.exit(); return; } function isReady() { return page.evaluate(function () { if('undefined' === typeof Meteor || 'undefined' === typeof(Meteor.status) || !Meteor.status().connected) return false; Meteor.flush(); return Meteor._LivedataConnection._allSubscriptionsReady(); } } function trySnapshot() { if(!isReady()) { setTimeout(trySnapshot, 100); return; } console.log(page.content .replace(/<script[^>]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '') .replace('<meta name=\"fragment\" content=\"!\">', '') ); phantom.exit(); } trySnapshot(); }; 回调是在适当的时候调用的