从phantomjs的沙盒环境中向文件系统写东西[英] Writing to filesystem from within phantomjs sandboxed environment

问题描述

我需要遍历网站上的表单并将中间结果保存到文件中.我正在使用 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);
        }
    }
}

显然,我无法从 page.evaluate 中访问 nodejs 的 fs,因此上述方法不起作用.我似乎有几个选择:

  • 将我需要写入的所有内容存储到一个数组中,并将其从 page.evaluate 上下文返回到外部 nodejs 上下文中,然后从那里保存.这需要我没有的内存.
  • 将上述逻辑分解成更小的 page.evaluate 方法,这些方法返回单条数据以保存到文件系统.
  • 以某种方式将一个魔术函数传入 page.evaluate 以写入文件系统.这似乎是不可能的(例如,如果我尝试传入一个调用 fs.writeFile 的函数,我会发现 fs 是未定义的,即使 fs 是我传递的函数中的自由变量?)
  • 返回一个迭代器,当拉取该迭代器时,会产生下一条要写入的数据
  • 在 localhost 上设置一个简单的 Web 服务器,它只接受 POST 请求并将其内容写入文件系统.然后,page.evaluate 代码将向 localhost 发出这些请求.我几乎要试试这个,但我不确定我是否会受到同源政策的影响.

我有什么选择?

推荐答案

你的评价不错,但是你忘记了一个类型: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 之间存在桥梁.另请参阅我的回答此处.

本文地址:https://www.itbaoku.cn/post/1740087.html