Это полноценный браузер (JavaScript+CSS+DOM+BOM+SVG+Canvas) но без графического интерфейса.
У него общего с Node.js (V8 JavaScript+libeio+libev) только JavaScript.
Из него выйдет отличный скриншотер (См. новый поиск гугла) и парсер с поддержкой JavaScript
Теперь 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.»
Вот-вот, это огромная проблема, которую хотелось бы обсудить. Что необходимо для полноценной растеризации веб-сайта через эту библиотеку? Что именно нужно из X? Возможно ли это поднять на сервере без видеокарты и так далее?
Мда, у этой библиотеки есть несколько не очевидных минусов. Как гласит вики, функция 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 };
if(xmlhttp.status == 200) {
var response = xmlhttp.responseText;
/**
* Тут мы выполняем операции по очистке response от скриптов и, например
* внешних iframe и изображений с отличного от текущего домена. Но тут
* придется использовать только регулярные выражения, а не DOM.
*/
Только это никак не спасает от "… включая все скрипты, картинки, внешние картинки и далее по списку. Наличие скриптов рекапчи, большого количества onload скриптов..."
Вопрос к тем кто уже пощупал… А можно ли получить отчет о длительности загрузки ресурсников — скриптов, картинок, флешек и т.п.? Можно ли получить перечень JS ошибок сгенеренных на странице? Можно ли получить информацию из профайлера страницы (например время выполнения каждой функции),
Вряд ли. Все дело в том, что PhantomJS работает по следующему принципу:
1. Выполняется (в контексте пустого окна «браузера» ваш скрипт).
2. Если вы изменяете свойство content, либо используете метод open(), страница (пере)загружается, управление полностью передается загружаемой странице (скрипты, загрузка изображений, составление DOM-дерева, etc).
3. По событию load страницы управление опять передается вашему скрипту, точнее он снова выполняется с самого начала (однако область видимости сохраняется).
Поэтому вашу задачу выполнить средствами PhantomJS невозможно, точнее можно, но только сам профайлер и чекер ошибок вам придется сделать самостоятельно, т.е. как в моем примере выше, только переделывая всю страницу, вешая try-catch на скрипты, или свои обработчики onerror, подмиксовывать таймеры перед вызовами и так далее, в общем писать свой полноценный дебагер, который работал бы на подобии встраиваемой части Firebug, например. В общем, задача если и выполнима, но все же трудна.
Другой вопрос, что этот функционал, а так же расширить методы работы со страницей в PhantomJS, вы можете, редактируя его исходники, ведь они открыты. На данный момент нужно либо самому писать недостающий функционал, либо ждать обновлений.
PhantomJS: Webkit в консоли