2012-04-01 2 views
58

Я ищу пример запроса веб-страницы, ожидающей рендеринга JavaScript (JavaScript изменяет DOM), а затем захвата HTML-страницы.Сохраните и отрисуйте веб-страницу с помощью PhantomJS и node.js

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

+0

Вы хотите сделать это на стороне клиента или на стороне сервера? –

+4

@DeclanCook serverside Я думаю? Clientside потребует от пользователя установки фантомного права? Что бы не получилось, если я правильно понял. Спасибо – Harry

+1

Что вы пытаетесь сделать с html, если у вас есть это? Пытаясь окунуться в то, что вы пытаетесь достичь. У Phantomjs есть манипуляция dom, см. Http://code.google.com/p/phantomjs/wiki/QuickStart#DOM_Manipulation, то вы собираетесь отправить это где-нибудь? –

ответ

42

От ваших комментариев, я предполагаю, что у вас есть 2 варианта

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

Редактировать:

Кажется, что дочерний процесс предложен 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(); 
}); 
+0

Можете ли вы показать пример? Возьмите страницу, запустите javascript, получите html? – Harry

+9

Вы можете просто использовать «page.content», нет необходимости что-то оценивать. – JLarky

+3

Это замечательно, но ... изо всех сил пытаюсь использовать require ('webpage') в этом скрипте, обернутом узлом, потому что модуль веб-страницы не определен в узле, он находится в фантоме. У кого-нибудь есть идеи? Является ли «веб-страница» общим модулем как для узла, так и для фантома? Или я могу использовать требование в фантомном контексте только так или иначе? –

4

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

page.onConsoleMessage = function (msg, line, source) { 
    console.log('console [' +source +':' +line +']> ' +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 
    } 
    }); 
} 

Надежда, что помогает некоторым.

1

Late обновление в случае, если кто натыкается на этот вопрос:

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

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

3

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

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

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

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

+0

FYI, если вы собираетесь использовать ссылку, чтобы предоставить ответ, лучше всего добавить достаточную информацию, чтобы ваш ответ не стал бесполезным, если в какой-то момент в будущем связь будет разрываться. –

+0

, чтобы сохранить как png, вы просто делаете page.render ('file.png') – Toolkit

7

С v2 из 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(); 
     }); 
    }); 
    }); 
}); 

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

+0

позволяет ли это отображать HTML-строку? –

+0

Да, это так .... –

Смежные вопросы