2012-04-01 10 views
58

Sto cercando un esempio di richiesta di una pagina Web, in attesa del rendering di JavaScript (JavaScript modifica il DOM) e quindi dell'HTML della pagina.Salvare e visualizzare una pagina Web con PhantomJS e node.js

Questo dovrebbe essere un semplice esempio con un caso d'uso ovvio per PhantomJS. Non riesco a trovare un esempio decente, la documentazione sembra essere interamente basata sull'uso della riga di comando.

+0

Stai cercando di fare questo lato client o lato server? –

+4

@DeclanCook serveride, penso? Clientside richiederebbe all'utente di installare il fantoccio giusto? Che non funzionerebbe se capisco correttamente. Grazie – Harry

+1

Cosa stai tentando di fare con l'html una volta che ce l'hai? Sto cercando di capire cosa stai cercando di ottenere. Phantomjs ha dom manipulation vedi http://code.google.com/p/phantomjs/wiki/QuickStart#DOM_Manipulation stai andando a inviare questo da qualche parte? –

risposta

42

Dai vostri commenti, direi hai 2 opzioni

  1. cercare di trovare un modulo nodo phantomjs - https://github.com/sgentle/phantomjs-node
  2. phantomjs eseguito come un processo figlio all'interno del nodo - http://nodejs.org/api/child_process.html

Modifica:

Sembra che il processo figlio sia suggerito da phantomjs come modo di interagire con il nodo, vedere faq - http://code.google.com/p/phantomjs/wiki/FAQ

Edit:

sceneggiatura

Esempio Phantomjs per ottenere le pagine di markup HTML:

var page = require('webpage').create(); 
page.open('http://www.google.com', function (status) { 
    if (status !== 'success') { 
     console.log('Unable to access network'); 
    } else { 
     var p = page.evaluate(function() { 
      return document.getElementsByTagName('html')[0].innerHTML 
     }); 
     console.log(p); 
    } 
    phantom.exit(); 
}); 
+0

Puoi mostrare un esempio? Prendi una pagina, avvia javascript, ottieni html? – Harry

+9

Puoi semplicemente usare 'page.content', non è necessario valutare nulla. – JLarky

+3

Questo è grandioso, ma ... il tentativo di usare require ('pagina web') in quello script avvolto con nodo perché il modulo della pagina web non è definito nel nodo, è in forma fantasma. Qualcuno ha qualche idea? La "pagina web" è un modulo comune sia per il nodo che per il fantasma? O posso usare richiedono nel contesto fantasma solo in qualche modo? –

4

Ho usato due modi diversi in passato, tra cui il metodo page.evaluate(), che interroga il DOM che Declan ha menzionato. L'altro modo in cui ho passato informazioni dalla pagina web è quello di sputare a console.log() da lì, e l'uso di script phantomjs:

page.onConsoleMessage = function (msg, line, source) { 
    console.log('console [' +source +':' +line +']> ' +msg); 
} 

Potrei anche intrappolare il msg variabile nel onConsoleMessage e cercare alcuni dati incapsulati. Dipende da come si desidera utilizzare l'output.

Poi nello script Nodejs, si dovrà eseguire la scansione del output dello script Phantomjs:

var yourfunc = function(...params...) { 
    var phantom = spawn('phantomjs', [...args]); 
    phantom.stdout.setEncoding('utf8'); 
    phantom.stdout.on('data', function(data) { 
    //parse or echo data 
    var str_phantom_output = data.toString(); 
    // The above will get triggered one or more times, so you'll need to 
    // add code to parse for whatever info you're expecting from the browser 
    }); 
    phantom.stderr.on('data', function(data) { 
    // do something with error data 
    }); 
    phantom.on('exit', function(code) { 
    if (code !== 0) { 
     // console.log('phantomjs exited with code ' +code); 
    } else { 
     // clean exit: do something else such as a passed-in callback 
    } 
    }); 
} 

Speranza che aiuta un po '.

1

tardo aggiornamento nel caso qualcuno inciampa su questa domanda:

Un progetto su GitHub sviluppato da un mio collega mira esattamente a voi aiutare farlo: https://github.com/vmeurisse/phantomCrawl.

Ancora un po 'giovane, sicuramente manca della documentazione, ma l'esempio fornito dovrebbe aiutare a fare il crawling di base.

3

Perché non usare solo questo?

var page = require('webpage').create(); 
page.open("http://example.com", function (status) 
{ 
    if (status !== 'success') 
    { 
     console.log('FAIL to load the address');    
    } 
    else 
    { 
     console.log('Success in fetching the page'); 
     console.log(page.content); 
    } 
    phantom.exit(); 
}); 
1

Ecco una vecchia versione che uso in esecuzione del nodo, esprimere e phantomjs che salva la pagina come file .png. Potresti modificarlo abbastanza velocemente per ottenere l'html.

https://github.com/wehrhaus/sitescrape.git

+0

Per tua informazione, se hai intenzione di utilizzare un link per fornire una risposta, è meglio includere informazioni sufficienti che la tua risposta non diventerà inutile se il collegamento si interrompe in futuro. –

+0

per salvare come png basta fare page.render ('file.png') – Toolkit

7

a V2 della phantomjs-node è abbastanza facile da stampare il codice HTML dopo che è stato elaborato.

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(); 
     }); 
    }); 
    }); 
}); 

Questo mostrerà l'output come sarebbe stato reso con il browser.

+0

permette di rendere HTML dato una stringa? –

+0

Sì, lo fa .... –

Problemi correlati