UPDATE: Теперь используется Qt5.
PHP расширение BrowserExt представляет собой управляемый браузер, основанный на QtWebKit и предназначенный для парсинга веб-страниц.
- Поддерживает javascript и AJAX.
- Для выборки элементов использует xpath
- Позволяет заполнять формы, кликать на элементах документа
- Позволяет получать атрибуты, свойства и другие параметры элемента документа, перебирать элементы в дереве
- Позволяет загружать файлы по ссылке
- Позволяет делать вертикальный скроллинг страницы
- Поддерживает список прокси-серверов, может проверять прокси в несколько потоков
Короткий пример:
$br = new PhpBrowser();
$br->load('http://localhost/index.html');
//получаем все ссылки на файлы
$links = $br->elements('//div[@id="files"]/a');
foreach ($links as $l)
{
//получаем свойство href
$href = $l->prop('href');
//скачиваем файл по ссылке в href и сохраняем в С:\test
$br->download($href, 'C:\\test\\'.basename($href));
}
Для работы требуется X11 Server.
На сервере без десктопа можно установить Xvfb. Для загрузки Xvfb при старте системы добавьте в /etc/rc.local следующее:
Xvfb :0 -screen 0 1024x768x16 > /dev/null 2>&1 &
Для пользователя, от имени которого запускается веб-сервер, необходимо установить переменную окружения DISPLAY c номером сервера, с которым будет работать расширение. Для apache2 это можно сделать добавив в файл envvars следующее:
export DISPLAY=:0.0
В Linux требуется компиляция расширения. Для этого требуются:
- gcc (g++)
- make
- php (php5, php5-dev)
- Qt5 (qtbase5-dev, qt5-qmake, libqt5webkit5, libqt5webkit5-dev, qt5-image-formats-plugins, qt5-default)
Для компиляции сделайте следующее:
-
Для компиляции необходимо запустить
$ ./build.sh
-
Для установки скомпилированного расширения
$ sudo ./install.sh
-
Необходимо добавить следующую строку в php.ini
extension=browserext.so
-
Затем перезапустите веб-сервер, например, так:
$ sudo service apache2 restart
Для Windows расширение поставляется в скомпилированном виде для php 5.6 и располагается в директории binaries\win32.
Для работы расширения требуются:
- php 5.6
- Qt5 c QtWebKit - например Qt 5.3 или 5.4 (установите Qt5 и задайте переменную окружения QTDIR)
- Microsoft Visual C++ 2012 Redistributable Package (x86)
Для установки сделайте следующее:
-
Скопируйте php_browserext.dll, соответствующий версии php в каталог с расширениями php. Например, это может быть C:\php\ext.
-
Скачайте и установите Microsoft Visual C++ 2012 Redistributable Package (x86).
-
В файле php.ini подключите расширение, добавив строчку
extension=php_browserext.dll
Если вы хотите откомпилировать расширения в Windows, смотрите BUILDWIN-RU.md
Для начала необходимо создать класс браузера:
$br = new PhpBrowser();
Затем загрузить страницу:
$br->load('http://localhost');
Каждая страница загружается в новой вкладке, для загрузки
в той же вкладке необходимо передать второй параметр равный true.
Для перехода на предыдущую страницу необходимо вызвать метод back()
.
Можно кликнуть на ссылку или кнопку, указав ее xpath.
$br->click('//input[@type="submit"]');
Страница будет загружена в новой вкладке, для загрузки в той же вкладке необходимо передать второй параметр как true.
Можно выбрать элементы по xpath:
$els = $br->elements('//a');
Данный метод возвращает массив объектов класса PhpWebElement. У каждого элемента можно получить атрибуты, свойства, тег, значение элемента:
$id = $els[0]->attr('id');
$prop = $els[0]->prop('href');
$tag = $els[0]->tagName();
$text = $els[0]->text();
Можно перейти к родительскому или к дочерним элементам, они также будут представлять собой объекты класса PhpWebElement:
$parent = $els[0]->parent();
$arr = array();
while (!$parent->isNull())
{
$arr[] = $parent->tagName();
$parent = $parent->parent();
}
В примере выше производится проход по всем родительским элементам и сохранение их тегов в массиве.
Для элемента можно выполнить относительный xpath:
$items = $br->elements('//*[@class="item"]');
foreach ($items as $item)
{
$a1 = $item->elements('./a[1]');
$a2 = $item->elements('./a[2]');
echo $item->tagName().' '.$a1[0]->text().' '.$a2[0]->text();
}
Этот код перебирает все элементы с классом item и выводит текст первой и второй ссылки.
Можно узнать xpath элемента или кликнуть на элементе:
$xp = $items[0]->getXPath();
$items[0]->click();
Браузер может использовать список прокси-серверов для загрузки страниц. Каждая новая страница загружается с новым прокси, если их несколько.
$proxy = array('192.168.0.2:3128', 'user:[email protected]:8888');
$br->setProxyList($proxy, true);
var_dump($br->proxyList());
В вышеприведенном примере задается массив из двух прокси и передается в браузер. Второй параметр определяет - надо ли тестировать прокси. После тестирования всех прокси выводятся те, что остались в списке, т.е. успешно прошедшие проверку.
Описание классов смотрите в API-RU.md
Также вместе с расширением поставляется программа browser, которую можно использовать для определения или тестирования xpath элементов страницы. Browser - это очень простой браузер. В верхней строке вводится url страницы, любая страница открывается в новой вкладке, клик правой кнопкой мыши на странице показывает контекстное меню с пунктами Close tab (закрывает вкладку) и Get XPath (показывает окно инспектора xpath). Несколько элементов можно выделить с нажатой клавишей Ctrl. В этом случае будет вычисляться общий xpath. Так, например, можно получить xpath всех элементов списка, выделив два элемента и нажав Get XPath. В инспекторе выделение нескольких элементов также работает.
Данное расширение распространяется по MIT лицензии.