PHP-пакет для параллельного парсинга сайтов

Что такое 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;

  • фильтрация типов контента;

  • собственные очереди для больших обходов.

Благодаря этому библиотека подходит как для небольших задач, так и для масштабного сканирования сайтов.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

PHP Generators

Статья рассказывает о PHP генераторах - что это, как они работают, зачем нужны и как использовать их в реальных проектах. Примеры включают чтение больших CSV и потоковую обработку данных.

Как использовать docker exec для запуска команд в контейнере Docker

Использование команды docker exec для запуска команд внутри работающего Docker-контейнера. Приведены примеры команд, вывод консоли, разбор опций и рекомендации по устранению ошибок.

4 полезных способа использования Array.map() в JavaScript

Разбираем четыре практических способа использования метода Array.map() в JavaScript: преобразование данных, работа со строками, генерация списков и трансформация объектов.