Сохраните и визуализируйте веб-страницу с помощью PhantomJS и node.js


Я ищу пример запроса веб-страницы, ожидая отображения JavaScript (JavaScript изменяет DOM), а затем захватывает HTML-код страницы.

Это должен быть простой пример с очевидным прецедентом для PhantomJS. Я не могу найти достойный пример, документация, кажется, все об использовании командной строки.

6 58

6 ответов:

из ваших комментариев, я бы предположил, что у вас есть 2 варианта

  1. попробуйте найти модуль узла phantomjs -https://github.com/sgentle/phantomjs-node
  2. запустите phantomjs как дочерний процесс внутри узла -http://nodejs.org/api/child_process.html

Edit:

Кажется, что дочерний процесс предлагается phantomjs как способ взаимодействия с узлом, см. faq - http://code.google.com/p/phantomjs/wiki/FAQ

Edit:

пример скрипта Phantomjs для получения 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();
});

С версии 2 phantomjs-node Это довольно легко распечатать HTML после его обработки.

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

это покажет вывод, как он был бы отображен с помощью браузера.

в прошлом я использовал два разных способа, включая страницу.метод evaluate (), который запрашивает DOM, упомянутый Декланом. Другой способ, которым я передал информацию с веб-страницы, - это выплюнуть ее на консоль.log () оттуда, а в скрипте phantomjs используйте:

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

я мог бы также поймать переменную msg в onConsoleMessage и искать некоторые инкапсулированные данные. Зависит от того, как вы хотите использовать выходной.

затем в скрипте Nodejs вам нужно будет сканировать вывод скрипта 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
    }
  });
}

надеюсь, что это поможет некоторым.

почему бы просто не использовать это ?

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

позднее обновление в случае, если кто-то наткнется на этот вопрос:

проект на GitHub, разработанный моим коллегой, точно нацелен на то, чтобы помочь вам сделать это:https://github.com/vmeurisse/phantomCrawl.

Он все еще немного молод, ему, конечно, не хватает некоторой документации, но приведенный пример должен помочь сделать базовый обход.

вот старая версия, которую я использую для запуска node, express и phantomjs, которая сохраняет страницу как a .формат PNG. Вы можете настроить его довольно быстро, чтобы получить html.

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