PHP Manual

Stiahnutie celej stránky pomocou odkazov v PHP

06. 11. 2019

Obsah článku

Pomerne často riešim úlohu stiahnutia všetkých stránok v rámci jedného webu alebo domény, pretože potom s výsledkami vykonávam rôzne merania alebo stránky používam na fulltextové vyhľadávanie.

Jedným z možných riešení je použitie hotového nástroja Xenu, ktorý sa na webový server inštaluje veľmi ťažko (je to program pre Windows), alebo Wget, ktorý nie je všade podporovaný a vytvára ďalšiu zbytočnú závislosť.

Ak je úlohou len vytvoriť kópiu stránky na neskoršie zobrazenie, je veľmi užitočný program HTTrack, ktorý sa mi páči najviac, len pri indexovaní parametrizovaných adries URL môžeme v niektorých prípadoch stratiť presnosť.

Preto som začal hľadať nástroj, ktorý dokáže automaticky indexovať všetky stránky priamo v PHP s pokročilou konfiguráciou. Nakoniec sa z neho stal opensource projekt.

Baraja WebCrawler

Presne pre tieto potreby som implementoval vlastný balík Composer WebCrawler, ktorý dokáže proces indexovania stránok elegantne zvládnuť sám, a ak narazím na nový prípad, ďalej ho vylepšujem.

Inštaluje sa pomocou príkazu Composer:

composer require baraja-core/webcrawler

A ľahko sa používa. Stačí vytvoriť inštanciu a zavolať metódu crawl():

$crawler = new \Baraja\WebCrawler\Crawler;
$result = $crawler->crawl("https://example.com);

V premennej $result bude k dispozícii kompletný výsledok ako inštancia entity CrawledResult, ktorú odporúčam preštudovať, pretože obsahuje množstvo zaujímavých informácií o celej stránke.

Nastavenia pásového vozidla

Často musíme nejako obmedziť sťahovanie stránok, pretože inak by sme pravdepodobne stiahli celý internet.

Toto sa vykonáva pomocou entity Config, ktorej sa konfigurácia odovzdá ako pole (kľúč-hodnota) a potom sa konštruktorom odovzdá prehľadávaču.

Napríklad:

$crawler = new \Baraja\WebCrawler\Crawler(
new \Baraja\WebCrawler\Config([
// kľúč => hodnota
])
);

Možnosti nastavenia:

Kľúč Predvolená hodnota Možné hodnoty
followExternalLinks false Bool: Zostať len v rámci rovnakej domény? Môže indexovať aj externé odkazy?
sleepBetweenRequests 1000 Int: Čas čakania medzi stiahnutím každej stránky v milisekundách.
maxHttpRequests 1000000 Int: Koľko maximálne stiahnutých adries URL?
maxCrawlTimeInSeconds 30 Int: Ako dlho trvá maximálne sťahovanie v sekundách?
allowedUrls ['.+'] String[]: Pole povolených formátov URL ako regulárnych výrazov.
forbiddenUrls [''] String[]: Pole zakázaných formátov URL ako regulárnych výrazov.

Regulárny výraz musí presne zodpovedať celej adrese URL ako reťazcu.

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:

Související články

1.
Status:
All systems normal.
2024