PHP служит не только для создания динамических сайтов. Он также может стать помощником в собирать данные в режиме онлайн.
Благодаря специализированным библиотекам вы можете легко установите скребок эффективно. Давайте рассмотрим, как это сделать.

Необходимые условия для выполнения скраппинга с помощью PHP
Перед началом работы убедитесь, что :
- ✅ Иметь основы программирования на PHP.
- ✅ Иметь знание HTML и CSS для выбора целевых данных для извлечения.
- ✅ Знайте, как использовать Наберите. Это инструмент для управления зависимостями PHP, необходимый для установки библиотек для скрапинга, таких как Guzzle, Symfony DomCrawler или Goutte.
- ✅ Иметь локальный веб-сервер для запуска вашего кода (XAMPP, WAMP или MAMP).
- ✅ Иметь редактор кода для написания PHP-скриптов.
Какие инструменты необходимы для веб-скраппинга с помощью PHP?
Одного PHP недостаточно. Вот библиотеки которые делают скраппинг быстрым и эффективным.
1. Guzzle : HTTP-клиент
Guzzle является наиболее широко используемой библиотекой для отправлять HTTP-запросы. Чтобы установить его с помощью Наберитеоткройте терминал, перейдите в папку с проектом и введите команду :
composer require guzzlehttp/guzzle
Composer загружает библиотеку и делает ее пригодной для использования непосредственно в вашем коде.
Вот пример простого кода для извлечь содержимое URL-адреса :
request('GET', $url);
// Получение HTTP-кода
$statusCode = $response->getStatusCode();
// Получение содержимого страницы
$content = $response->getBody()->getContents();
echo "Код HTTP : " . $statusCode . PHP_EOL;
echo "Содержание страницы:" . PHP_EOL;
echo $content;
} catch (\Exception $e) {
echo "Ошибка: " . $e->getMessage();
}
2. Symfony DomCrawler и Goutte: извлечение данных
Для просмотра и анализа HTML широко используются две библиотеки:
- Symfony DomCrawler который позволяет перемещаться по HTML с помощью селекторов CSS и нацеливаться на определенные элементы.
- Капля который является оберткой для Guzzle и DomCrawler, значительно упрощает процесс скраппинга.
Пример с Symfony DomCrawler :
request('GET', 'https://exemple.com');
$html = $response->getBody()->getContents();
$crawler = new Crawler($html);
// Выборка по классу
$crawler->filter('.my-class')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Выборка по ID
$crawler->filter('#mon-id')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Выборка по тегам
$crawler->filter('h1')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
Пример с Goutte
request('GET', 'https://exemple.com');
// Выборка по классу
$crawler->filter('.ma-class')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Выборка по ID
$crawler->filter('#mon-id')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
// Выборка по тегам
$crawler->filter('p')->each(function ($node) {
echo $node->text() . PHP_EOL;
});
3. Другие библиотеки и инструменты
Чтобы пойти дальше, вот другие варианты:
- 🔥 PHP-Scraper : это библиотека PHP, которая упрощает извлечение информации из веб-страниц, управляя сложностями HTML и селекторов. Она широко используется разработчиками в их проектах через Composer.
Установка # с помощью Composer
compose require fabpot/goutte
request('GET', 'https://example.com');
$title = $crawler->filter('title')->text();
echo "Заголовок страницы: " . $title;
- 🔥 Яркие данные : это профессиональная платформа для сбора данных в больших объемах со встроенными прокси-серверами.

