Javascript phantomjs render_multi_url.js修改输出文件名

Javascript phantomjs render_multi_url.js修改输出文件名,javascript,phantomjs,webpage-screenshot,Javascript,Phantomjs,Webpage Screenshot,我正试图修改这个脚本:这样,输出文件将以它们所属的网页命名,而不是“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 Fu

我正试图修改这个脚本:这样,输出文件将以它们所属的网页命名,而不是“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呈现到文件
var RenderUrlsToFile,arrayOfUrls,system;
系统=要求(“系统”);
/*
呈现给定的URL
@要呈现的URL的参数数组
@完成每个URL(包括最后一个URL)后调用的param callbackPerUrl函数
@完成所有操作后调用的param callbackFinal函数
*/
RenderUrlsToFile=函数(URL、callbackPerUrl、CallBacknal){

var getFilename,next,page,retrieve,urleindex,webpage,pagename;//有对
url.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();
});
//将多个URL呈现到文件
var RenderUrlsToFile,arrayOfUrls,system;
系统=要求(“系统”);
/*
呈现给定的URL
@要呈现的URL的参数数组
@完成每个URL(包括最后一个URL)后调用的param callbackPerUrl函数
@完成所有操作后调用的param callbackFinal函数
*/
RenderUrlsToFile=函数(URL、callbackPerUrl、CallBacknal){
var getFilename,next,page,retrieve,urlIndex,webpage,pagename;//1){
arrayOfUrls=Array.prototype.slice.call(system.args,1);
}否则{
log(“用法:phantomjs render_multi_url.js[domain.name1,domain.name2,…]);
arrayOfUrls=[“www.google.com”、“www.bbc.co.uk”、“www.phantomjs.org];
}
RenderUrlsToFile(arrayOfUrls)(函数(状态、url、文件){
如果(状态!=“成功”){
返回console.log(“无法呈现“'+url+””);
}否则{
返回console.log(“呈现的”'+url+“'at'+file+””);
}
}),函数(){
返回phantom.exit();
});

是的,我想您可以修改这个方法

getFilename = function() {
    return "rendermulti-" + urlIndex + ".png";       //<--
    return pagename + ".png";                        //<--
};
getFilename=function(){

return“rendermulti-”+urleindex+“.png”;//谢谢!一个完美的解决方案,足够的解释来指导我进一步学习。干杯!