2012-02-21 11 views
7

Probablemente una pregunta novato en nodejs/jsdomnodejs raspado sitio web después de Javascript cargado los valores

Estoy tratando de raspar un sitio web utilizando node.js. Estoy usando jsdom y jquery para obtener el html y analizar las cosas necesarias. Pero, de alguna manera, los valores que obtengo no son los que se muestran en el sitio web. Básicamente, los valores son cambiados dinámicamente por javascript y quiero esos valores. La razón por la que estaba usando nodejs/jsdom para raspar fue que se ejecutaría js y obtendría los valores después de ese evento.

¿Hay alguna manera de decirle a jsdom que espere hasta que se ejecute javascript? o tengo todo mal? He buscado mucho en Google en este asunto.

Respuesta

7

Usted sería mejor de usar algo como casperjs http://casperjs.org/. Es una utilidad de prueba basada en phantomjs. Básicamente es exactamente como abrir la página en un navegador webkit, simplemente sin la GUI. Podrías escribir algo como. No creo que funcione con un nodo, pero debería ser lo suficientemente fácil ejecutar un script de casper y canalizar la salida al nodo .:

var casper = require('casper').create({ 
    loadImages: true, 
    loadPlugins: true, 
    verbose: true, 
    //logLevel: 'info', 
    clientScripts: [ 
     'jquery-1.7.1.min.js', 
    ], 
    viewportSize: { 
     width: 1366, 
     height: 768, 
    }, 
    pageSettings: { 
     javascriptEnabled: true, 
     userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5', 
    }, 
}); 

casper.start(url); 

casper.thenEvaluate(function() { 
    //javascript code to run in the scope of the page 
}); 
0

No sé si quieres alternativas, pero cuando necesito un raspado tan sensible, uso Firefox con iMacros. Se ejecuta todo el navegador JS bien, porque es un navegador.

http://www.iopus.com/imacros/firefox/

0

En primer lugar, ¿cómo se está usando el jsdom? Aparentemente, jsdom.env no ejecuta scripts en el DOM, solo los scripts que agrega en la llamada al jsdom.env. Si desea ejecutar scripts, creo que debería usar jsdom.jsdom.

En segundo lugar, debe especificar un controlador onload. Esto debería ejecutarse después de que el documento esté listo, y es de esperar que cualquier script haya cambiado el DOM a su gusto.

Algo como esto:

var jsdom = require('jsdom').jsdom 
    , document = jsdom(html) 
    , window = document.createWindow(); 

document.onload = function() { 
    // Do your stuff 
} 
Cuestiones relacionadas