我目前正在开发一个PhantomJS项目,用于评估CSV文件指定的网页列表。我在我的程序中安装了NPM和node.js。
以下是该计划:
var async = require("async");
var webpage = require('webpage'),
fs = require('fs');
var file_h = fs.open('C:\\Users\\morgan\\Documents\\FantasyApp\\URLPlayerListActive.txt', 'r');
var urls = [];
while (!file_h.atEnd()) {
urls.push(file_h.readLine());
}
async.eachSeries(urls, function (url, done) {
console.log(url)
var page = webpage.create();
page.open("http://"+url, function (status) {
if (status !== 'success') {
console.log('Unable to access network');
console.log(status)
var closeresults = page.close();
} else {
var evalresults = page.evaluate(function() {
try {
table2csv('pgl_basic');
try {
ga('send','event','Tool','Action','CSV');
}
catch (e) {}
var list = document.querySelectorAll('#csv_pgl_basic');
var stats = [];
for (var i = 0; i < list.length; i++) {
stats.push(list[i].innerText);
}
return stats;
var closeresults = page.close();
} catch (e) {
console.log(e);
}
});
try {
fs.write("C:\\Users\\morgan\\Documents\\FantasyApp\\Data\\"+url+".txt", evalresults.join('\n'), 'w');
var closeresults = page.close();
} catch(e) {
console.log(e);
var closeresults = page.close();
}
}
done();
});
});
phantom.exit();
我的症状是进程内存增加,直到达到我的Windows最大值并崩溃,或者它完成了我的列表并且进程永远挂起。
我可以针对上述任何一个问题实施解决方案,但由于它们都发生了,我无法使用此脚本。
我正在寻找帮助防止内存泄漏或只是在脚本完成后关闭我的进程。这些症状可能源于相同的根本原因。
答案 0 :(得分:1)
如果页面没有正确地进行垃圾回收,您可以尝试反复使用同一个实例。另一件事是你应该在脚本实际完成时调用phantom.exit
,例如在eachSeries
的回调中。
var page = webpage.create();
async.eachSeries(urls, function (url, done) {
console.log(url)
page.open("http://"+url, function (status) {
if (status !== 'success') {
console.log('Unable to access network');
console.log(status)
} else {
var evalresults = page.evaluate(function() {
try {
table2csv('pgl_basic');
try {
ga('send','event','Tool','Action','CSV');
}
catch (e) {}
var list = document.querySelectorAll('#csv_pgl_basic');
var stats = [];
for (var i = 0; i < list.length; i++) {
stats.push(list[i].innerText);
}
return stats;
} catch (e) {
console.log(e);
}
});
try {
fs.write("C:\\Users\\morgan\\Documents\\FantasyApp\\Data\\"+url+".txt", evalresults.join('\n'), 'w');
} catch(e) {
console.log(e);
}
}
done();
});
}, function(err){
phantom.exit();
});
其他一些问题:
page.close
并未返回任何内容,因此closeresults
将为undefined
。return
之后的任何语句都无法执行。page
未在页面上下文中定义(page.evaluate
内),因此page.close();
会产生错误,可能会破坏您的代码。请注册onConsoleMessage
和onError
个活动以查看是否有错误。