Веб-скрейпинг с Goutte на PHP

Веб-скрапинг с помощью Goutte на PHP: Полное руководство

Я проведу вас через все шаг за шагом — от настройки до получения реальных данных с веб-сайтов Goutte. Я также расскажу, на что обратить внимание, потому что скрапинг иногда бывает непростым. Если вы готовы узнать что-то полезное и интересное, давайте погрузимся в тему и начнем собирать данные!

Что такое Goutte?

Goutte — это небольшая PHP-библиотека, которая помогает извлекать данные с веб-сайтов. Она упрощает отправку HTTP-запросов (например, при посещении веб-страницы) и анализ HTML-кода сайта. Затем вы можете собирать информацию на странице. Goutte хорошо подходит для статических страниц, которые не загружают данные с помощью JavaScript.

Goutte использует другие PHP-инструменты под капотом. Он основан на DomCrawler от Symfony и BrowserKit. Эти инструменты помогают просматривать веб-страницы, переходить по ссылкам и заполнять формы.

Как извлекать веб-данные на PHP с помощью Goutte?

Перед использованием Goutte вам нужно подготовить несколько инструментов:

  1. PHP установлен (версия 7.1 и новее).
  2. Composer (менеджер зависимостей PHP).
  3. Редактор кода например VS Code, Sublime Text или PHPStorm.

Проверьте, установлен ли PHP:

php -v

Если ваша версия PHP ниже 7.1, сначала обновите ее.

Шаг 1: Создайте новый проект

Откройте терминал или командную строку. Создайте новую папку для проекта:

mkdir php-goutte-scraper
cd php-goutte-scraper. Инициализируйте проект с помощью Composer: composer init

Пока можете нажать Enter, чтобы принять значения по умолчанию. После этого установите Goutte:

composer require fabpot/goutte

Эта команда добавляет Goutte в ваш проект. Composer скачает все необходимые файлы.

Шаг 2: Создайте PHP-файл

In the folder, create a file called index.php. Open it in your code editor. Start by adding this code:

require_once __DIR__ . '/vendor/autoload.php';
использовать GoutteКлиент;
$client = новый Клиент();
// Your scraping code will go here

Теперь вы готовы приступить к скрапингу!

Шаг 3: Выберите сайт для скрейпинга

Let’s choose a simple example site that allows scraping:
https://www.scrapethissite.com/pages/forms/

На этой странице показаны данные о хоккейных командах. Наша цель — собрать названия команд, число побед и другие показатели.

Шаг 4: Загрузка страницы с Goutte

Добавьте это в ваш скрипт:

$url = 'https://www.scrapethissite.com/pages/forms/';
$crawler = $client->запрос('GET', $url);

Это загружает страницу и предоставляет вам доступ к ее HTML-контенту через объект $crawler.

Шаг 5: Найдите нужные данные

Теперь давайте найдем таблицу, в которой хранятся данные. Вы можете открыть сайт в браузере и просмотреть его структуру. Щелкните правой кнопкой мыши по команде и выберите «Инспектировать». Вы увидите, что у каждой строки таблицы есть класс team.

Чтобы получить каждую строку, используйте этот код:

$crawler->filter('tr.team')->each(function ($row) {
$teamName = отделка($row->filter('.name')->текст());
$wins = отделка($row->filter('.wins')->текст());
$losses = отделка($row->filter('.losses')->текст());
echo "Team: $teamName, Победы: $wins, Losses: $lossesn";
});

Это выведет название, победы и поражения каждой хоккейной команды.

Шаг 6: Сохраните данные

Вместо того чтобы выводить данные, сохраним их в массив, а затем запишем в файл.

$teams = [];
$crawler->filter('tr.team')->each(function ($row) использовать (&$teams) {
$teams[] = [
'team' => отделка($row->filter('.name')->текст()),
'wins' => отделка($row->filter('.wins')->текст()),
'losses' => отделка($row->filter('.losses')->текст())
];
});

