può phantomjs lavoro con node.js?

Vorrei utilizzare phantomjs nel mio node.js script. c’è un phantomjs-nodo libreria.. ma purtroppo l’autore ha utilizzato questo strano caffè codice di script per spiegare cosa sta facendo:

phantom = require 'phantom'

phantom.create (ph) ->
  ph.createPage (page) ->
    page.open "http://www.google.com", (status) ->
      console.log "opened google? ", status
      page.evaluate (-> document.title), (result) ->
        console.log 'Page title is ' + result
        ph.exit()

ora, se dovessi usare phantomjs direttamente con javascript, sarebbe guardare qualcosa come questo:

var page = require('webpage').create();
page.open(url, function (status) {
    var title = page.evaluate(function () {
        return document.title;
    });
    console.log('Page title is ' + title);
});

quindi, in pratica sto cercando di scrivere l’equivalente del primo frammento di codice sopra in normale javascript (leggendo il caffè script documentazione.. questo è quello che ho fatto:

//file name: phantomTest.js

var phantom = require('phantom');

phantom.create(function(ph) {
    ph.createPage(function(page) {
        page.open('http://www.google.com', function(status) {
            console.log('opened google?', status);
            var title = page.evaluate(function() {
                return document.title;
            });
            console.log('page title is ' + title);              
        });
    });
    ph.exit();
});

purtroppo non funziona! Se ho eseguito

node phantomTest.js

sul guscio, non succede nulla.. nulla ritorna e il processo non si ferma.. qualche idea?

aggiornamento:

Ho appena letto questo nel phantomjs faq:

Q: Perché è PhantomJS non è scritto come Node.js modulo?

Rispondere che: “Nessuno può servire a due padroni”.

Una spiegazione più dettagliata è come indicato di seguito.

Ora come ora, è tecnicamente molto difficile farlo.

Ogni Node.js il modulo è essenzialmente “slave” per il nucleo di Node.js,
cioè “il maestro”. Nel suo stato attuale, PhantomJS (e il suo
WebKit) deve avere il pieno controllo (in modalità sincrona, la materia, oltre
tutto: ciclo di eventi, stack di rete, e l’esecuzione di JavaScript.

Se l’intenzione è solo sull’utilizzo di PhantomJS destra da uno script
in esecuzione all’interno di Node.js, ad un “loose” rilegatura può essere raggiunto da
il lancio di un PhantomJS di processo e di interagire con esso.

mmm.. potrebbe avere qualcosa a che fare con esso? ma poi che tutta la libreria non avrebbe senso!

aggiorna 2:

Ho trovato questo codice web che fa la stessa cosa:

var phantom = require('phantom');
phantom.create(function(ph) {
  return ph.createPage(function(page) {
    return page.open("http://www.google.com", function(status) {
      console.log("opened google? ", status);
      return page.evaluate((function() {
        return document.title;
      }), function(result) {
        console.log('Page title is ' + result);
        return ph.exit();
      });
    });
  });
});

purtroppo non lavorano.. stesso risultato!!!

  • Chiamare qualcosa di “stupido” perché non hai capito come funziona e/o non è possibile farlo funzionare nel tuo caso è normale rude.
  • Inoltre, c’è github.com/sheebz/phantom-proxy che è più consigliato rispetto ad altri Node.js i ponti. Persone sono state utilizzando bridging PhantomJS con Ruby, PHP, Node.js con successo variabile.
  • Mi scuso per la mia forte formulazione, la prendo dalla domanda.. io anche dare un’occhiata a phantom-proxy.. alla fine del secolo e il mio obiettivo è quello di far funzionare le cose, non per sminuire le altre persone lo sforzo.
  • Questo è obsoleto e dovrebbe essere modificati o rimossi. Esso non riflettere l’ultima phantomjs-nodo pacchetto e capacità.
InformationsquelleAutor abbood | 2013-04-01

 

7 Replies
  1. 39

    phantomjs-nodo non è ufficialmente supportata npm pacchetto per phantomjs. Invece, si attua una “nauseously intelligente ponte” tra il nodo e il fantasma con la creazione di un server web che utilizza i websocket per servire come un canale IPC tra il nodo e il fantasma. Io non sto inventando:

    Modo in cui comunichiamo con PhantomJS da spinning di un’istanza di ExpressJS, apertura Fantasma in un sottoprocesso, e che fa riferimento ad una speciale pagina web che trasforma la presa.io messaggi di avviso() chiama. Quelli alert() chiamate sono raccolti da Fantasma e ci si va!

    Quindi non sarei sorpreso se phantomjs-nodo funziona, non funziona, non funziona automaticamente, o fallisce clamorosamente. Né mi aspetto di chiunque altro che l’autore di phantomjs-nodo per essere in grado di risolvere i problemi di phantomjs-nodo.

    La risposta alla tua domanda è la risposta da phantomjs faq: No. Phantom e il nodo di differenze inconciliabili. Entrambi aspettano di avere il controllo completo sui fondamentali a basso livello di funzionalità, come il ciclo di eventi, lo stack di rete, e JS esecuzione in modo che non possano cooperare all’interno dello stesso processo.

    • wow che è brutto! allora la domanda successiva è: qual è il modo migliore per raschiare una pagina dinamica che utilizza jquery?
    • Non credo sia possibile. Qual è il tuo obiettivo?
    • perché non dovrebbe essere possibile? penso di aver trovato il mio risposta anche se.. come sempre.. io inizio prendendo incredibilmente difficile percorso, per trovare una soluzione più semplice lol.. io ti do la risposta corretta premio..
    • Sarebbe possibile se si blocca un completo DOM e JS runtime di attuazione all’interno di jQuery, ma non pensavo che era una soluzione fattibile.
    • è! e funziona come un fascino per me adesso.. semplicemente dump raw html in una struttura di Dom.. jquery, magia per attraversare.. e tutti sono felici! guarda il mio indignato aggiornamento alla mia domanda di cui sopra 😉
    • Woo, magia! 😀
    • Puoi dire come installare jsdom per windows ?
    • io odio windows con una passione così l’uomo non c’è molto di aiuto che posso offrire è che c’ho paura
    • questo può bee troppo tardi, ma è possibile raschiare le pagine web dinamiche utilizzando il injectJs metodo dell’oggetto page.
    • Ho riscritto phantom-node e leader lo sforzo per correggere tutti i bug. Dare v2 una prova e fammi sapere.

  2. 9

    Si potrebbe anche dare phridge una prova. Il tuo esempio sarebbe stato scritto come:

    var phantom;
    
    //spawn a new PhantomJS process
    phridge.spawn()
        .then(function (ph) {
            phantom = ph;
            return phantom.openPage("http://www.google.com");
        })
        .then(function (page) {
            return page.run(function () {
                //this function runs inside PhantomJS with this bound to a webpage instance
                return this.title;
            });
        })
        .then(function (title) {
            console.log('Page title is ' + title);
            //terminates the process cleanly
            phantom.dispose();
        });
  3. 9

    Ora sono il nuovo gestore per phantom-node pacchetto. Non utilizzare coffeescript più. Si può fare qualcosa di simile

    var phantom = require('phantom');
    
    phantom.create().then(function(ph) {
      ph.createPage().then(function(page) {
        page.open('https://stackoverflow.com/').then(function(status) {
          console.log(status);
          page.property('content').then(function(content) {
            console.log(content);
            page.close();
            ph.exit();
          });
        });
      });
    });

    La nuova versione è molto più veloce e resistente. Inoltre, non utilizzare websockets più.

  4. 1

    modificare il codice per questo, e sarà di lavoro:

     var phantom = require('phantom');
     phantom.create(function(ph) {
       ph.createPage(function(page) {
         page.open("http://www.google.com", function(status) {
           console.log("opened google? ", status);
           page.evaluate((function() {
             return document.title;
           }), function(result) {
             console.log('Page title is ' + result);
             ph.exit();
           });
         });
       });
     });
  5. 1

    Si potrebbe fosso PhantomJS come ho fatto perché era troppo un dolore con questi wrapper non funziona bene, e andare con Zombie.js che è molto popolare anche.

  6. 1

    Sembra che questo è lavoro..

    var phantom = require('phantom');
    
    phantom.create().then(function(ph) {
      ph.createPage().then(function(page) {
        page.open('https://stackoverflow.com/').then(function(status) {
          console.log(status);
          page.property('content').then(function(content) {
            console.log(content);
            page.close();
            ph.exit();
          });
        });
      });
    });

    Ma sto cercando di generare una pagina html con alcuni file di script esterno. Non è in grado di iniettare un file di script. Ho provato come riportato di seguito. Richiamata non è di ritorno dalla linea page.injectJs('./jQuery.min.js',function() {

    var phantom = require('phantom');
    
        phantom.create().then(function(ph) {
          ph.createPage().then(function(page) {
            page.injectJs('./jQuery.min.js', function() {
              page.property('content').then(function(content) {
                console.log(content);
                page.close();
                ph.exit();
              });
            });
          });
        });
  7. 0

    Ho vissuto gli stessi problemi, come si fa, e a quanto pare, c’è un problema noto con phantomjs-node e versioni più recenti di nodejs. Sembra smesso di funzionare da qualche parte intorno al nodo 0.9.3, secondo i commenti in questione. Quindi, fino a che è stato risolto, è necessario effettuare il downgrade nodejs, o provare un modulo diverso, come nodo-phantom, o semplicemente utilizzare exec/spawn.

Lascia un commento