Начало работы с PhantomJS


Понадобилось как-то мне для одного проекта в срочном порядке изучить headless-браузер PhantomJS. И вот решил выложить систематизированные материалы по использованию данной программы: установка, примеры кода, работа и прочее. В этой заметке мы разберемся с установкой и запустим простейший скрипт на JavaScript.

Зачем?

Лично мне потребовалась имитация браузера на сервере для парсинга, так как после пары десятков запросов к сайт донору последний выдавал капчу. Причём капчу не простую, а подгружающуюся по JavaScript. А, увы, Curl не умеет работать с JS. Вот и пришлось искать решение.

Установка

Так как я ставил на сервер под управлением Ubuntu, и PhantomJS есть в репозиториях, то установка прошла быстро и буквально в одну команду.

sudo apt-get install phantomjs
Дальше пользователь, от которого вы запускаете скрипты, должен иметь возможность пользоваться shell. Вот и вся установка.

Коды примеров

Управляется PhantomJS с помощью JS, a запускается shell – то есть необходимо использовать еще и серверный язык программирования. Я выбрал PHP. Код файла script.js:

var webPage = require('webpage'); 
console.log('Пример PhantomJS’);
phantom.exit();
Обратите внимание, что метод console.log будет выводить информацию не на консоль браузера, а прямо на экран – на страницу.

А вот и страница phantom.php. Код PHP для запуска

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

echo(shell_exec('phantomjs script.js'));
flush();
Включаем вывод ошибок, запускаем, очищаем. Вроде должно работать.

Первый запуск

Не работает. Никаких ошибок – чисто белый экран. Точно, мы же забыли вывод

echo(shell_exec('phantomjs script.js 2>&1'));
Проверяем еще раз. Вылезает ошибка:

QXcbConnection: Could not connect to display
Запускаем с параметром:

echo(shell_exec('phantomjs -platform offscreen script.js 2>&1'));
Заработало! Пробуем получить скрин страницы
var page = require('webpage').create();

page.open('https://google.ru', function(status) {
  if (status !== 'success') {
    console.log('Error');
  } else {

page.render("screen.jpg");
  phantom.exit();
  }
});
Скрин:



Не совсем то, что мы обычно видим, но уже что-то. Дальше уже можно писать на JS собственно сам парсер, добавлять прокси, юзер агент и прочее. Но это тема для другой заметки.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, PhantomJS, php, javascript, парсинг




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Камин в саду
Решение задачи на собеседовании по вставке в массив PHP
Урок 1. Концепции объектно-ориентированного программирования C#