Что такое spatie/crawler
spatie/crawler - это PHP-пакет для обхода сайтов, который автоматически переходит по ссылкам, анализирует страницы и позволяет обрабатывать полученные ответы.
Главная особенность библиотеки это поддержка параллельных запросов. Вместо последовательной загрузки страниц краулер выполняет сразу несколько запросов, благодаря чему обход сайта происходит намного быстрее.
В основе пакета лежат асинхронные HTTP-запросы Guzzle, что и обеспечивает конкурентное выполнение.
Такой инструмент полезен для разных задач таких как:
построение sitemap;
поиск битых ссылок;
сбор данных с сайтов;
аудит структуры сайта;
мониторинг доступности страниц.
Установка пакета
Пакет устанавливается через Composer:
composer require spatie/crawlerПосле установки можно сразу запускать обход сайта, указав начальный URL.
Базовый пример использования
Минимальный пример запуска краулера выглядит так:
use Spatie\Crawler\Crawler;
Crawler::create()
->setCrawlObserver(new MyObserver())
->startCrawling('https://example.com');Здесь используется специальный класс-наблюдатель (CrawlObserver). Он получает события во время обхода страниц и позволяет обрабатывать результаты.
Обработка событий краулера
Класс-наблюдатель позволяет реагировать на различные этапы обхода сайта.
Например перед загрузкой страницы, после успешного ответа или при ошибке запроса. Пример наблюдателя:
use Spatie\Crawler\CrawlObservers\CrawlObserver;
class MyObserver extends CrawlObserver
{
public function crawled($url, $response, $foundOnUrl = null)
{
echo "Страница загружена: {$url}\n";
}
}Таким образом можно, например сохранять контент страниц, извлекать ссылки и анализировать HTML.
Параллельные запросы
Одна из ключевых возможностей пакета это настройка количества одновременных запросов. По умолчанию краулер выполняет 10 запросов одновременно. При необходимости значение можно изменить:
Crawler::create()
->setConcurrency(5)
->startCrawling($url);Чем выше это число, тем быстрее происходит обход, но тем больше нагрузка на сервер и целевой сайт.
Ограничение области обхода
Краулер можно настроить так, чтобы он обходил только нужные страницы.
Например:
только страницы текущего сайта;
только поддомены;
любые найденные ссылки.
Для этого используются специальные профили обхода:
CrawlAllUrls - обход всех ссылок;
CrawlInternalUrls - только внутренние страницы;
CrawlSubdomains - страницы и поддомены.
Это позволяет избежать перехода на сторонние сайты.
Ограничение глубины и количества страниц
Иногда нужно остановить обход после определённого количества страниц или уровней вложенности. Например:
Crawler::create()
->setMaximumDepth(2)
->setTotalCrawlLimit(100)
->startCrawling($url);Такой подход полезен, если сайт очень большой и выполнение ограничено по времени.
Выполнение JavaScript
По умолчанию краулер загружает HTML напрямую. Но современные сайты часто формируют контент через JavaScript. В таком случае можно включить выполнение JS:
Crawler::create()
->executeJavaScript()
->startCrawling($url);Для этого используется headless-браузер на базе Chrome и Puppeteer что позволяет корректно обрабатывать SPA-приложения и динамические страницы.
Дополнительные возможности
Пакет предоставляет и другие полезные инструменты:
ограничение размера загружаемых ответов;
задержка между запросами (чтобы избежать блокировки);
игнорирование robots.txt;
фильтрация типов контента;
собственные очереди для больших обходов.
Благодаря этому библиотека подходит как для небольших задач, так и для масштабного сканирования сайтов.