- 🔥 ScraperAPI : это облачный сервис веб-парсинга, доступный через API. Вместо того, чтобы использовать локальные библиотеки для выполнения всей работы, вы отправляете простой запрос в API ScraperAPI, указав URL-адрес страницы, которую нужно парсить.
Как создать простой веб-скребок на PHP?
Вот руководство по созданию функционального скребка на PHP:
Шаг 1: Установка зависимостей
Используйте Наберите установить Капля благодаря :
compose require fabpot/goutte
Шаг 2: Извлечение содержимого страницы
Делать HTTP GET запрос и рпросмотреть содержимое HTML страницы с помощью Goutte с командой :
request('GET', $url);
// Получение необработанного HTML, если требуется
$html = $crawler->html();
echo substr($html, 0, 500) . '...'; // предварительный просмотр
Шаг 3: Извлечение данных
После того, как вы получили HTML-содержимое страницы, цель состоит в том, чтобы извлечь определенные данные.
👉 Вот пример PHP-кода для собирать заголовки со страницы блог с Гоуттом, используя CSS-селектор для нацеливания на <h2> в элементах <article>.
request('GET', $url); // Выберите элементы <h2> в <article> с помощью селектора CSS $titres = [];
$crawler->filter('article h2')->each(function ($node) use (&$titres) { // Получить текст заголовка $titres[] = trim($node->text()); });
// Отобразить извлеченные заголовки print_r($titres); ?>
В данном примере :
- Мы используем селектор CSS
элемент h2теги для целевых заголовков статей в<h2>внутри тегов<article>. - Текст для каждого заголовка извлекается с помощью
text(), и добавляем его в таблицу1TP65Названия. - Затем отображаются заголовки с
print_r($itles);.
Les Селекторы CSS (или XPath) также можно использовать для извлечь атрибуты элементов HTML. Например, если каждый заголовок блога является ссылкой в теге <a>, мы можем извлечь атрибут href чтобы получить URL-адреса статей.
👉 Вот пример с Goutte для извлечь ссылки статьи :
request('GET', $url);
// Выберите ссылки в заголовках
$itles = [];
$crawler->filter('article h2 a')->each(function ($node) use (&$itles) {
$itle = trim($node->text());
$link = $node->attr('href'); // Извлечение атрибута href
// Добавьте заголовок и URL в таблицу
$itles[] = [
title' => $itle,
url' => $lien,
];
});
// Отображение результатов
print_r($itles);
?>
В данном примере :
- Мы выбираем ссылки, содержащиеся в
<a>внутри тегов<h2>в элементах<article>. - Мы извлекаем атрибут
hrefкаждого звена сattr('href'). - Названия и их URL-адреса добавляются в таблицу
1TP65Названиязатем отображается сprint_r($itles);.
👉 Картина 1TP65Названия будет содержать элементы с обоими название и связь каждого элемента. Вот пример формата возвращаемых данных:
Массив
(
[0] => Array ()
(
[title] => Заголовок статьи 1
[url] => /article1
)
[1] => Array ( [1] => Array )
(
[title] => Заголовок статьи 2
[url] => /article2
)
)
В данном примере :
- Каждый элемент массива представляет собой ассоциативный массив с двумя ключами :
заголовокдля заголовка статьи иurlдля соответствующего URL-адреса. - Полученные данные представлены в виде двухуровневой таблицы, каждая запись которой содержит заголовок и связанную с ним ссылку.
Этап 4: структурирование и хранение данных
После того как данные извлечены, важно правильно их организовать. Для этого мы структурируем их в формате Таблица PHPзатем экспортируйте их в структурированный формат, например JSON Где CSV.
request('GET', $url);
// Извлеките заголовки и URL в структурированную таблицу
$data = [];
$crawler->filter('article h2 a')->each(function ($node) use (&$data) {
$data[] = [
title' => trim($node->text()), // Извлечь заголовок
url' => $node->attr('href'), // Извлечение атрибута href (URL)
];
});
// Отображение извлеченных данных
print_r($data);
?>
После упорядочивания данных вы можете экспортировать их в формате JSONчто полезно для API или для использования в веб-приложениях:
<?php
// Exporter les données en JSON
file_put_contents('export.json', json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));
echo "Les données ont été exportées en JSON dans 'export.json'.";
?>
Файл export.json будет создан в удобочитаемом формате, который может выглядеть следующим образом:
[
{
"title": "Заголовок статьи 1",
"url": "/article1"
},
{
"title": "Заголовок статьи 2",
"url": "/article2"
}
]
Если вы хотите экспортировать данные в таблицу CSV, вы можете использовать fputcsv чтобы записать данные в файл CSV:
<?php
// Exporter les données en CSV
$fp = fopen('export.csv', 'w');
// Ajouter l'en-tête (titres des colonnes)
fputcsv($fp, ['title', 'url']);
// Ajouter chaque ligne de données
foreach ($data as $row) {
fputcsv($fp, [$row['title'], $row['url']]);
}
// Fermer le fichier
fclose($fp);
echo "Les données ont été exportées en CSV dans 'export.csv'.";
?>
Файл export.csv будет выглядеть следующим образом:
название,url
Заголовок статьи 1,/article1
Заголовок статьи 2,/article2
Как справиться с распространенными проблемами веб-скреппинга в PHP?
Во время операции Веб-скреппинг в PHPОднако проблемы могут возникнуть. Вот решения самых распространенных из них.
1. Управление ошибками
- Ошибки подключения
Иногда запрос даже не доходит до сервера. Вы можете столкнуться с «Нет сети», «Неверный URL-адрес», «Сервер недоступен»и т.д. В этом случае попытка/захват чтобы ваш скрипт не прервался внезапно.
👉 Вот пример использования Guzzle:
request('GET', 'https://example.com/api/data');
// Проверьте, был ли запрос успешным
if ($response->getStatusCode() === 200) {
// Обрабатываем ответ в случае успеха
$body = $response->getBody();
echo "Данные получены: " . $body;
}
} catch (RequestException $e) {
// Перехватываем ошибки соединения и запроса
if ($e->hasResponse()) {
// Выводим код ошибки, если он доступен
echo "Ошибка запроса: " . $e->getResponse()->getStatusCode();
} else {
// Если соединение не удалось (например, сервер недоступен)
echo "Ошибка соединения: " . $e->getMessage();
}
}
}
// Вызов функции
make_request_with_guzzle();
?>
- Коды состояния HTTP
Даже если соединение работает, сервер может ответить ошибкой (404 = страница не найдена, 500 = ошибка интернетаи т.д.). Вы можете проверить код состояния с помощью getStatusCode().
request('GET', 'https://example.com/api/data');
// Проверьте код состояния ответа
$status_code = $response->getStatusCode();
// Проверьте, был ли запрос успешным
if ($status_code === 200) {
// Обрабатываем ответ в случае успеха
$body = $response->getBody();
echo "Ответ успешный с кодом: " . $status_code . "
";
echo "Данные получены: " . $body;
} elseif ($status_code === 404) {
echo "Ошибка 404: Страница не найдена
";
} elseif ($status_code === 500) {
echo "Ошибка 500 : Внутренняя ошибка сервера
";
} else {
echo "Код статуса: " . $status_code . "
";
}
} catch (RequestException $e) {
// Перехватываем ошибки соединения и запроса
if ($e->hasResponse()) {
// Выводим код ошибки HTTP, если он доступен
echo "Ошибка HTTP: " . $e->getResponse()->getStatusCode() . "
";
} else {
// В случае обрыва соединения (например, сервер недоступен)
echo "Ошибка соединения: " . $e->getMessage();
}
}
}
// Вызов функции
make_request_with_guzzle();
?>
- Ошибки парсинга
Парсинг — это анализ HTML вашим скрейпером. Если страница имеет неправильный формат, DomCrawler или Goutte могут зависнуть или не вернуть никаких результатов.
Чтобы справиться с подобными ошибками, всегда проверяйте наличие контента перед попыткой его извлечения. Используйте условия (count(), filter()...) , чтобы убедиться, что целевой элемент действительно присутствует. Затем оберните разбор в попытка/захват чтобы предотвратить аварийное завершение работы скрипта.
request('GET', 'https://example.com');
// Проверьте, существует ли целевой элемент, прежде чем пытаться его извлечь
$elements = $crawler->filter('div.target-element');
if ($elements->count() > 0) {
// Элемент присутствует, мы можем извлечь его
$content = $elements->first()->text();
echo "Извлеченный контент: " . $content;
} else {
// Элемент не найден
echo "Целевой элемент не найден на странице;
}
} catch (Exception $e) {
// Вылавливаем ошибки парсинга
echo "Ошибка при разборе страницы: " . $e->getMessage();
}
}
// Вызов функции
функция scrape_website();
?>
2. Обход ограничений
Некоторые сайты используют защитные меры, чтобы затруднить скраппинг.
- ❗ Блокировка по IP Вы можете использовать прокси-серверы, например, на платформе Bright Data.
- ❗ JavaScript по умолчанию PHP не может запустить JavaScript. Для этого необходимо использовать браузер без интерфейса (headless browser).
- ❗ Robots.txt Перед утилизацией важно проверить этот файл, чтобы действовать законно и ответственно.
Часто задаваемые вопросы
Законен ли веб-скрепинг?
📌 The Законность веб-скреппинга является сложной темой. Во Франции, как и в других странах, все зависит от законодательной базы, собранных данных и способа их использования.
В чем разница между веб-скребком и веб-кроулингом?
- в скраппинг — это извлечение точных данных с веб-сайта.
- в просмотр веб-страниц это просмотр страниц с целью их индексации.

