Вебскрапінг із Goutte у PHP: Повний посібник
Я проведу вас через усе крок за кроком — від налаштування до отримання реальних даних із сайтів за допомогою Goutte. Я також поділюся тим, на що варто звернути увагу, адже вебскрапінг інколи може бути складним. Якщо ви готові дізнатися щось корисне й цікаве, давайте зануримося в тему та почнемо вебскрапінг!
Що таке Goutte?
Goutte — це невелика PHP-бібліотека, яка допомагає вам збирати дані з вебсайтів. Вона спрощує надсилання HTTP-запитів (ніби ви відкриваєте вебсторінку) та аналіз HTML-коду сайту. Потім ви можете зібрати інформацію на сторінці. Goutte добре підходить для статичних сторінок, які не завантажують дані за допомогою JavaScript.
Goutte використовує інші інструменти PHP у фоновому режимі. Він базується на DomCrawler від Symfony and 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
Initialize the project using 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';
use GoutteClient;
$client = new 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->request('GET', $url);
This loads the page and gives you access to its HTML content through the $crawler object.
Крок 5: Знайдіть потрібні вам дані
Тепер знайдемо таблицю, у якій зберігаються дані. Ви можете відкрити сайт у браузері й перевірити його структуру. Клацніть правою кнопкою миші на команді та виберіть «Перевірити». Ви побачите, що в кожного рядка таблиці є клас `team`.
Щоб отримати кожен рядок, використайте цей код:
$crawler->filter('tr.team')->each(function ($row) {
$teamName = trim($row->filter('.name')->text());
$wins = trim($row->filter('.wins')->text());
$losses = trim($row->filter('.losses')->text());
echo "Team: $teamName, Перемоги: $wins, Поразки: $lossesn";
});
Це виведе назву, кількість перемог і поразок кожної хокейної команди.
Крок 6: Збережіть дані
Замість того щоб виводити дані, збережімо їх у масив. Потім ми зможемо записати їх у файл.
$teams = [];
$crawler->filter('tr.team')->each(function ($row) use (&$teams) {
$teams[] = [
'team' => trim($row->filter('.name')->text()),
'wins' => trim($row->filter('.wins')->text()),
'losses' => trim($row->filter('.losses')->text())
];
});
Now the $teams array holds all the scraped data.
Крок 7: Обробіть пагінацію
На сайті є кілька сторінок. Нам потрібно пройтися по кожній, щоб зібрати всі дані.
Спочатку створіть функцію, щоб отримати всі URL-адреси сторінок:
function getAllPageUrls($client, $startUrl) {
$crawler = $client->request('GET', $startUrl);
$urls = [$startUrl];
$crawler->filter('.pagination li a')->each(function ($node) use (&$urls) {
$href = $node->attr('href');
$url = 'https://www.scrapethissite.com' . $href;
if (!in_array($url, $urls)) {
$urls[] = $url;
}
});
return $urls;
}
Тоді викличте функцію:
$urls = getAllPageUrls($client, $url);
Пройдіться по всіх сторінках:
$teams = [];
foreach ($urls as $pageUrl) {
echo "Вебскрапінг: $pageUrln";
$crawler = $client->request('GET', $pageUrl);
$crawler->filter('tr.team')->each(function ($row) use (&$teams) {
$teams[] = [
'team' => trim($row->filter('.name')->text()),
'wins' => trim($row->filter('.wins')->text()),
'losses' => trim($row->filter('.losses')->text())
];
});
}
Тепер ваш вебскрапер збирає дані з усіх сторінок.
Крок 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, ['Назва команди', 'Перемоги', 'Втрати']);
// Write rows
foreach ($teams as $team) {
fputcsv($file, [$team['team'], $team['перемоги'], $team['втрати']]);
}
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 require symfony/browser-kit symfony/dom-crawler symfony/http-client
Replace Goutte like this:
use SymfonyComponentBrowserKitHttpBrowser;
use SymfonyComponentHttpClientHttpClient;
$client = new HttpBrowser(HttpClient::create());
Цей підхід краще захищає від застарівання та дає більше контролю.
2. Використання Guzzle із парсером
Guzzle — потужний HTTP-клієнт. Поєднайте його з парсером на кшталт symfony/dom-crawler або paquettg/php-html-parser:
composer require guzzlehttp/guzzle symfony/dom-crawler
Ви надсилаєте запит за допомогою Guzzle і передаєте HTML у DomCrawler. Це дає вам більше гнучкості. Цікавитеся Guzzle та іншими бібліотеками? Читайте мою статтю, де я перелічую найкращі PHP-бібліотеки для вебскрапінгу.
3. Використовуйте API або сервіси Web Unlocker
Якщо сайт захищений, звичайні скрапери не спрацьовують. Деякі сайти використовують Cloudflare, CAPTCHA або інші інструменти для блокування ботів. У такому разі спробуйте скористатися API Web Unlocker, наприклад Bright Data або Oxylabs. Ці сервіси обходять захист і повертають чистий HTML.
Final Thoughts
Вебскрапінг із Goutte — чудовий спосіб почати, якщо ви працюєте з PHP. Ним легко користуватися, і він ідеально підходить для невеликих проєктів або вивчення основ вебскрапінгу. У цьому посібнику я показав, як налаштувати проєкт, зібрати дані з вебсайту, обробити кілька сторінок і зберегти все у файл CSV. Я також звернув увагу на кілька новіших інструментів, які ви згодом можете дослідити. Goutte може бути застарілим, але він і досі добре працює для багатьох простих завдань. Спробуйте його, поекспериментуйте з ним і подивіться, які дані вам вдасться зібрати.

