如何将运行 PhantomJS作为服务端并远程调用?

How to run PhantomJS as a server and call it remotely?

这可能是一个非常基本的问题。我想 运行 无头浏览器 PhantomJS 作为服务器而不是命令行工具。

一旦 运行ning 我想通过 HTTP 远程调用它。我唯一需要做的就是发送 URL 并取回 HTML 输出。我需要它为 AJAX 应用程序生成 HTML 以使其可搜索。

可能吗?

最简单的方法是制作一个 python 脚本或一些简单的东西来启动服务器并使用 python websockets 与其通信,使用某种网络形式来查询网站和获取页面源。任何自动化都可以通过 cron 作业完成,或者如果您使用 Windows,您可以使用任务功能自动启动 python 脚本。

你可以 运行 PhantomJS 完美地作为网络服务器,因为它有 Web Server Module. The examples folder contains for example a server.js example。此 运行 是独立的,没有任何依赖项(没有节点)。

var page = require('webpage').create(),
    server = require('webserver').create();

var service = server.listen(port, function (request, response) {
    console.log('Request received at ' + new Date());
    // TODO: parse `request` and determine where to go
    page.open(someUrl, function (status) {
        if (status !== 'success') {
            console.log('Unable to post!');
        } else {
            response.statusCode = 200;
            response.headers = {
                'Cache': 'no-cache',
                'Content-Type': 'text/plain;charset=utf-8'
            };
            // TODO: do something on the page and generate `result`
            response.write(result);
            response.close();
        }
    });
});

如果你想 运行 PhantomJS 通过 node.js 那么这也可以使用 phantomjs-node 轻松实现,它是节点的 PhantomJS 桥。

var http = require('http');
var phantom = require('phantom');

phantom.create(function (ph) {
  ph.createPage(function (page) {
    http.createServer(function (req, res) {
      // TODO: parse `request` and determine where to go
      page.open(someURL, function (status) {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        // TODO: do something on the page and generate `result`
        res.end(result);
      });
    }).listen(8080);
  });
});

备注

只要您不同时有多个请求,您就可以按原样自由使用。如果你这样做,那么你要么需要同步请求(因为只有一个 page 对象),要么你需要在每个请求上创建一个新的 page 对象,然后再次 close()你完成了。