2

Phantomjs 1.7 (ブラウザーをシミュレート) を利用するアプリケーションを構築し、Python バックエンドを作成していくつかのイベントを起動し、データを収集しようとしています。

問題は、Phantomjs と私の Python プログラムの 2 つのプロセスが双方向で通信する必要があることです。問題は、内部page.evaluateで次のことができないことです。

  • 「fs」などの複雑なオブジェクトを渡す (stdin から読み取る)
  • Python スクリプトに接続する WebSocket を作成する
  • 他の形式のプロセス間通信は制限されています

だから私の解決策は簡単です:

  • 表示しているページに socket.io js を挿入します。
  • gevent-socketio を使用して実装されている Python サーバーに接続します

page.evaluate 内から接続しようとすると、次のようになります。

Unexpected response code: 404

Phantomjs スクリプトは次のとおりです。

var page   = require("webpage").create();
page.onAlert = function(msg) { console.log("alert>>>" + msg); };
page.onConsoleMessage= function(msg) { console.log(msg); };

page.open("http://google.com", function() {
  page.injectJs("socket.io.js");
  page.evaluate(function() {
    var socket = new io.Socket();
    socket.connect('localhost:5051/test');
    socket.on('connect',function() {
      console.log('Client has connected to the server!');
    });
    // Add a connect listener
    socket.on('signal',function(data) {
      console.log('Received a signal: ',data);
    });
    // Add a disconnect listener
    socket.on('disconnect',function() {
      console.log('The client has disconnected!');
    });
    // Sends a message to the server via sockets
    socket.send("kakalq");
  });
    //phantom.exit();
});

サーバー側の Python スクリプトは次のとおりです。

from socketio import socketio_manage
from socketio.server import SocketIOServer
from socketio.namespace import BaseNamespace

class MyNs(BaseNamespace):
  def initialize(self):
    print "connected"
    self.emit('connect')

  def disconnect(self, *args, **kwargs):
    print "diconnecting"
    super(MyNs, self).disconnect(*args, **kwargs)

 def signal(self, message):
   print "received signal", message
   self.emit("okay", "this will be sent to js")

 def start(environ, start_response):
   if environ['PATH_INFO'].startswith('/test'):
     return socketio_manage(environ, { '/test': MyNs })


if __name__ == "__main__":
  server = SocketIOServer( ('', 5051), start,policy_server=False )
  server.serve_forever()
4

1 に答える 1

3

機能しない理由についての私の推測では、PhantomJS は古い非推奨バージョンの WebSocket しかサポートしていないということです。PhantomJS 2.0 が現在のバージョンの WebSocket をサポートするには、数か月待つ必要があります。

于 2013-04-11T09:54:45.740 に答える