我需要遍历网站上的表单并将中间结果保存到文件中。我正在使用phantomjs'page.evaluate
,但我无法从page.evaluate
的沙盒环境中访问文件系统。我有这样的事情:
for (var i = 0; i<option1.length; i++){
for (var ii = 0; ii<option2.length; ii++){
for (var iii = 0; iii<option3.length; iii++){
...
//I found what I want to save
fs.write("someFileName", someData);
}
}
}
显然,我无法从fs
内访问nodejs'page.evaluate
,因此上述功能不起作用。我似乎有几个选择:
page.evaluate
上下文返回到外部的nodejs上下文中,然后从那里保存。这将需要我没有的内存。page.evaluate
方法,这些方法返回单个数据以保存到文件系统。 page.evaluate
魔术函数来写入文件系统。这似乎是不可能的(例如,如果我尝试传入一个调用fs.writeFile
的函数,我得到fs
未定义,即使fs
是函数中的自由变量我通过了?)page.evaluate
代码将这些请求发送到localhost。我差点尝试这个,但我不确定我是否会受同源政策的影响。我有什么选择?
答案 0 :(得分:2)
您的评价合理,但您遗忘了一种类型:onCallback
。您可以在幻像上下文中注册事件处理程序,并通过此回调将数据从页面上下文推送到文件:
page.onCallback = function(data) {
if (!data.file) {
data.file = "defaultFilename.txt";
}
if (!data.mode) {
data.mode = "w";
}
fs.write(data.file, data.str, data.mode);
};
...
page.evaluate(function(){
for (var i = 0; i<option1.length; i++){
for (var ii = 0; ii<option2.length; ii++){
for (var iii = 0; iii<option3.length; iii++){
...
// save data
if (typeof window.callPhantom === 'function') {
window.callPhantom({ file: "someFileName", str: someData, mode: "a" }); // append
}
}
}
}
});
请注意,PhantomJS不能在Node.js中运行。虽然Node.js和PhantomJS之间有桥梁。另请参阅我的回答here。