从phantomjs沙盒环境中写入文件系统

时间:2014-12-15 15:42:05

标签: javascript phantomjs

我需要遍历网站上的表单并将中间结果保存到文件中。我正在使用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是函数中的自由变量我通过了?)
  • 返回一个迭代器,当被拉动时,产生下一个要写入的数据
  • 在localhost上设置一个简单的Web服务器,它只接受POST请求并将其内容写入文件系统。然后page.evaluate代码将这些请求发送到localhost。我差点尝试这个,但我不确定我是否会受同源政策的影响。

我有什么选择?

1 个答案:

答案 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