July 7

Веб-скрапинг с PHP: упростите процесс извлечения данных

Представьте, что вы мгновенно получаете данные с любого сайта. Цены, отзывы, информация о товарах — все, что нужно, прямо в ваше PHP-приложение. Без ручного копирования и вставки. Вот что такое веб-скрапинг.

Если вы поклонник PHP, попробуйте Goutte. Это сочетание HTTP-клиента Guzzle и Symfony DomCrawler, которое облегчает извлечение чистых данных с самых сложных страниц. Легко освоить и невероятно мощно.

Готовы начать? В этом руководстве мы рассмотрим основы скрапинга, отправку форм, работу с пагинацией и лучшие практики с Goutte.

Почему стоит использовать Goutte

Простой и интуитивный — API понятен и естественен. Даже новичок быстро освоится.

Всё в одном — загрузка HTML, парсинг, управление сессиями, куки, отправка форм без необходимости использовать несколько инструментов.

От новичка до профессионала — начните с простого, а затем легко переходите к сложным проектам.

Вы получаете инструмент, который ценит ваше время и навыки. Выигрыш для всех!

Быстрая установка Goutte

Убедитесь, что у вас готово окружение:

PHP версии 7.3 и выше (скачайте с php.net)

Composer для управления зависимостями

Откройте терминал и выполните:

composer require fabpot/goutte

В вашем PHP-файле добавьте:

require 'vendor/autoload.php';

Готово!

Получение заголовка страницы и названий книг

Посмотрим Goutte в деле. Вот скрипт, который получает заголовок страницы и первые 5 названий книг с сайта Books to Scrape:

<?php
require 'vendor/autoload.php';

use Goutte\Client;

$client = new Client();

$crawler = $client->request('GET', 'https://books.toscrape.com/');

$title = $crawler->filter('title')->text();
echo "Заголовок страницы: $title\n";

echo "Первые 5 названий книг:\n";
$crawler->filter('.product_pod h3 a')->slice(0, 5)->each(function ($node) {
    echo "- " . $node->attr('title') . "\n";
});
?>

Вот так просто и красиво — всего несколько строк кода!

Извлечение ссылок и содержимого

Хотите получить все ссылки на странице? Легко:

$links = $crawler->filter('a')->each(fn($node) => $node->attr('href'));

foreach ($links as $link) {
    echo $link . "\n";
}

Или ищете конкретный контент по классу или ID? Указывайте точно:

$products = $crawler->filter('.product_pod')->each(fn($node) => trim($node->text()));

foreach ($products as $product) {
    echo $product . "\n";
}

Теперь вы выбираете именно те данные, которые хотите получить.

Переход по страницам

Многие сайты разбивают данные на страницы. Goutte позволяет легко автоматизировать переход между ними.

Вот как работать с кнопкой «Далее» для пагинации:

while ($crawler->filter('li.next a')->count() > 0) {
    $nextLink = $crawler->filter('li.next a')->attr('href');
    $crawler = $client->request('GET', 'https://books.toscrape.com/catalogue/' . $nextLink);
    echo "Сейчас на странице: " . $crawler->getUri() . "\n";
}

Автоматизируйте, скрапьте, повторяйте.

Автоматизация ввода и отправка форм

Формы — не преграда, а просто часть процесса автоматизации. Допустим, вы хотите программно выполнить поиск:

$crawler = $client->request('GET', 'https://www.scrapethissite.com/pages/forms/');

$form = $crawler->selectButton('Search')->form();
$form['q'] = 'Canada';

$crawler = $client->submit($form);

$results = $crawler->filter('.team')->each(fn($node) => $node->text());

foreach ($results as $result) {
    echo $result . "\n";
}

Заполняйте поля, отправляйте форму и извлекайте результаты.

Лучшие практики для здорового и этичного скрапинга

Обрабатывайте ошибки

Всегда готовьтесь к неожиданностям: проблемы с сетью или неправильные URL.

try {
    $crawler = $client->request('GET', 'https://invalid-url-example.com');
    echo $crawler->filter('title')->text();
} catch (Exception $e) {
    echo "Ошибка: " . $e->getMessage();
}

Так ваше приложение не упадёт, и вы быстро найдёте проблему.

Уважайте robots.txt и правила сайтов

Веб-скрапинг — это не беспредел. Проверяйте файл robots.txt, чтобы узнать, что разрешено. Нарушение может привести к блокировке IP или юридическим проблемам.

Реализуйте ограничение скорости запросов

Добавляйте паузы между запросами. Простая задержка:

sleep(1); // Пауза на 1 секунду

Это защитит серверы от перегрузки и покажет, что вы ответственный скрапер.

Учитывайте ограничения на JavaScript

Традиционные инструменты, как Goutte, не выполняют JavaScript. Если контент загружается динамически, рассмотрите Puppeteer или Selenium — они имитируют работу браузера.

Проверяйте HTTPS-сертификаты

Убедитесь, что сайты используют действительные сертификаты HTTPS, чтобы избежать ошибок и угроз безопасности.

Заключение

Веб-скрапинг с PHP и Goutte открывает безграничные возможности для получения данных. Минимальные настройки — и вы автоматизируете сбор информации, улучшите аналитику или создадите собственные панели управления. Помните: скрапьте ответственно, обрабатывайте ошибки, соблюдайте правила сайтов и контролируйте скорость запросов.