59 votes

D'enregistrer et d'effectuer le rendu d'une page web avec PhantomJS et node.js

Je suis à la recherche d'un exemple de demander une page web, en attente pour le JavaScript pour le rendu (JavaScript modifie le DOM), et puis de saisir le code HTML de la page.

Cela devrait être un exemple simple avec une évidente cas d'utilisation pour PhantomJS. Je ne peux pas trouver un travail décent exemple, la documentation semble être tout au sujet de la ligne de commande à utiliser.

43voto

Declan Cook Points 3283

À partir de vos commentaires, je suppose que vous avez 2 options

  1. Essayez de trouver un phantomjs nœud du module https://github.com/sgentle/phantomjs-node
  2. Exécuter phantomjs comme un processus enfant à l'intérieur de nœud http://nodejs.org/api/child_process.html

Edit:

Il semble que le processus enfant est suggéré par phantomjs comme un moyen d'interagir avec le noeud, consultez le faq http://code.google.com/p/phantomjs/wiki/FAQ

Edit:

Exemple Phantomjs script pour obtenir les pages de balisage 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();
});

4voto

ultrageek Points 330

J'ai utilisé de deux manières différentes dans le passé, y compris de la page.evaluate() méthode qui interroge les DOM que Declan mentionné. L'autre façon dont je l'ai transmis l'info à partir de la page web est de cracher à la console.log() à partir de là, et dans le phantomjs utiliser un script:

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

Je pourrais aussi piège de la variable msg dans la onConsoleMessage et de recherche pour certains encapsuler les données. Dépend de comment vous voulez utiliser la sortie.

Puis, dans la Nodejs script, vous devez analyser la sortie de la Phantomjs script:

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

L'espoir qui aide certains.

3voto

yossi Points 3655

Pourquoi ne pas l'utiliser ?

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

1voto

user2950147 Points 21

Voici une vieille version que j'utilise le noeud en cours d'exécution, d'exprimer et de phantomjs qui enregistre la page en tant que .png. Vous pourriez ajuster assez rapidement pour obtenir le code html.

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

1voto

Stilltorik Points 480

La fin de la mise à jour au cas où quelqu'un trébuche sur cette question:

Un projet sur GitHub développé par un de mes collègues exactement vise à vous aider à le faire: https://github.com/vmeurisse/phantomCrawl.

Encore un peu jeune, ce n'est certainement manquant un peu de documentation, mais l'exemple fourni devrait aider à faire de base de l'analyse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X