PhantomJS 2.0.0 不等待页面加载
PhantomJS 2.0.0 doesn't wait for page to load
下面的脚本在 links
数组中包含一些 URL。函数 gatherLinks()
用于从 links
数组中的 URL 中的 sitemap.xml 中收集更多的 URL。一旦links
数组有足够的URLs(由变量limit
决定),links
数组中的每个URL调用函数request()
来向服务器发送请求,获取响应并使用 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]);
PhantomJS 没有定义在页面加载过程中何时调用 page.open
回调。所以,实际上没有任何错误声明。
可能您可以使用 setTimeout()
添加静态等待量,这对动态站点应该有帮助。还有一些方法,您可以通过计算使用 page.onResourceRequested
发送的请求数和使用 page.onResourceReceived
/page.onResourceTimeout
/page.onResourceError
完成的请求数来查看是否有待处理的请求。
如果它实际上是一个 PhantomJS 错误,那么除了尝试一些命令行开关之外没有什么可以做的。
下面的脚本在 links
数组中包含一些 URL。函数 gatherLinks()
用于从 links
数组中的 URL 中的 sitemap.xml 中收集更多的 URL。一旦links
数组有足够的URLs(由变量limit
决定),links
数组中的每个URL调用函数request()
来向服务器发送请求,获取响应并使用 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]);
PhantomJS 没有定义在页面加载过程中何时调用 page.open
回调。所以,实际上没有任何错误声明。
可能您可以使用 setTimeout()
添加静态等待量,这对动态站点应该有帮助。还有一些方法,您可以通过计算使用 page.onResourceRequested
发送的请求数和使用 page.onResourceReceived
/page.onResourceTimeout
/page.onResourceError
完成的请求数来查看是否有待处理的请求。
如果它实际上是一个 PhantomJS 错误,那么除了尝试一些命令行开关之外没有什么可以做的。