下面的脚本包含links
数组中的一些网址。函数gatherLinks()
用于从links
数组中的URL的sitemap.xml收集更多URL。一旦links
数组有足够的URL(由变量limit
决定),就会为request()
数组中的每个URL调用函数links
,以便向服务器发送请求,获取使用page.render()
功能响应并保存图像。
问题在于,当我使用PhantomJS 2.0.0运行它时,许多图像缺少大量内容,即PhantomJS可能不会等待加载所有内容。但是当我使用PhantomJS 1.9.8时,所有内容都加载得很好。可能是什么原因?
var webpage = require('webpage');
var system = require('system');
var fs = require('fs');
var links = [];
links = [
"http://somesite.com",
"http://someothersite.com",
.
.
.
];
var index = 0, fail = 0, limit = 20;
finalTime = Date.now();
var gatherLinks = function(link){
var page = webpage.create();
link = link + "/sitemap.xml";
console.log("Fetching links from " + link);
page.open(link, function(status){
if(status != "success"){
console.log("Sitemap Request FAILED, status: " + status);
fail++;
return;
}
var content = page.content;
parser = new DOMParser();
xmlDoc = parser.parseFromString(content, 'text/xml');
var loc = xmlDoc.getElementsByTagName('loc');
for(var i = 0; i < loc.length; i++){
if(links.length < limit){
links[links.length] = loc[i].textContent;
} else{
console.log(links.length + " Links prepared. Starting requests.\n");
index = 0;
page.close();
request();
return;
}
}
if(index >= links.length){
index = 0;
console.log(links.length + " Links prepared\n\n");
page.close();
request();
return;
}
page.close();
gatherLinks(links[++index]);
});
};
var request = function(){
t = Date.now();
var page = webpage.create();
page.open(links[index], function(status) {
console.log('Loading link #' + (index + 1) + ': ' + links[index]);
console.log("Time taken: " + (Date.now() - t) + " msecs");
if(status != "success"){
console.log("Request FAILED, status: " + status);
fail++;
}
page.render("img_200_" + index + ".jpeg", {format: 'jpeg', quality: '100'});
if(index >= links.length-1){
console.log("\n\nAll links done, final time taken: " + (Date.now() - finalTime) + " msecs");
console.log("Requests sent: " + links.length + ", Failures: " + fail);
console.log("Success ratio: " + ((links.length - fail)/links.length)*100 + "%");
page.close();
phantom.exit();
}
index++;
page.close();
request();
});
}
gatherLinks(links[0]);
答案 0 :(得分:0)
PhantomJS没有定义在页面加载过程中何时调用page.open
回调。所以,没有任何错误的声称。
可能您可以使用setTimeout()
添加静态等待金额,这对于动态网站应该有所帮助。还有一些方法可以通过计算使用page.onResourceRequested
发送的请求数以及使用page.onResourceReceived
/ page.onResourceTimeout
/ page.onResourceError
完成的请求数来查看是否有待处理的请求。
如果它实际上是一个PhantomJS错误,那么除了尝试一些命令行开关之外没有太多可以。