Stažení celého webu po odkazech v PHP

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.

Baraja WebCrawler

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.

Nastavení crawleru

Č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.

Potřebujete poradit s PHP?

Nabízím trénink vývojářů, konzultace, školení a analýzu návrhových vzorů. Osobně v Praze nebo přes Skype.

Napište mi, pokud si nevíte rady.

Lektor: Jan Barášek

Pomohl Vám tento článek?