2013-06-25 2 views
0

Я пытаюсь изменить этот скрипт: https://github.com/ariya/phantomjs/blob/master/examples/render_multi_url.js, так что вместо «rendermulti-1.png (и т. Д.)» Выходные файлы будут называться для веб-страниц, они являются шапками ,phantomjs render_multi_url.js изменить выходные имена файлов

Вот что я пробовал.

// 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, все ломается.

Любая помощь вообще будет оценена по достоинству.

Спасибо!

ответ

2

Есть звонки urls.shift(), поэтому это нехороший подход к вычислению filname с arrayOfUrls.

Вы прав: '/' является недопустимым символом, поэтому вам нужно заменить его на общий токен (как?, ...).

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(); 
}); 
+0

Спасибо! Идеальное решение и достаточное объяснение, чтобы помочь мне продолжить изучение. Ура! – wagonlips

0

да, я думаю, вы могли бы просто изменить этот метод

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

клиенту ваши имена файлов вывода.

PS. Я хочу спросить некоторых из них: вы получаете эту проблему: , если вы дадите этот js для рендеринга 90 html-файлов, но в большинстве случаев он не может отобразить их все, мне нужно выполнить много раз, чтобы закончить все эти 90 файлов.

и я пытаюсь разделить мои html-файлы на небольшой массив, а затем называть это js для рендеринга, но в этом js-файле существует метод exit, он завершит мой процесс. поэтому я не мог зацикливать все эти маленькие массивы url-файлов html, чтобы закончить их один раз.

Смежные вопросы