我正在使用PhantomJS通过npm-phantom
模块从基于AJAX的页面中抓取数据。有时,当幻像启动DOM遍历时,数据仍未加载。如何将window.onload = function() { ... }
之类的内容插入page.evaluate
?它返回一个函数,但不是数据。
var phantom = require('phantom');
exports.main = function (url, callback) {
phantom.create(function (ph) {
ph.createPage(function (page) {
page.open(pref + url, function (status) {
page.evaluate(function () {
// here
var data = {};
data.one = document.getElementById("first").innerText;
data.two = document.getElementById("last").innerText;
return data;
},
function (res) {
callback(null, res);
ph.exit();
});
});
});
});
}
在PhantomJS API页面上,我找到onLoadFinished,但它是如何应用的。
答案 0 :(得分:5)
page.open(url, function(status){...})
只是
page.onLoadFinished = function(status){...};
page.open(url);
您可以找到引用here:
另请参阅 WebPage#open 以获取 onLoadFinished 回调的备用挂钩。
由于这是一个基于AJAX的页面,您需要等待数据出现。您只能通过反复检查页面的特定部分来执行此操作。
您可以在phantomjs 安装或here的 examples 目录中找到示例。这可能也适用于通过npm-phantom的phantomjs。
在你的情况下,这将是这样的(缩写):
page.open(pref + url, function (status) {
waitFor(function check(){
return page.evaluate(function () {
// ensure #first and #last are in the DOM
return !!document.getElementById("first") &&
!!document.getElementById("last");
});
}, function onReady(){
page.evaluate(function () {
var data = {};
data.one = document.getElementById("first").innerText;
data.two = document.getElementById("last").innerText;
return data;
});
callback(null, res);
ph.exit();
}, 5000); // some timeout
});