Сохраните и визуализируйте веб-страницу с помощью PhantomJS и node.js
Я ищу пример запроса веб-страницы, ожидая отображения JavaScript (JavaScript изменяет DOM), а затем захватывает HTML-код страницы.
Это должен быть простой пример с очевидным прецедентом для PhantomJS. Я не могу найти достойный пример, документация, кажется, все об использовании командной строки.
6 ответов:
из ваших комментариев, я бы предположил, что у вас есть 2 варианта
- попробуйте найти модуль узла phantomjs -https://github.com/sgentle/phantomjs-node
- запустите 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.
Он все еще немного молод, ему, конечно, не хватает некоторой документации, но приведенный пример должен помочь сделать базовый обход.