Relativně často řeším úlohu stažení všech stránek v rámci jednoho webu nebo domény, protože s výsledky pak provádím různá měření, případně stránky používám pro fulltextové vyhledávání.
Jedno z možných řešení je použití již hotového nástroje Xenu, který se ale velmi obtížně instaluje na webovém serveru (jde o program pro Windows), případně Wget, který zase ale není podporovaný všude a vzniká další zbytečná závislost.
Pokud je úkolem jenom provést kopii stránek pro pozdější prohlížení, velmi dobře poslouží program HTTrack, který mám z uvedených asi nejraději, jenom při indeování parametrizovaných URL můžeme v některých případech přijít o přesnost.
Začal jsem proto hledat nástroj, který bude umět zaindexovat všechny stránky automaticky přímo v PHP s možností pokročilé konfigurace. Nakonec z toho vznikl opensource projekt.
Přesně pro tyto potřeby jsem implementoval vlastní Composer balík WebCrawler, který umí proces indexování stránek řešit elegantně sám a pokud narazím na nový případ, tak ho dále vylepšuji.
Instaluje se Composer příkazem:
composer require baraja-core/webcrawler
A použití je snadné. Stačí vytvořit instanci a zavolat crawl() metodu:
$crawler = new \Baraja\WebCrawler\Crawler;$result = $crawler->crawl('https://example.com');
V proměnné $result bude dostupný kompletní výsledek jako instance entity CrawledResult, kterou doporučuji prostudovat, protože obsahuje mnoho zajímavých informací o celém webu.
Často potřebujeme stahování stránek nějak omezit, protože jinak bychom patrně stáhli celý internet.
K tomu slouží entita Config, které se předává konfigurace jako pole (klíč - hodnota) a následně předává konstruktorem do Crawleru.
Například:
$crawler = new \Baraja\WebCrawler\Crawler(new \Baraja\WebCrawler\Config([// key => value]));
Možnosti nastavení:
| Klíč | Výchozí hodnota | Možné hodnoty | 
|---|---|---|
| followExternalLinks | false | Bool: Zůstat jen v rámci stejné domény? Může indexovat i externí odkazy? | 
| sleepBetweenRequests | 1000 | Int: Čas čekání mezi stažením jednotlivých stránek v milisekundách. | 
| maxHttpRequests | 1000000 | Int: Kolik maximálně stáhnout URL? | 
| maxCrawlTimeInSeconds | 30 | Int: Jak dlouho maximálně stahovat v sekundách? | 
| allowedUrls | ['.+'] | String[]: Pole povolených formátů URL jako regulární výrazy. | 
| forbiddenUrls | [''] | String[]: Pole zakázaných formátů URL jako regulární výrazy. | 
Reguární výraz se musí přesně shodovat s celou URL adresou jako string.
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: ... | cs