Skip to content

Latest commit

 

History

History
242 lines (164 loc) · 9.16 KB

README-RU.md

File metadata and controls

242 lines (164 loc) · 9.16 KB

BrowserExt - php расширение для парсинга веб-страниц и эмуляции браузера

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));
}

Установка

Linux (Ubuntu)

Для работы требуется 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)

Для компиляции сделайте следующее:

  1. Для компиляции необходимо запустить

    $ ./build.sh

  2. Для установки скомпилированного расширения

    $ sudo ./install.sh

  3. Необходимо добавить следующую строку в php.ini

    extension=browserext.so

  4. Затем перезапустите веб-сервер, например, так:

    $ sudo service apache2 restart

Windows

Для 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)

Для установки сделайте следующее:

  1. Скопируйте php_browserext.dll, соответствующий версии php в каталог с расширениями php. Например, это может быть C:\php\ext.

  2. Скачайте и установите Microsoft Visual C++ 2012 Redistributable Package (x86).

  3. В файле 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

Описание классов смотрите в API-RU.md

Инспектор XPath - утилита Browser

Также вместе с расширением поставляется программа browser, которую можно использовать для определения или тестирования xpath элементов страницы. Browser - это очень простой браузер. В верхней строке вводится url страницы, любая страница открывается в новой вкладке, клик правой кнопкой мыши на странице показывает контекстное меню с пунктами Close tab (закрывает вкладку) и Get XPath (показывает окно инспектора xpath). Несколько элементов можно выделить с нажатой клавишей Ctrl. В этом случае будет вычисляться общий xpath. Так, например, можно получить xpath всех элементов списка, выделив два элемента и нажав Get XPath. В инспекторе выделение нескольких элементов также работает.

Лицензия

Данное расширение распространяется по MIT лицензии.