phantomjs render_multi_url.js修改输出文件名

phantomjs render_multi_url.js modify output filenames

本文关键字:修改 输出 js 文件名 url render multi phantomjs      更新时间:2023-09-26

我正在尝试修改此脚本: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函数中时,情况就坏了。

任何帮助都将不胜感激。

谢谢!

有对urls.shift()的调用,所以用arrayOfUrls计算域名不是一个好方法。

你是对的:"/"是一个无效字符,所以你必须用通用令牌(如?,…)替换它。

另外,因为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();
});

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

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

以客户您的输出文件名。

PS。我想问一些人,你明白这个问题吗:如果你给这个js来渲染90个html文件,但大多数时候它不能全部渲染,我需要执行很多次才能完成所有90个文件。

我试图将我的html文件拆分成一个小数组,然后调用这个js进行渲染,但在这个js文件中,有一个exit方法,它将退出我的进程。所以我无法循环所有这些小的html文件url数组来一次性完成它们。