Tech4Mania
UserПочта TechБлог Магазин
Парсинг любой сложности: Управляем Google Chrome с помощью PHP и Panther.

Парсинг любой сложности: Управляем Google Chrome с помощью PHP и Panther.

Что делать, если сайт — это современное веб-приложение, где весь контент появляется благодаря JavaScript? Что если нужно нажимать на кнопки, заполнять формы или скроллить страницу для загрузки новых элементов?

Здесь на сцену выходит тяжёлая артиллерия. Мы будем использовать Symfony Panther — библиотеку, которая позволяет управлять настоящим браузером (например, Google Chrome или Firefox) прямо из вашего PHP-скрипта. Мы заставим браузер делать всю грязную работу за нас: он откроет страницу, выполнит JavaScript, дождётся загрузки данных, и только потом мы заберём идеально подготовленный для парсинга HTML.

Установка Panther и драйвера для браузера

Panther, как и любой серьезный инструмент, устанавливается через Composer:

composer require symfony/panther
Но есть важный нюанс: Panther — это лишь "пульт управления". Ему нужен "исполнитель" — специальная программа-драйвер, которая будет передавать команды браузеру. Самый популярный вариант — ChromeDriver.

К счастью, Panther может установить его за вас! Просто выполните в терминале эту команду:

./vendor/bin/bdi browser:update chromedriver
Эта команда скачает последнюю совместимую версию ChromeDriver и поместит её в папку drivers/ вашего проекта.

Запускаем наш собственный Chrome

Теперь, когда всё готово, давайте запустим браузер. Код для этого до смешного прост.

<?phprequire 'vendor/autoload.php';
use Symfony\Component\Panther\Client;
// Создаём клиент, который будет управлять Chrome$client = Client::createChromeClient();
В этот момент Panther в фоновом режиме запустил полноценный процесс Google Chrome. Пока мы ничего не видим, потому что по умолчанию он работает в headless режиме (без окна).

Навигация и взаимодействие со страницей

Давайте перейдём на сайт и получим его содержимое. Для примера возьмем вымышленный автосайт http://example-auto.com, где машины подгружаются с помощью JS.

// Переходим на страницу$crawler = $client->request('GET', 'http://example-auto.com/cars');
// ЖДЁМ, пока появятся нужные нам элементы// Panther будет ждать до 30 секунд появления элемента с селектором '.car-card'$client->waitFor('.car-card');
// Теперь можно получить скриншот, чтобы убедиться, что всё загрузилось$client->takeScreenshot('screen.png');
// Получаем HTML-код ПОСЛЕ выполнения JavaScript$html = $crawler->html();
Ключевой момент здесь — $client->waitFor('.car-card'). Это приказ: "Не продолжай выполнение скрипта, пока на странице не появится хотя бы один элемент с классом car-card". Именно это решает проблему с динамической загрузкой.

Извлекаем данные с помощью Crawler

Panther использует компонент DomCrawler от Symfony. Его синтаксис очень похож на DiDOM или jQuery, так что вы быстро его освоите.

// $crawler у нас уже есть из предыдущего шага
// Находим все карточки автомобилей$crawler->filter('.car-card')->each(function ($node) { // Внутри каждой карточки ищем нужные данные $title = $node->filter('.car-title')->text(); $price = $node->filter('.car-price')->text(); $link = $node->filter('a.car-link')->attr('href');
echo "Модель: {$title} | Цена: {$price} | Ссылка: {$link}\n"; echo "---------------------------------------------------\n";});
// После работы обязательно закрываем браузер$client->quit();
  • filter('.car-card') находит все элементы, соответствующие селектору.
  • each(function ($node) { ... }) позволяет выполнить код для каждого найденного элемента. $node — это и есть текущий элемент (карточка машины).
  • text() и attr('href') работают точно так же, как мы привыкли.

Заключение: Полный контроль над вебом

Symfony Panther открывает для PHP-разработчиков совершенно новый уровень возможностей. Вы больше не ограничены статичным HTML. Теперь вы можете автоматизировать любые действия в браузере: парсить самые сложные сайты, делать скриншоты, заполнять формы, проводить автоматизированное тестирование и многое другое.

Это сложный, но невероятно мощный инструмент, который обязательно должен быть в арсенале современного веб-разработчика.

Поделиться:

Комментарии (0)

Комментариев пока нет. Будьте первым!

Чтобы оставлять комментарии, ставить лайки, пожалуйста, или .