0
私はPhantomJS
というURLを訪問して、並行してasync.map()
を使用して保存する必要があります。 RAMを解放するために開かれたページを閉じる必要があることを考えると、私はpage.close()を使用する必要があると信じています。私はそれをしました。async.waterfall()と併用するとすぐにphantom.exit()が実行されます
しかし、終了したらPhantomを終了したいので、これを追加しようとしましたが、async.waterfall()
ですぐに存在します。
どうすればこのようにすることができますか?
var fs = require("fs");
var async = require("async");
var urls = [
{"url": "https://www.google.com", "html": "google"},
{"url": "http://yahoo.com", "html": "yahoo"}
];
async.waterfall([
function (callback2) {
async.map(urls, function (a, callback) {
var resourceWait = 300,
maxRenderWait = 5000,
url = a.url;
var page = require('webpage').create(),
count = 0,
forcedRenderTimeout,
renderTimeout;
page.viewportSize = {width: 1440, height: 900};
function doRender() {
var content = page.content;
var path = '../public/html/' + a.html + '.html';
fs.write(path, content, 'w');
page.close();
}
page.onResourceRequested = function (req) {
count += 1;
clearTimeout(renderTimeout);
};
page.onResourceReceived = function (res) {
if (!res.stage || res.stage === 'end') {
count -= 1;
if (count === 0) {
renderTimeout = setTimeout(doRender, resourceWait);
}
}
};
page.open(url, function (status) {
if (status !== "success") {
console.log('Unable to load url');
} else {
forcedRenderTimeout = setTimeout(function() {
doRender();
}, maxRenderWait);
}
});
callback();
});
callback2(null, 'done!');
}
], function (err, result) {
phantom.exit();
});