2012-04-01 11 views
58

Estoy buscando un ejemplo de solicitud de una página web, esperando a que se muestre JavaScript (JavaScript modifica el DOM) y luego agarre el HTML de la página.Guarde y represente una página web con PhantomJS y node.js

Esto debería ser un ejemplo simple con un caso de uso obvio para PhantomJS. No puedo encontrar un ejemplo decente, la documentación parece ser todo sobre el uso de línea de comandos.

+0

¿Está buscando hacer este lado del cliente o del lado del servidor? –

+4

@DeclanCook en el lado del servidor, ¿no? Clientside requeriría que el usuario instale el fantasma ¿verdad? Lo cual no funcionaría si lo entiendo correctamente. Gracias – Harry

+1

¿Qué estás tratando de hacer con el html una vez que lo tienes? Tratando de entender lo que estás tratando de lograr. Phantomjs tiene dom manipulación ver http://code.google.com/p/phantomjs/wiki/QuickStart#DOM_Manipulation ¿vas a enviar esto a alguna parte? –

Respuesta

42

Desde sus comentarios, yo supongo que tienes 2 opciones

  1. tratar de encontrar un módulo de nodo PhantomJS - https://github.com/sgentle/phantomjs-node
  2. PhantomJS ejecuta como un proceso hijo en el interior del nodo - http://nodejs.org/api/child_process.html

Editar:

Parece que el proceso secundario es sugerido por phantomjs como una forma de interactuar con el nodo, consulte faq - http://code.google.com/p/phantomjs/wiki/FAQ

Editar:

guión

Ejemplo PhantomJS para conseguir las páginas de marcado 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

¿Puedes mostrar un ejemplo? Coge una página, ejecuta javascript, obtén html? – Harry

+9

Puedes simplemente usar 'page.content', no hay necesidad de evaluar nada. – JLarky

+3

Esto es genial, pero ... la dificultad de uso requiere ('página web') en ese script envuelto con un nodo porque el módulo de página web no está definido en el nodo, está en forma fantasma. ¿Alguien tiene alguna idea? ¿Es la 'página web' un módulo común tanto para el nodo como para el fantasma? ¿O puedo usar require en el contexto fantasma solo de alguna manera? –

4

He utilizado dos maneras diferentes en el pasado, incluyendo el método page.evaluate() que consulta la DOM que Declan mencionó. La otra forma he pasado información de la página web es escupirla a console.log() a partir de ahí, y en el uso de la escritura PhantomJS:

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

yo podría también atrapan msg variable en el onConsoleMessage y busque algunos datos encapsulados. Depende de cómo quiera usar la salida.

Luego, en el guión nodejs, que tendría que escanear la salida del 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 
    } 
    }); 
} 

Esperanza que ayuda alguna.

1

tardío de actualización en caso de que alguien se topa con esta pregunta:

Un proyecto en GitHub desarrollado por un colega mío apunta exactamente a ayudarle a hacer eso: https://github.com/vmeurisse/phantomCrawl.

Todavía es un poco joven, sin duda falta algo de documentación, pero el ejemplo proporcionado debería ayudar a hacer el rastreo básico.

3

¿Por qué no usar esto?

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

Aquí hay una versión antigua que uso correr nodo, expresar y PhantomJS lo que ahorra la página como .png. Podría ajustarlo bastante rápido para obtener el html.

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

+0

FYI, si va a utilizar un enlace para proporcionar una respuesta, es mejor incluir suficiente información para que su respuesta no sea inútil si el enlace se rompe en algún momento en el futuro. –

+0

para guardar como png lo que acaba de hacer es page.render ('file.png') – Toolkit

7

V2 de la phantomjs-node Es bastante fácil de imprimir el código HTML después de que haya sido procesado.

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

Esto mostrará el resultado tal como se hubiera representado con el navegador.

+0

¿permite procesar HTML con una cadena? –

+0

Sí lo hace .... –

Cuestiones relacionadas