web-dev-qa-db-fra.com

Enregistrez et affichez une page Web avec PhantomJS et node.js

Je cherche un exemple de demande d'une page Web, d'attendre que le JavaScript soit rendu (JavaScript modifie le DOM), puis de saisir le code HTML de la page.

Cela devrait être un exemple simple avec un cas d'utilisation évident pour PhantomJS. Je ne trouve pas d'exemple décent, la documentation semble être entièrement consacrée à l'utilisation de la ligne de commande.

59
Harry

D'après vos commentaires, je suppose que vous avez 2 options

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

Modifier:

Il semble que le processus enfant soit suggéré par phantomjs comme un moyen d'interagir avec le nœud, voir la FAQ - http://code.google.com/p/phantomjs/wiki/FAQ

Modifier:

Exemple de script Phantomjs pour obtenir le balisage HTML des pages:

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

Avec v2 de phantomjs-node il est assez facile d'imprimer le code HTML après son traitement.

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

Cela affichera la sortie telle qu'elle aurait été rendue avec le navigateur.

Modifier 2019:

Vous pouvez utiliser async/await:

const phantom = require('phantom');

(async function() {
  const instance = await phantom.create();
  const page = await instance.createPage();
  await page.on('onResourceRequested', function(requestData) {
    console.info('Requesting', requestData.url);
  });

  const status = await page.open('https://stackoverflow.com/');
  const content = await page.property('content');
  console.log(content);

  await instance.exit();
})();

Ou si vous voulez simplement tester, vous pouvez utiliser npx

npx phantom@latest https://stackoverflow.com/
8
Amir Raminfar

J'ai utilisé deux méthodes différentes dans le passé, y compris la méthode page.evaluate () qui interroge le DOM mentionné par Declan. L'autre façon dont j'ai transmis les informations de la page Web est de les cracher dans console.log () à partir de là, et dans le script phantomjs, utilisez:

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

Je pourrais également piéger la variable msg dans onConsoleMessage et rechercher des données d'encapsulation. Dépend de la façon dont vous souhaitez utiliser la sortie.

Ensuite, dans le script Nodejs, vous devrez analyser la sortie du 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
    }
  });
}

J'espère que cela aide certains.

4
ultrageek

Pourquoi ne pas simplement 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();
});
3
yossi

Mise à jour tardive au cas où quelqu'un trébucherait sur cette question:

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

Il est encore un peu jeune, il manque certainement de la documentation, mais l'exemple fourni devrait aider à faire de l'exploration de base.

1
Stilltorik

Voici une ancienne version que j'utilise en exécutant node, express et phantomjs qui enregistre la page au format .png. Vous pouvez le modifier assez rapidement pour obtenir le code HTML.

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

1
user2950147