【问题标题】:How to control a CasperJS automation script from a remote jquery client using socket.io如何使用 socket.io 从远程 jquery 客户端控制 CasperJS 自动化脚本
【发布时间】:2015-12-17 15:06:19
【问题描述】:

我在 CasperJS 中有一个自动化脚本,它控制一个 PhantomJS 无头浏览器,该浏览器登录到一个站点,通过多个页面/表单输入数据。

在同一台物理服务器上,我使用 PHP/MySQL 为 CRM 客户端网站提供服务。在 CRM 网站上,我希望能够:

  1. 触发远程 CasperJS 脚本以浏览远程站点并登录并填写表单
  2. 读取输出流(即“第 1 页完成,第 2 页完成”等)
  3. 在 CasperJS 脚本执行时向客户端用户显示状态更新

我认为 socket.io 是这里的门票。但是,我要说这一切都错了吗?我试图避免运行硒服务器。我检查了this answer on SO,但不是在寻找屏幕截图,而是在寻找要显示在客户端网站上的 CasperJS 控制台输出。

【问题讨论】:

  • This looks promising 它使用服务器上的 PHP 来运行 CasperJS 脚本并将结果输出到一个数组中。我可以在客户端通过 ajax 运行它。

标签: socket.io phantomjs casperjs


【解决方案1】:

我曾经有过类似的任务,并使用带有 Socket.io 的本地 Express.js 服务器设计了一个解决方案。

您将使用 node.js 启动此服务器,然后通过向 http://127.0.0.1:9000 发出 POST 请求从 PHP 将任务传递给它(我使用了出色的 Requests 库)。

这是我的脚本的简化版本:

var fs = require("fs");
var express = require("express");
var app = express();
var server = require("http").Server(app);
var io = require("socket.io")(server);
var iosocket;

// Express middleware to get variables from POST request
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true })); 


// Create websocket connection
io.on("connection", function(socket){

    console.log('io.js connection');
    iosocket = socket;
});

// Receieve task from external POST request
app.post("/scrape", function(req, res){

    res.send("Request accepted");

    // Url to parse
    var url = req.body.url;

    // Variable to collect data from scraper
    var data = [];

    // Launch scraping script
    var spawn = require('child_process').spawn,
        child = spawn('/path/to/casperjs', ['/path/to/scrape/script.js', url]);

    console.log("Spawned parser");

    // Receieve data from script
    child.stdout.on('data', function (data) {

        var message = data.toString();

        data.push(message);

        // Send data to the web client
        iosocket.emit("message", message);
    });

    // On error
    child.stderr.on('data', function (data) {
        console.log('stderr: ' + data.toString());
    });

    // On scraper exit
    child.on('close', function (code) {
        console.log("Scraper exited with code: " + code);
        // 
        // Put data into a file or a database, for example
        // 
        fs.writeFileSync("path/to/file/results_" + (new Date()).getTime() + ".json", JSON.stringify(data));
    });      

});

// Bind app to port @ localhost
server.listen(9000, "127.0.0.1");

Solution with CasperJS/Phantomjs server 很有趣,但是人们指出它会泄漏内存,如果您运行短暂的 CasperJS 脚本,这可能不会发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多