Веб-скрапинг с помощью Goutte на PHP: Полное руководство
Я проведу вас через все шаг за шагом — от настройки до получения реальных данных с веб-сайтов Goutte. Я также расскажу, на что обратить внимание, потому что скрапинг иногда бывает непростым. Если вы готовы узнать что-то полезное и интересное, давайте погрузимся в тему и начнем собирать данные!
Что такое Goutte?
Goutte — это небольшая PHP-библиотека, которая помогает извлекать данные с веб-сайтов. Она упрощает отправку HTTP-запросов (например, при посещении веб-страницы) и анализ HTML-кода сайта. Затем вы можете собирать информацию на странице. Goutte хорошо подходит для статических страниц, которые не загружают данные с помощью JavaScript.
Goutte использует другие PHP-инструменты под капотом. Он основан на DomCrawler от Symfony и BrowserKit. Эти инструменты помогают просматривать веб-страницы, переходить по ссылкам и заполнять формы.
Как извлекать веб-данные на PHP с помощью Goutte?
Перед использованием Goutte вам нужно подготовить несколько инструментов:
- PHP установлен (версия 7.1 и новее).
- Composer (менеджер зависимостей PHP).
- Редактор кода например 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 может быть устаревшим, но он по-прежнему хорошо подходит для многих простых задач. Попробуйте его, поэкспериментируйте с ним и посмотрите, какие данные удастся собрать.

