Я ищу пример запроса веб-страницы, ожидая рендеринга JavaScript (JavaScript изменяет DOM), а затем захватывает HTML-страницу.
Это должен быть простой пример с очевидным вариантом использования для PhantomJS. Я не могу найти достойный пример, документация, похоже, касается использования командной строки.
Ответ 1
Из ваших комментариев, я думаю, у вас есть 2 варианта
- Попробуйте найти модуль узла phantomjs - https://github.com/amir20/phantomjs-node
- Запустите phantomjs как дочерний процесс внутри узла - http://nodejs.org/api/child_process.html
Редактировать:
Кажется, что phantomjs предлагает дочерний процесс для взаимодействия с узлом, см. Faq - http://code.google.com/p/phantomjs/wiki/FAQ
Редактировать:
Пример скрипта 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
С 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();
});
});
});
});
Это покажет вывод, как он был бы представлен с помощью браузера.
Изменить 2019:
Вы можете использовать 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();
})();
Или, если вы просто хотите проверить, вы можете использовать npx
npx phantom@latest https://stackoverflow.com/
Ответ 3
В прошлом я использовал два разных способа, включая метод page.evaluate(), который запрашивает DOM, о котором упоминается Declan. Другой способ, которым я передал информацию с веб-страницы, - это вытолкнуть ее в console.log(), а в phantomjs script использовать:
page.onConsoleMessage = function (msg, line, source) {
console.log('console [' +source +':' +line +']> ' +msg);
}
Я мог бы также захватить переменную msg в onConsoleMessage и искать некоторые данные инкапсуляции. Зависит от того, как вы хотите использовать вывод.
Затем в Nodejs script вам нужно будет сканировать вывод 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
}
});
}
Надеюсь, что это поможет.
Ответ 4
Почему бы просто не использовать это?
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();
});
Ответ 5
Позднее обновление в случае, если кто-то наткнется на этот вопрос:
Проект GitHub, разработанный моим коллегой, нацелен на то, чтобы помочь вам в этом: https://github.com/vmeurisse/phantomCrawl.
Он все еще немного молод, ему, конечно же, не хватает какой-либо документации, но приведенный пример должен помочь выполнить базовый обход.
Ответ 6
Здесь используется старая версия, использующая бегущие node, express и phantomjs, которые сохраняют страницу как .png. Вы можете настроить его довольно быстро, чтобы получить html.
https://github.com/wehrhaus/sitescrape.git