javascript - Guarde y renderice una página web con PhantomJS y node.js
html web-scraping (6)
Estoy buscando un ejemplo de solicitud de una página web, esperando a que se represente JavaScript (JavaScript modifica el DOM) y luego agarre el HTML de la página.
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.
¿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();
});
Actualización tardía en caso de que alguien tropiece con esta pregunta:
Un proyecto en GitHub desarrollado por un colega mío exactamente tiene el objetivo de ayudarlo 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.
Aquí hay una versión anterior que utilizo running node, express y phantomjs, que guarda la página como .png. Podría ajustarlo bastante rápido para obtener el html.
Con v2 de phantomjs-node
es bastante fácil imprimir el HTML después de que ha sido procesado.
var phantom = require(''phantom'');
phantom.create().then(function(ph) {
ph.createPage().then(function(page) {
page.open(''https://.com/'').then(function(status) {
console.log(status);
page.property(''content'').then(function(content) {
console.log(content);
page.close();
ph.exit();
});
});
});
});
Esto mostrará la salida tal como se hubiera renderizado con el navegador.
De tus comentarios, supongo que tienes 2 opciones
- Intenta encontrar un módulo de nodo phantomjs - https://github.com/sgentle/phantomjs-node
- Ejecute phantomjs como un proceso secundario dentro del nodo - http://nodejs.org/api/child_process.html
Editar:
Parece que el proceso hijo es sugerido por phantomjs como una forma de interactuar con el nodo, consulte faq - http://code.google.com/p/phantomjs/wiki/FAQ
Editar:
Ejemplo del script Phantomjs para obtener el marcado HTML de las páginas:
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();
});
He utilizado dos formas diferentes en el pasado, incluido el método page.evaluate () que consulta el DOM que mencionó Declan. La otra forma en que pasé información desde la página web es escupirla a console.log () desde allí, y en el script phantomjs use:
page.onConsoleMessage = function (msg, line, source) {
console.log(''console ['' +source +'':'' +line +'']> '' +msg);
}
También podría atrapar la variable msg en onConsoleMessage y buscar algunos datos encapsulados. Depende de cómo quiera usar la salida.
Luego, en el script de Nodejs, tendrías que escanear el resultado del script de 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
}
});
}
Espero que ayude a algunos.