Введение: почему PHP — идеальный инструмент для парсинга
Когда мы говорим о парсинге сайтов, многие сразу думают о Python с его BeautifulSoup или Scrapy. Но давайте будем честны: PHP живёт в каждом втором сервере, и если ваш проект уже на PHP — тащить ради одной задачи парсинга целый стек на Python просто нерационально. PHP прекрасно справляется со сбором данных, особенно когда нужно быстро обработать HTML или JSON, сходить по API или вытянуть контент с десятка страниц.
На сайте pythonlib.ru мы привыкли говорить о Python, но сегодня сделаем исключение. Потому что PHP — это не просто язык для «сайтов-визиток». Это мощный инструмент для веб-скрапинга, который умеет работать с cURL, DOMDocument, XPath и даже имитировать поведение браузера. В этой статье мы разберём на реальных примерах, как парсить сайты на PHP, избегать блокировок и обрабатывать динамический контент.
Если вы когда-нибудь хотели автоматически собирать цены конкурентов, новости или контакты — вы попали по адресу. Поехали!
Парсинг и скрапинг: в чём разница?
Прежде чем писать код, давайте разберёмся с терминами. Парсинг данных на PHP — это процесс извлечения структурированной информации из HTML, XML или JSON. А скрапинг данных на PHP — это более широкое понятие, включающее загрузку страницы, обход защит и извлечение данных. Простыми словами: парсинг — это «чтение», а скрапинг — «добыча».
В PHP для скрапинга нам понадобятся два главных инструмента:
- cURL — для отправки HTTP-запросов и получения ответов от сервера
- DOMDocument или SimpleXML — для разбора полученного HTML/XML
Дополнительно можно использовать библиотеки (о них поговорим позже), но для начала достаточно встроенных функций.
Установка и подготовка окружения
Для работы вам понадобится PHP версии 7.4 или выше с расширениями curl и dom. Проверить их наличие можно так:
php -m | grep -E "curl|dom"
Если вывод пустой — установите их через менеджер пакетов:
sudo apt install php-curl php-xml
Всё готово. Теперь создадим первый скрипт для парсинга сайта.
Пример 1: Простой парсинг с cURL и DOMDocument
Допустим, мы хотим собрать заголовки статей с блога. Напишем простой, но рабочий код:
<?php
// URL для парсинга
$url = 'https://example-blog.com';
// Инициализация cURL
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
$html = curl_exec($ch);
curl_close($ch);
// Создаём DOMDocument и загружаем HTML
$dom = new DOMDocument();
libxml_use_internal_errors(true); // Игнорируем ошибки парсинга HTML
$dom->loadHTML($html);
libxml_clear_errors();
// Используем XPath для поиска заголовков h2
$xpath = new DOMXPath($dom);
$titles = $xpath->query('//h2');
foreach ($titles as $title) {
echo $title->nodeValue . "\n";
}
?>
Обратите внимание: мы установили User-Agent — это минимальная защита от блокировки. Без него сайты часто отдают 403 ошибку. Также используем CURLOPT_FOLLOWLOCATION для автоматического перехода по редиректам.
Пример 2: Работа с формами и POST-запросами
Часто данные скрыты за формой поиска или авторизацией. Парсинг на PHP позволяет эмулировать отправку формы:
<?php
$url = 'https://example.com/search';
$postData = http_build_query([
'query' => 'PHP scraping',
'submit' => 'Search'
]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
$html = curl_exec($ch);
curl_close($ch);
// Далее парсим HTML как в первом примере
?>
Важный нюанс: если сайт использует CSRF-токены, сначала нужно получить страницу с формой, вытащить токен (через регулярку или XPath), а потом отправлять POST. Это усложняет скрапинг, но делает его более реалистичным.
Пример 3: Парсинг AJAX и динамического контента
Современные сайты часто загружают данные через JavaScript. Парсинг на PHP «из коробки» не выполняет JS, но мы можем перехватить AJAX-запросы. Откройте инструменты разработчика (F12), вкладка Network — XHR, и найдите реальный URL, куда уходит запрос. Затем просто спарсите JSON-ответ:
<?php
$apiUrl = 'https://example.com/api/data?page=1';
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/json',
'X-Requested-With: XMLHttpRequest'
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
foreach ($data['items'] as $item) {
echo $item['title'] . "\n";
}
?>
Если же контент генерируется сложным JS (например, React/Vue), придётся использовать headless-браузеры. Для PHP есть Panther (библиотека на базе ChromeDriver) или PhantomJS (устарел, но ещё работает). Однако чаще всего AJAX-запросы — это просто JSON, который парсится элементарно.
Популярные библиотеки для парсинга на PHP
Встроенные инструменты — это хорошо, но для сложных задач есть библиотеки, которые упрощают жизнь:
- Goutte — HTTP-клиент от создателей Symfony, идеален для скрапинга. Умеет работать с формами, куками, сессиями.
- Simple HTML DOM — лёгкая библиотека для парсинга HTML, работает как jQuery.
- DiDOM — современная альтернатива Simple HTML DOM, быстрее и удобнее.
- PHP Html Parser — ещё один парсер с поддержкой CSS-селекторов.
Пример установки Goutte через Composer:
composer require fabpot/goutte
И простейший парсинг в 5 строк:
Блоги
Рекомендаций по книгам
Читайте также