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.
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.
Č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:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | sk