Зачем
В отличии от mechanize, который очень удобен и функционален, phantomjs, судя прямо из названия, поддерживает исполнение javascript без установки браузера.
Установка
Устанавливать проще всего через apt-get/yum. Можно так же скачать пакет с сайта, плюсом будет самая свежая версия пакета. К примеру в apt-get актуальная 1.9.0, а binary есть для 2.1.1, что может быть довольно существенно. Можно поставить и из source, но даже разрабы не рекомендуют – будет ставиться ~30 минут и не факт что успешно (у меня вывалился на g++: internal compiler error).
После установки смотрим версию:
apt list phantomjs или phantomjs -v
Опции
–ignore-ssl-errors=true – полезно для сайтов, с самоподписными/устаревшими сертификатами. В противном случае жди ошибок.
2015-09-09T21:18:58 [DEBUG] Network - SSL Error: "The host name did not match any of the valid hosts for this certificate" 2015-09-09T21:18:58 [DEBUG] Network - SSL Error: "The certificate is self-signed, and untrusted" 2015-09-09T21:18:58 [DEBUG] Network - SSL Error: "The certificate has expired"
–ssl-protocol=any – эту опцию включаем только если надо (обычно советуется наряду с ignore-ssl-errors, но не всегда нужна по факту), у меня с ней были периодические отвалы в exception (где-то читал, что из-за старой версии phantomjs).
–load-images=false – крайне полезно, особенно, если наша цель не собирать картинки 😉 Очень поможет, когда на сайте есть по какой-то причине картинки, недоступные с нашего сервера. В противном случае phantom будет тупить около минуты на попытке выгрузить проблемную картинку до продолжения обработки. Можно подкрутить таймер, но проще отключить вообще загрузку картинок.
–cookies-file – крайне полезная опция, особенно с учетом, что phantomjs какой-то убогий в плане заполнения форм, перехода на страницу вперед от изначальной/анализа данных на этой странице (в отличии от того же ruby gem mechanize). Выглядит все очень костыльно. Благо, когда понадобилось сделать post на страницу после авторизации в голову пришел способ с cookie – сначала авторизуемся, сохраняем данные в cookie, далее парсим/отправляем post на необходимую страницу.
–debug=true – если хочется что-то отдебажить 😉 показывает переменные, статусы, какие файлы дергает, сохранение cookie и прочую инфу.
Примеры
Базовые примеры можно посмотреть на сайте phantomjs.org.
Код консольного скрипта по авторизации через post:
var system = require('system'); var login = system.args[1]; var pass = system.args[2]; var page = require('webpage').create(), server = 'https://page.com/login.php', data = 'login=' + login + '&password=' + pass; # отключение js, может быть полезно, по аналогии с картинками. Мне очень помогло при парсинге когда скрипт подвисал из-за обработки js. page.settings.javascriptEnabled = false; # установка таймаута на отработку всех вещей, включая js-скрипты page.settings.resourceTimeout = 5000; page.open(server, 'post', data, function (status) { if (status !== 'success') { console.log('Unable to post!'); } else { console.log(page.content); } phantom.exit(); });
Запуск:
/usr/bin/phantomjs --cookies-file=/home/user/cookies.txt --ignore-ssl-errors=true --load-images=false --ssl-protocol=any /home/user/bin/login.js $login $pass
Разное
Полезные ссылки (примеры, click, выборка текста из alert):
https://www.tutorialspoint.com/phantomjs/phantomjs_examples.htm https://www.tutorialspoint.com/phantomjs/phantomjs_sendevent_method.htm http://phantomjs.org/api/webpage/handler/on-alert.html http://forum.php.su/topic.php?forum=40&topic=6012
Сталкивался с тем, что в phantomjs был цвет отличный от браузера – в phantomjs оранжевый #ffcf9c, а в в chrome красный #ff5f53. Скорей всего проблема в перекликающихся css стилях на сервере и некорректным выбором phantomjs стиля (некорректным т.к. в других браузерах тоже красный).