Відносно часто я вирішую завдання завантаження всіх сторінок в межах одного сайту або домену, оскільки потім виконую з результатами різні вимірювання, або використовую сторінки для повнотекстового пошуку.
Oдним з можливих рішень є використання готового інструменту Xenu, який дуже складно встановити на веб-сервер (це Windows-програма), або Wget, який не скрізь підтримується і створює ще одну непотрібну залежність.
Якщо стоїть завдання просто зробити копію сторінки для подальшого перегляду, то дуже корисною є програма HTTrack, яка мені найбільше подобається, тільки при індексуванні параметризованих URL можна втратити точність в деяких випадках.
Тому я почав шукати інструмент, який може автоматично індексувати всі сторінки безпосередньо в PHP з розширеною конфігурацією. Згодом він став проектом з відкритим вихідним кодом.
Саме для цих потреб я реалізував власний пакет Composer WebCrawler, який елегантно справляється з процесом індексації сторінок самостійно, а якщо мені трапляється новий випадок, то я його ще більше вдосконалюю.
Встановлюється за допомогою команди Composer:
composer require baraja-core/webcrawler
І він простий у використанні. Достатньо створити екземпляр і викликати метод crawl():
$crawler = new \Baraja\WebCrawler\Crawler;$result = $crawler->crawl('https://example.com');
У змінній $result буде доступний повний результат у вигляді екземпляру сутності CrawledResult, яку рекомендую вивчити, оскільки вона містить багато цікавої інформації про весь сайт.
Часто нам доводиться якось обмежувати завантаження сторінок, тому що інакше ми, напевно, завантажили б весь Інтернет.
Для цього використовується сутність Config, якій передається конфігурація у вигляді масиву (ключ-значення) і далі передається конструктором в Crawler.
Наприклад:
$crawler = new \Baraja\WebCrawler\Crawler(new \Baraja\WebCrawler\Config([// ключ => значення]));
Налаштування параметрів:
| Ключ | Значення за замовчуванням | Можливі значення | 
|---|---|---|
| followExternalLinks | false | Bool: Залишатися тільки в межах одного домену? Чи може він також індексувати зовнішні посилання? | 
| sleepBetweenRequests | 1000 | Int: Час очікування між завантаженням кожної сторінки в мілісекундах. | 
| maxHttpRequests | 1000000 | Int: Скільки максимально завантажених URL-адрес? | 
| maxCrawlTimeInSeconds | 30 | Int: Скільки триває максимальне завантаження в секундах? | 
| allowedUrls | ['.+'] | String[]: Масив дозволених форматів URL у вигляді регулярних виразів. | 
| forbiddenUrls | [''] | String[]: Масив заборонених форматів URL у вигляді регулярних виразів. | 
Регулярний вираз повинен точно відповідати всій URL-адресі у вигляді рядка.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články a novinky nejen ze světa PHP a programování. Nenechte si ujít jediný článek.
Články píše Jan Barášek © 2009-2025 | Kontakt | Mapa webu
Status | Aktualizováno: ... | uk