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:
Nabízím trénink vývojářů, konzultace, školení a analýzu návrhových vzorů. Osobně v Praze nebo online.
Napište mi, pokud si nevíte rady.
Lektor: Jan Barášek
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | cs