我想在我的vps ubuntu服务器上运行一些应用程序以进行爬网测试。
我的应用使用来自'氛围'的meteor-router
与mrt
包管理器。
在我的本地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机器比我的本地机器拥有更少的内存和处理器资源。这就是为什么生成动态内容需要更多时间,但幻影认为页面已经结束并在流星渲染之前制作快照。
有什么建议吗?
答案 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();
};
回调是在适当的时候调用的