Как соскрести сайт, требующий аутентификации (входа)?
Чтобы соскоблить сайт, требующий аутентификации, вам нужно имитировать соединение. В PHP наиболее распространенным решением является Guzzle.
Вы отправляете идентификаторы с помощью POST-запроса, а затем сохраняете сессию открытой, чтобы получить защищенные страницы.
Как вы управляете скраппингом сайтов с динамическими страницами, загружаемыми в AJAX?
⚠ Напоминаем, что PHP не может выполнять код JavaScript на стороне клиента.
Чтобы соскрести этот тип страницы с помощью PHP, вы можете использовать BrowserShotбиблиотека, которая использует настоящий браузер в фоновом режиме (Headless Chrome/Chromium) для загрузки страницы и выполнения JavaScript.
Другое решение заключается в том, чтобы интегрировать PHP с инструментами на базе Node.jsнапример, Puppeteer для генерации HTML и последующего получения данных из PHP.
Для всех типов веб-скрапинга с динамическими страницами можно использовать специализированные инструменты, называемые безголовые браузеры.
Есть ли альтернативы PHP для веб-скреппинга?
Да, несколько языков пользуются популярностью:
- Python с его мощными библиотеками, такими как BeautifulSoup и Scrapy.
- Node.js который очень эффективен для создания динамических веб-сайтов с помощью таких библиотек, как Puppeteer или Cheerio.

Как программировать «скребок» этично и ответственно?
Чтобы скрести по этическим соображениям, вам нужно :
- ✔ Проверьте файл robots.txt чтобы узнать правила.
- ✔ Ограничьте частоту ваших запросов чтобы не перегружать сервер сайта.
- ✔ Соблюдайте условия использования сайта.
- ✔ Не собирайте личные данные без разрешения.
✅ В итоге скраппинг это мощная практика, но использовать ее нужно методично и ответственно.
👉 А вы, вы когда-нибудь создавали скребок в PHP или другой язык? Поделитесь своим опытом в разделе комментариев.