Теперь массив $teams содержит все собранные данные.

Шаг 7: Обработайте пагинацию

На сайте несколько страниц. Нам нужно пройтись по каждой, чтобы собрать все данные.

Сначала создайте функцию, которая получит все URL страниц:

функция getAllPageUrls($client, $startUrl) {
$crawler = $client->запрос('GET', $startUrl);
$urls = [$startUrl];
$crawler->filter('.pagination li a')->each(function ($node) использовать (&$урлы) {
$href = $node->attr('href');
$url = 'https://www.scrapethissite.com' . $href;
если (!in_array($url, $urls)) {
$urls[] = $url;
}
});
возврат $urls;
}

Затем вызовите функцию:

$urls = getAllPageUrls($client, $url);

Пройдите по всем страницам:

$teams = [];
foreach ($urls в роли $pageUrl) {
echo "Сбор данных: $pageUrln";
$crawler = $client->запрос('GET', $pageUrl);
$crawler->filter('tr.team')->each(function ($row) использовать (&$teams) {
$teams[] = [
'team' => отделка($row->filter('.name')->текст()),
'wins' => отделка($row->filter('.wins')->текст()),
'losses' => отделка($row->filter('.losses')->текст())
];
});
}

Теперь ваш скрапер собирает данные со всех страниц.

Шаг 8: Экспорт в CSV

Once you have the data, you can export it to a file. Here’s how to write the results into teams.csv:

$file = fopen('teams.csv', 'w');
// Write header
fputcsv($file, ['Team Name', 'Wins', 'Поражения']);
// Write rows
foreach ($teams в роли $team) {
fputcsv($file, [$team['team'], $team['победы'], $team['losses']]);
}
fclose($file);
echo "Data exported to teams.csvn";

Теперь ваши данные сохранены и готовы к использованию в Excel или любом другом табличном редакторе.

Запуск скрипта

Сохраните код и вернитесь в терминал. Запустите скрипт командой:

php index.php

You should see logs of which page is being scraped, and in the end, a file called teams.csv will be created.

Ограничения Goutte

Goutte прост в использовании, но у него есть несколько проблем:

  • Он устарел и больше не обновляется.
  • Он не справляется с сайтами, активно использующими JavaScript.
  • Он плохо справляется с защитой от ботов.
  • У него нет продвинутой поддержки прокси.
  • Он отлично работает со статическими сайтами.

Для базовых задач Goutte по-прежнему подходит. Но если вам нужны более широкие возможности, читайте дальше.

Более удачные альтернативы в 2025 году

Вот более современные и актуальные способы скрейпинга сайтов на PHP:

1. Symfony Components

Goutte использует инструменты Symfony. Вы можете использовать их напрямую:

composer требуется symfony/browser-kit symfony/dom-crawler symfony/http-client. Замените Goutte следующим образом:
использовать SymfonyComponentBrowserKitHttpBrowser;
использовать SymfonyComponentHttpClientHttpClient;
$client = новый HttpBrowser(HttpClient::create());

Этот подход более устойчив к будущим изменениям и дает больше контроля.

2. Использование Guzzle с парсером

Guzzle — мощный HTTP-клиент. Используйте его вместе с парсером вроде symfony/dom-crawler или paquettg/php-html-parser:

composer требуется guzzlehttp/guzzle symfony/dom-crawler

Вы отправляете запрос с помощью Guzzle и передаёте HTML в DomCrawler. Это даёт больше гибкости. Интересует Guzzle и другие библиотеки? Прочитайте мою статью, где перечислены лучшие PHP-библиотеки для веб-скрапинга.

3. Используйте API или сервисы Web Unlocker

Если сайт защищён, обычные скраперы не справляются. Некоторые сайты используют Cloudflare, CAPTCHAs или другие инструменты блокировки ботов. В этом случае попробуйте использовать Web Unlocker API от Bright Data или Oxylabs. Эти сервисы обходят защиту и возвращают чистый HTML.

Заключительные размышления

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

Похожие записи