我正在尝试修改此脚本:https://github.com/ariya/phantomjs/blob/master/examples/render_multi_url.js以便输出文件不是“rendermulti-1.png(等等)”,而是为它们所属的网页命名。
这是我尝试过的。
// Render Multiple URLs to file
var RenderUrlsToFile, arrayOfUrls, system;
system = require("system");
/*
Render given urls
@param array of URLs to render
@param callbackPerUrl Function called after finishing each URL, including the last URL
@param callbackFinal Function called after finishing everything
*/
RenderUrlsToFile = function(urls, callbackPerUrl, callbackFinal) {
var getFilename, next, page, retrieve, urlIndex, webpage, pagename ; //<--
urlIndex = 0;
webpage = require("webpage");
page = null;
// replace forward slashes with underscores //<--
pagename = arrayOfUrls[urlIndex].replace(/\//g,'_'); //<--
getFilename = function() {
// return "rendermulti-" + urlIndex + ".png"; //<--
return pagename + ".png"; //<--
};
next = function(status, url, file) {
page.close();
callbackPerUrl(status, url, file);
return retrieve();
};
retrieve = function() {
var url;
if (urls.length > 0) {
url = urls.shift();
urlIndex++;
page = webpage.create();
page.viewportSize = {
width: 800,
height: 600
};
page.settings.userAgent = "Phantom.js bot";
return page.open("http://" + url, function(status) {
var file;
file = getFilename();
if (status === "success") {
return window.setTimeout((function() {
page.render(file);
return next(status, url, file);
}), 200);
} else {
return next(status, url, file);
}
});
} else {
return callbackFinal();
}
};
return retrieve();
};
arrayOfUrls = null;
if (system.args.length > 1) {
arrayOfUrls = Array.prototype.slice.call(system.args, 1);
} else {
console.log("Usage: phantomjs render_multi_url.js [domain.name1, domain.name2, ...]");
arrayOfUrls = ["www.google.com", "www.bbc.co.uk", "www.phantomjs.org"];
}
RenderUrlsToFile(arrayOfUrls, (function(status, url, file) {
if (status !== "success") {
return console.log("Unable to render '" + url + "'");
} else {
return console.log("Rendered '" + url + "' at '" + file + "'");
}
}), function() {
return phantom.exit();
});
脚本运行,但在第一个提供的URL之后命名所有文件,并忽略'/'之后的任何内容。
我怀疑我正在制作一些基本错误,可能与范围有关,但是当我将新变量移动到getFileName函数时,事情会中断。
任何帮助都将受到赞赏。
谢谢!
答案 0 :(得分:2)
有urls.shift()
的来电,因此用arrayOfUrls
计算filname不是一个好方法。
你是真的:'/'是一个无效字符,所以你必须用通用标记替换它(如?,...)。
Alos,因为page.open
已经包含url
,所以最好用它来计算文件名。
解决方案可能是:
// Render Multiple URLs to file
var RenderUrlsToFile, arrayOfUrls, system;
system = require("system");
/*
Render given urls
@param array of URLs to render
@param callbackPerUrl Function called after finishing each URL, including the last URL
@param callbackFinal Function called after finishing everything
*/
RenderUrlsToFile = function(urls, callbackPerUrl, callbackFinal) {
var getFilename, next, page, retrieve, urlIndex, webpage, pagename ; //<--
urlIndex = 0;
webpage = require("webpage");
page = null;
getFilename = function(url) {
return url.replace(/\//g,'_')+ ".png"; //<--
};
next = function(status, url, file) {
page.close();
callbackPerUrl(status, url, file);
return retrieve();
};
retrieve = function() {
var url;
if (urls.length > 0) {
url = urls.shift();
urlIndex++;
page = webpage.create();
page.viewportSize = {
width: 800,
height: 600
};
page.settings.userAgent = "Phantom.js bot";
return page.open("http://" + url, function(status) {
var file;
file = getFilename(url);
if (status === "success") {
return window.setTimeout((function() {
page.render(file);
return next(status, url, file);
}), 200);
} else {
return next(status, url, file);
}
});
} else {
return callbackFinal();
}
};
return retrieve();
};
arrayOfUrls = null;
if (system.args.length > 1) {
arrayOfUrls = Array.prototype.slice.call(system.args, 1);
} else {
console.log("Usage: phantomjs render_multi_url.js [domain.name1, domain.name2, ...]");
arrayOfUrls = ["www.google.com", "www.bbc.co.uk", "www.phantomjs.org"];
}
RenderUrlsToFile(arrayOfUrls, (function(status, url, file) {
if (status !== "success") {
return console.log("Unable to render '" + url + "'");
} else {
return console.log("Rendered '" + url + "' at '" + file + "'");
}
}), function() {
return phantom.exit();
});
答案 1 :(得分:0)
getFilename = function() {
return "rendermulti-" + urlIndex + ".png"; //<--
return pagename + ".png"; //<--
};
向客户提供输出文件名。
PS。我想问一些问题,你有没有得到这个问题: 如果你给这个js渲染90个html文件,但是大部分时间都无法渲染它们,我需要多次执行才能完成所有这90个文件。
我尝试将我的html文件拆分成小数组,然后调用这个js进行渲染,但是在这个js文件中,有一个exit
方法,它会退出我的进程。所以我无法循环所有这些小的html文件url数组来完成它们一次。