情况:
我想在我的 vps ubuntu 服务器上运行一些应用程序以进行爬网测试。
我的应用使用来自“atmosphere”的 meteor-router
和 mrt
包管理器。
在我使用 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/