spatie/crawler — PHP-пакет від Freek Van der Herten для паралельного обходу сайтів із використанням Guzzle promises. Нещодавно оновлено до версії 9: додано новий CrawlResponse об'єкт, покращено контроль області обходу, інструменти для тестування та інше.
Ключові можливості:
- Обробка подій обходу через closure callbacks та observer classes
CrawlResponse— об'єкт з typed accessors- Збір URL і контроль області обходу
- Тестування за допомогою
fake() - Та інше...
# Обробка подій обходу
Crawler підтримує два підходи до обробки подій обходу: closure callbacks та observer classes. Підхід із closure callbacks виглядає так:
use Spatie\Crawler\Crawler;
use Spatie\Crawler\CrawlResponse;
Crawler::create('https://example.com')
->onCrawled(function (string $url, CrawlResponse $response) {
echo "{$url}: {$response->status()}\n";
})
->start();
Обробники onFailed() і onFinished() працюють за тією ж схемою для помилок і логіки після обходу. Є також onWillCrawl(), який викликається перед обходом URL.
# CrawlResponse
Кожен обхідний URL повертає CrawlResponse — об'єкт з typed accessors для типових перевірок:
Crawler::create('https://example.com')
->onCrawled(function (string $url, CrawlResponse $response) {
if ($response->wasRedirected()) {
echo "Redirected from: " . implode(' → ', $response->redirectHistory()) . "\n";
}
$dom = $response->dom(); // Symfony DomCrawler instance
})
->start();
Об'єкт також надає body(), header() та transferStats() для даних про час виконання.
# Збір URL і контроль області обходу
Crawler дозволяє контролювати область обходу та збирати URL без обходу кожного посилання. Це корисно, якщо потрібно отримати посилання зі сторінки — наприклад, лише внутрішні — і повернути їх без подальшої обробки:
$urls = Crawler::create('https://example.com')
->internalOnly()
->depth(3)
->foundUrls();
# Тестування з fake()
Spatie традиційно додає зручні помічники для тестування, і пакет crawler не виняток. Метод fake() дозволяє перевіряти логіку обходу без реальних HTTP-запитів. Передайте мапу URL-ів до HTML-рядків — і краулер використає їх як відповіді:
Crawler::create('https://example.com')
->fake([
'https://example.com' => '<html><a href="/about">About</a></html>',
'https://example.com/about' => '<html>About page</html>',
])
->foundUrls();
# Інші важливі моменти
- Throttling:
FixedDelayThrottle— фіксована затримка між запитами;AdaptiveThrottle— автоматичне уповільнення залежно від часу відповіді сервера retry(): автоматичні повторні спроби при помилках з'єднання та 5xx-відповідяхstream(): опціональний стримінг для зменшення використання пам'яті під час великих обхідних операційFinishReasonenum:start()повертаєCompleted,CrawlLimitReached,TimeLimitReachedабоInterrupted- JavaScript rendering: інтерфейс
JavaScriptRendererз включенимCloudflareRendererіspatie/browsershotяк рекомендований драйвер - Та інше
Повний код — на GitHub: spatie/crawler.