Комментарии 35
А есть какие-то причины использовать PhantomJS вместо Node.js помимо «прикольно, ещё один серверный js-движок»?
Это ни в коем случае не «серверный js движок». Это WebKit в консоли.
Это две большие разницы.
Это две большие разницы.
Это полноценный браузер (JavaScript+CSS+DOM+BOM+SVG+Canvas) но без графического интерфейса.
У него общего с Node.js (V8 JavaScript+libeio+libev) только JavaScript.
Из него выйдет отличный скриншотер (См. новый поиск гугла) и парсер с поддержкой JavaScript
У него общего с Node.js (V8 JavaScript+libeio+libev) только JavaScript.
Из него выйдет отличный скриншотер (См. новый поиск гугла) и парсер с поддержкой JavaScript
А есть какие-то причины комментировать, если вы даже не вчитались в суть топика?
А ему иксы нужны?
Нет, насколько я понял для сборки только Qt.
code.google.com/p/phantomjs/wiki/BuildInstructions
code.google.com/p/phantomjs/wiki/BuildInstructions
Не нужны:
"Note: The information hosted here is for historical purposes only. Starting from PhantomJS version 1.5, the Linux version is pure headless and does not need X11/Xlib anymore and thus there is no need to use Xvfb."
Собирал на debian x86_64 GNU/Linux без иксов, все пашет.
"Note: The information hosted here is for historical purposes only. Starting from PhantomJS version 1.5, the Linux version is pure headless and does not need X11/Xlib anymore and thus there is no need to use Xvfb."
Собирал на debian x86_64 GNU/Linux без иксов, все пашет.
ради такого я даже огромный qt соберу под маком.
Активно используем для запуска юнит-тестов с qUnit.
Если бы ему x server не нужен был — цены бы не было :(
Если бы ему x server не нужен был — цены бы не было :(
Пока на сервере использую pywebkitgtk, рендеринг webkit из python!
Однако это вроде интересней выглядит, может в будущем перейду на PhantomJS.
Однако это вроде интересней выглядит, может в будущем перейду на PhantomJS.
Небольшой гайд для тех, кто захочет использовать эту библиотеку для создания скриншотов сайта:
1. Идем на code.google.com/p/phantomjs/wiki/Installation и устанавливаем, как там написано, либо собираем, как написано на странице помощи по сборке: code.google.com/p/phantomjs/wiki/BuildInstructions
2. Устанавливаем Xvfb (frame buffer), он нужен будет для того, чтобы создать виртуальный x server.
3. Запускаем Xvfb, например со следующими параметрами:
Xvfb :1 -screen 0 1024x768x32 &
4. Теперь запускаем скрипт с первым виртуальным дисплеем:
:# DISPLAY=:1 phantomjs rasterize.js google.ru google.png
1. Идем на code.google.com/p/phantomjs/wiki/Installation и устанавливаем, как там написано, либо собираем, как написано на странице помощи по сборке: code.google.com/p/phantomjs/wiki/BuildInstructions
2. Устанавливаем Xvfb (frame buffer), он нужен будет для того, чтобы создать виртуальный x server.
3. Запускаем Xvfb, например со следующими параметрами:
Xvfb :1 -screen 0 1024x768x32 &
4. Теперь запускаем скрипт с первым виртуальным дисплеем:
:# DISPLAY=:1 phantomjs rasterize.js google.ru google.png
Мда, у этой библиотеки есть несколько не очевидных минусов. Как гласит вики, функция phantom.open() запускает загрузку страницы и перевыполняет скрипт, только тогда, когда загружена вся страница, включая все скрипты, картинки, внешние картинки и далее по списку. Наличие скриптов рекапчи, большого количества onload скриптов, делает загрузку страницы очень долгой, например вы можете даже увидеть подобное:
Loading time 58859 msec
Очень огорчает, что нет ни onDOMReady событий, ни возможности отключить загрузку и выполнение скриптов на странице, так что, скорее всего, для сервисов онлайн-скриншотов эта библиотека подойдет едва ли.
Loading time 58859 msec
Очень огорчает, что нет ни onDOMReady событий, ни возможности отключить загрузку и выполнение скриптов на странице, так что, скорее всего, для сервисов онлайн-скриншотов эта библиотека подойдет едва ли.
Можно, конечно, выкрутиться, использовав доступный в фантоме XHR объект, синхронным запросом взять данные, обработать его и только потом загрузить для обработки в браузере, после чего отобразить.
var address = phantom.args[0];
var output = phantom.args[1];
if (phantom.state.length === 0) {
var xmlhttp = new XMLHttpRequest();
phantom.viewportSize = { width: 800, height: 600 };
xmlhttp.open('GET', address, false);
xmlhttp.send(null);
if(xmlhttp.status == 200) {
var response = xmlhttp.responseText;
/**
* Тут мы выполняем операции по очистке response от скриптов и, например
* внешних iframe и изображений с отличного от текущего домена. Но тут
* придется использовать только регулярные выражения, а не DOM.
*/
phantom.state = 'rasterize';
phantom.content = response;
}
} else {
phantom.render(output);
phantom.exit();
}
var address = phantom.args[0];
var output = phantom.args[1];
if (phantom.state.length === 0) {
var xmlhttp = new XMLHttpRequest();
phantom.viewportSize = { width: 800, height: 600 };
xmlhttp.open('GET', address, false);
xmlhttp.send(null);
if(xmlhttp.status == 200) {
var response = xmlhttp.responseText;
/**
* Тут мы выполняем операции по очистке response от скриптов и, например
* внешних iframe и изображений с отличного от текущего домена. Но тут
* придется использовать только регулярные выражения, а не DOM.
*/
phantom.state = 'rasterize';
phantom.content = response;
}
} else {
phantom.render(output);
phantom.exit();
}
Вопрос к тем кто уже пощупал… А можно ли получить отчет о длительности загрузки ресурсников — скриптов, картинок, флешек и т.п.? Можно ли получить перечень JS ошибок сгенеренных на странице? Можно ли получить информацию из профайлера страницы (например время выполнения каждой функции),
Вряд ли. Все дело в том, что PhantomJS работает по следующему принципу:
1. Выполняется (в контексте пустого окна «браузера» ваш скрипт).
2. Если вы изменяете свойство content, либо используете метод open(), страница (пере)загружается, управление полностью передается загружаемой странице (скрипты, загрузка изображений, составление DOM-дерева, etc).
3. По событию load страницы управление опять передается вашему скрипту, точнее он снова выполняется с самого начала (однако область видимости сохраняется).
Поэтому вашу задачу выполнить средствами PhantomJS невозможно, точнее можно, но только сам профайлер и чекер ошибок вам придется сделать самостоятельно, т.е. как в моем примере выше, только переделывая всю страницу, вешая try-catch на скрипты, или свои обработчики onerror, подмиксовывать таймеры перед вызовами и так далее, в общем писать свой полноценный дебагер, который работал бы на подобии встраиваемой части Firebug, например. В общем, задача если и выполнима, но все же трудна.
Другой вопрос, что этот функционал, а так же расширить методы работы со страницей в PhantomJS, вы можете, редактируя его исходники, ведь они открыты. На данный момент нужно либо самому писать недостающий функционал, либо ждать обновлений.
1. Выполняется (в контексте пустого окна «браузера» ваш скрипт).
2. Если вы изменяете свойство content, либо используете метод open(), страница (пере)загружается, управление полностью передается загружаемой странице (скрипты, загрузка изображений, составление DOM-дерева, etc).
3. По событию load страницы управление опять передается вашему скрипту, точнее он снова выполняется с самого начала (однако область видимости сохраняется).
Поэтому вашу задачу выполнить средствами PhantomJS невозможно, точнее можно, но только сам профайлер и чекер ошибок вам придется сделать самостоятельно, т.е. как в моем примере выше, только переделывая всю страницу, вешая try-catch на скрипты, или свои обработчики onerror, подмиксовывать таймеры перед вызовами и так далее, в общем писать свой полноценный дебагер, который работал бы на подобии встраиваемой части Firebug, например. В общем, задача если и выполнима, но все же трудна.
Другой вопрос, что этот функционал, а так же расширить методы работы со страницей в PhantomJS, вы можете, редактируя его исходники, ведь они открыты. На данный момент нужно либо самому писать недостающий функционал, либо ждать обновлений.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
PhantomJS: Webkit в консоли