Вебскрапінг за допомогою Goutte в PHP

Вебскрапінг із Goutte у PHP: Повний посібник

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

Що таке Goutte?

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

Goutte використовує інші інструменти PHP у фоновому режимі. Він базується на DomCrawler від Symfony and 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
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 може бути застарілим, але він і досі добре працює для багатьох простих завдань. Спробуйте його, поекспериментуйте з ним і подивіться, які дані вам вдасться зібрати.

Схожі записи