Comunicando Node.js y Python (II – la mejor manera)

Como ya os he contado, necesitaba un Web Scraper que fuese disparado bajo demanda del usuario para recuperar de subtitulos.es los títulos de los distintos capítulos, y la manera más sencilla de hacerlo era en Python. Para ello, cada vez que el usuario pidiese al servidor Node.js un contenido, este lo buscaría primero en la BD, y, si no lo encontraba, lo pediría al scraper. De esta manera, si el contenido no existe en subtitulos.es, se pedirá siempre al scraper y este retornará un error, pero si sí existe, este será scrapeado solo la primera vez, encontrándose en veces sucesivas en la BD.

docs-dotcloud-logo

La primera solución consistía en comunicarse con el scraper Python mediante stdout, pero esto tenía varios inconvenientes. El primero, que el scraper debía encontrarse en la misma máquina que Node.js. El segundo, que para objetos más complejos se debía escoger una representación de datos intermedia como JSON. El tercero, que cada vez que se usase el scraper este debía abrir una nueva conexión con la base de datos, en vez de mantener una viva.

Finalmente, la mejor solución (y además la más sencilla), en mi opinión es usar ZeroRPC, una librería de _Remote Procedure Call_ tan __sencilla__ que me cabrea de sobremanera lo complicado del RPC con Java que nos enseñaron en segundo curso, en _Sistemas Distribuidos_. Crear un servidor ZeroRPC en Python es tan sencillo como:

  1. Crear un objeto que herede de object y definir los métodos que se ajusten a tus necesidades.
  2. Crear un objecto zerorpc.Server, pasando como parámetro una nueva instancia de tu objeto.
  3. Enlazar el objeto zerorpc.Server a una dirección tcp.
  4. Ejecutar run() sobre el zerorpc.Server.

Por el lado de Node.js, se ha de:

  1. Crear un objeto zerorpc.Client().
  2. Conectarlo al servidor mediante client.connect().
  3. Invocar los métodos del servidor mediante su nombre, los parámetros que este método requiera, y una función _callback_ a través de la cuál se recibirá el resultado.

Como los ejemplos que da el autor en la web del proyecto son lo suficientemente sencillos y descriptivos, os remito a ellos en vez de repetirlos aquí.

Deja un comentario