javascript - Meteor 应用程序呈现不稳定的 spiderable

标签 javascript meteor phantomjs

情况:

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

我得到了我的页面的漂亮快照

http://sample.com/?_escaped_fragment_=

到网址。

问题:

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

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

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

我的想法:

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

有什么建议吗?

最佳答案

我想我已经解决了这个问题。 这确实是 spiderable.js 文件中的问题。 这个模块在 REPL 状态下运行 phantomjs 并通过标准输入给他这样的代码:

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 block 包装在 setTimeout 中(500ms 对我来说很好):

  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);
  }

关于javascript - Meteor 应用程序呈现不稳定的 spiderable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14520317/

相关文章:

javascript - 带有 ScrollMagic 引脚的网站

javascript - 如何在 javascript 或 php 中查找运营商名称

javascript - 是否可以将函数传递给 casper.evaluate()?

javascript - PhantomJS 需要一个标识符,但发现了 'local'

jasmine - 如何在 Karma/Jasmine 中检查控制台日志?

JavaScript 正则表达式未检测到

javascript - 使用 Angular JS 动态绑定(bind)到多级深层对象的 ng-model

css - Meteor 如何为不同的媒体类型提供多个 css?

javascript - CollectionFS、Meteor.js、Summernote(WYSIWYG) 和文件上传

javascript - 如何停止 meteor ?