2013-04-06 13 views
9

CasperJS viene chiamato da PHP utilizzando un comando exec(). Dopo che CasperJS fa il suo lavoro come recuperare parti di una pagina web, come possono essere restituiti i dati recuperati a PHP?CasperJS che passa dati a PHP

risposta

8

È possibile reindirizzare l'output da stdout a un array.

Su this pagina che dice che si può fare:

string exec (string $command [, array &$output [, int &$return_var ]]) 

E continua dicendo:

Se l'argomento di uscita è presente, allora la matrice specificata sarà riempito con ogni linea di uscita dal comando.

Quindi in pratica si può eseguire exec ('comando casperjs qui, $ array_here);

24

Penso che il modo migliore per trasferire i dati da CasperJS a un'altra lingua come PHP sia eseguire lo script CasperJS come servizio. Poiché CasperJS è stato scritto su PhantomJS, CasperJS può utilizzare un modulo server Web incorporato di PhantomJS denominato Mongoose.

Per informazioni su come funziona il server Web incorporato vedere here

Ecco un esempio di come uno script CasperJS può avviare un server web.

//define ip and port to web service 
var ip_server = '127.0.0.1:8585'; 

//includes web server modules 
var server = require('webserver').create(); 

//start web server 
var service = server.listen(ip_server, function(request, response) { 

    var links = []; 
    var casper = require('casper').create(); 

    function getLinks() { 
     var links = document.querySelectorAll('h3.r a'); 
     return Array.prototype.map.call(links, function(e) { 
      return e.getAttribute('href') 
     }); 
    } 

    casper.start('http://google.fr/', function() { 
     // search for 'casperjs' from google form 
     this.fill('form[action="/search"]', { q: 'casperjs' }, true); 
    }); 

    casper.then(function() { 
     // aggregate results for the 'casperjs' search 
     links = this.evaluate(getLinks); 
     // now search for 'phantomjs' by filling the form again 
     this.fill('form[action="/search"]', { q: 'phantomjs' }, true); 
    }); 

    casper.then(function() { 
     // aggregate results for the 'phantomjs' search 
     links = links.concat(this.evaluate(getLinks)); 
    }); 

    // 
    casper.run(function() { 
      response.statusCode = 200; 
      //sends results as JSON object 
      response.write(JSON.stringify(links, null, null)); 
      response.close();    
    }); 

}); 
console.log('Server running at http://' + ip_server+'/'); 
+8

Mentre sono d'accordo che si tratta di una buona tecnica, in teoria, in pratica casper non liberare phantomjs risorse, non sembra essere in aumento in modo lineare l'utilizzo di memoria con ogni richiesta. Ho provato ad aggiungere '' 'casper.clear()' '' e anche a hacking clear() a '' 'chiama this.page.close()' '' (dalla pagina clear()). Mentre chiamare close sembra aiutarlo a non risolvere il problema. – danmux

Problemi correlati