Как парсить сайт на PHP: cURL, DOMDocument и безопасные ограничения

Короткий ответ: парсинг сайта на PHP обычно делают так: загружают HTML-страницу через cURL, разбирают ее через DOMDocument или XPath, достают нужные элементы и сохраняют результат. Но парсить нужно только собственные страницы, разрешенные источники или сайты, правила которых это допускают. Не стоит обходить блокировки, авторизацию, лимиты и запреты владельца сайта

Для обучения лучше взять свою тестовую HTML-страницу. Так вы поймете механику без риска нарушить чужие правила

Пример HTML для тренировки

Создайте файл page.html

<!doctype html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Тестовая страница</title>
</head>
<body>
    <h1>Каталог</h1>
    <div class="product">
        <h2>Книга</h2>
        <span class="price">1200</span>
    </div>
    <div class="product">
        <h2>Курс</h2>
        <span class="price">5000</span>
    </div>
</body>
</html>

Запустите локальный сервер и откройте страницу через localhost

Загрузка HTML через cURL

<?php

$url = 'http://localhost:8000/page.html';

$ch = curl_init($url);

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_USERAGENT => 'PHP training parser',
]);

$html = curl_exec($ch);
$error = curl_error($ch);
$statusCode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);

curl_close($ch);

if ($html === false || $statusCode >= 400) {
    exit('Не удалось загрузить страницу: ' . $error);
}

CURLOPT_RETURNTRANSFER нужен, чтобы cURL вернул HTML в переменную, а не вывел его сразу на экран

Разбор HTML через DOMDocument

<?php

$dom = new DOMDocument();

libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

$xpath = new DOMXPath($dom);
$products = $xpath->query('//div[contains(@class, "product")]');

foreach ($products as $product) {
    $title = $xpath->query('.//h2', $product)->item(0)?->textContent;
    $price = $xpath->query('.//span[contains(@class, "price")]', $product)->item(0)?->textContent;

    echo trim($title) . ': ' . trim($price) . PHP_EOL;
}

XPath помогает находить элементы по тегу, классу, атрибуту и вложенности. Это удобнее, чем искать текст регулярными выражениями

Почему не стоит парсить регулярками

HTML может быть неидеальным: переносы строк, дополнительные классы, вложенные теги, пробелы, атрибуты в другом порядке. Регулярное выражение быстро ломается. DOM-парсер понимает структуру документа и работает стабильнее

Регулярки можно использовать для отдельных простых строк, но не как основной способ разбора HTML-страницы

Кодировка

Если русский текст отображается криво, проверьте кодировку страницы. Современный ориентир — UTF-8. Иногда HTML нужно привести к UTF-8 перед разбором

<?php

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');

Но не применяйте преобразование вслепую. Сначала посмотрите заголовки, <meta charset> и реальное содержимое

Ограничения и этика

Перед парсингом внешнего сайта проверьте его правила, robots.txt, пользовательское соглашение и нагрузку. Делайте паузы между запросами и не собирайте личные данные без законного основания

Если у сайта есть API, лучше использовать API. Парсинг HTML менее надежен: владелец сайта поменяет верстку, и ваш код сломается

Мини-практика

Сначала распарсите свою локальную страницу page.html. Достаньте названия товаров и цены. Затем добавьте третий товар и проверьте, что код подхватил его автоматически

После этого усложните задачу: добавьте товар без цены и обработайте ситуацию так, чтобы скрипт не падал

Частые ошибки

Парсят чужой сайт без разрешения и игнорируют правила источника

Не проверяют HTTP-код ответа

Не задают timeout, из-за чего скрипт может зависнуть

Разбирают HTML регулярными выражениями и получают нестабильный код

Не учитывают кодировку

Не обрабатывают отсутствие нужного элемента

Делают слишком много запросов за короткое время

Что почитать дальше по PHP

Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x