Pull to refresh

Comments 35

А есть какие-то причины использовать PhantomJS вместо Node.js помимо «прикольно, ещё один серверный js-движок»?
Это ни в коем случае не «серверный js движок». Это WebKit в консоли.
Это две большие разницы.
А Node.js — V8 в консоли.
Не вижу разницы.
V8 это только движок JS
А WebKit это платформа которая включает в себя движок JS и движок для рендеринга.
Это полноценный браузер (JavaScript+CSS+DOM+BOM+SVG+Canvas) но без графического интерфейса.
У него общего с Node.js (V8 JavaScript+libeio+libev) только JavaScript.

Из него выйдет отличный скриншотер (См. новый поиск гугла) и парсер с поддержкой JavaScript
В примерах рендеринг HTML в png и pdf показан
Очень сомневаюсь что в фантоме используется v8. Скорее всего стандартный вебкитовский JS движок.
Их бы усилия, да объединить :)
А есть какие-то причины комментировать, если вы даже не вчитались в суть топика?
Гм, да. Цитата автора в багрепорте.
PhantomJS is not «pure headless» yet. On Unix, it still needs X Server for font stuff, etc.
И врядли будет чистым при таком раскладе.
Теперь pure headless
«In PhantomJS 1.4 or earlier, X server is still needed. The workaround is to use Xvfb. Starting with PhantomJS 1.5, it is pure headless and there is no need to run X11/Xvfb anymore.»
ради такого я даже огромный qt соберу под маком.
/usr/local/Cellar/qt/4.7.2: 2562 files, 196M, built in 84.9 minutes
Активно используем для запуска юнит-тестов с qUnit.
Если бы ему x server не нужен был — цены бы не было :(
Вот-вот, это огромная проблема, которую хотелось бы обсудить. Что необходимо для полноценной растеризации веб-сайта через эту библиотеку? Что именно нужно из X? Возможно ли это поднять на сервере без видеокарты и так далее?
Все, как я понял можно использовать xvfb
Пока на сервере использую pywebkitgtk, рендеринг webkit из python!
Однако это вроде интересней выглядит, может в будущем перейду на PhantomJS.
ИМХО, никакой разницы. Просто для скриптования используется JS а не Python и обвязка на основе Qt а не GTK
Хотя не, у фантома этого еще доступ к DOM есть нормальный видимо.
Небольшой гайд для тех, кто захочет использовать эту библиотеку для создания скриншотов сайта:

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 событий, ни возможности отключить загрузку и выполнение скриптов на странице, так что, скорее всего, для сервисов онлайн-скриншотов эта библиотека подойдет едва ли.
Можно, конечно, выкрутиться, использовав доступный в фантоме 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();
}
Только это никак не спасает от "… включая все скрипты, картинки, внешние картинки и далее по списку. Наличие скриптов рекапчи, большого количества onload скриптов..."
Можно их вырезать.
UFO just landed and posted this here
Вопрос к тем кто уже пощупал… А можно ли получить отчет о длительности загрузки ресурсников — скриптов, картинок, флешек и т.п.? Можно ли получить перечень JS ошибок сгенеренных на странице? Можно ли получить информацию из профайлера страницы (например время выполнения каждой функции),
Вряд ли. Все дело в том, что PhantomJS работает по следующему принципу:
1. Выполняется (в контексте пустого окна «браузера» ваш скрипт).
2. Если вы изменяете свойство content, либо используете метод open(), страница (пере)загружается, управление полностью передается загружаемой странице (скрипты, загрузка изображений, составление DOM-дерева, etc).
3. По событию load страницы управление опять передается вашему скрипту, точнее он снова выполняется с самого начала (однако область видимости сохраняется).

Поэтому вашу задачу выполнить средствами PhantomJS невозможно, точнее можно, но только сам профайлер и чекер ошибок вам придется сделать самостоятельно, т.е. как в моем примере выше, только переделывая всю страницу, вешая try-catch на скрипты, или свои обработчики onerror, подмиксовывать таймеры перед вызовами и так далее, в общем писать свой полноценный дебагер, который работал бы на подобии встраиваемой части Firebug, например. В общем, задача если и выполнима, но все же трудна.

Другой вопрос, что этот функционал, а так же расширить методы работы со страницей в PhantomJS, вы можете, редактируя его исходники, ведь они открыты. На данный момент нужно либо самому писать недостающий функционал, либо ждать обновлений.
спасибо за подробный ответ. Я надеялся что функционал профейлера будет в фантоме в том же виде в котором он есть в вебките.
UFO just landed and posted this here
Sign up to leave a comment.

Articles

Change theme settings