Stosunkowo często rozwiązuję zadanie pobrania wszystkich stron w obrębie jednej witryny lub domeny, ponieważ następnie wykonuję różne pomiary z wykorzystaniem wyników lub wykorzystuję strony do wyszukiwania pełnotekstowego.
Jednym z możliwych rozwiązań jest użycie gotowego narzędzia Xenu, które jest bardzo trudne do zainstalowania na serwerze WWW (jest to program dla systemu Windows), lub Wget, które nie wszędzie jest obsługiwane i tworzy kolejną niepotrzebną zależność.
Jeśli zadanie polega tylko na wykonaniu kopii strony do późniejszego przeglądania, bardzo przydatny jest program HTTrack, który lubię najbardziej, tylko że przy indeksowaniu sparametryzowanych adresów URL w niektórych przypadkach możemy stracić dokładność.
Zacząłem więc szukać narzędzia, które potrafi automatycznie indeksować wszystkie strony bezpośrednio w PHP z możliwością zaawansowanej konfiguracji. Ostatecznie stał się on projektem typu open source.
Właśnie dla takich potrzeb zaimplementowałem własny pakiet Composer WebCrawler, który sam potrafi elegancko obsłużyć proces indeksowania stron, a jeśli natrafię na nowy przypadek, jeszcze go udoskonalam.
Instaluje się go za pomocą polecenia Composer:
composer require baraja-core/webcrawler
I jest łatwy w użyciu. Wystarczy utworzyć instancję i wywołać metodę crawl()
:
$crawler = new \Baraja\WebCrawler\Crawler;$result = $crawler->crawl('https://example.com');
W zmiennej $result
kompletny wynik będzie dostępny jako instancja encji CrawledResult
, którą polecam przestudiować, ponieważ zawiera ona wiele ciekawych informacji o całej witrynie.
Często musimy w jakiś sposób ograniczyć pobieranie stron, ponieważ w przeciwnym razie prawdopodobnie pobralibyśmy cały Internet.
Służy do tego encja Config
, której przekazywana jest konfiguracja w postaci tablicy (klucz-wartość), a następnie przekazywana do crawlera przez konstruktor.
Na przykład:
$crawler = new \Baraja\WebCrawler\Crawler(new \Baraja\WebCrawler\Config([// klucz => wartość]));
Opcje ustawień:
Klucz | Wartość domyślna | Możliwe wartości |
---|---|---|
followExternalLinks |
false |
Bool : Pozostać tylko w tej samej domenie? Czy może indeksować również linki zewnętrzne? |
sleepBetweenRequests |
1000 |
Int : Czas oczekiwania pomiędzy pobraniem każdej strony w milisekundach. |
maxHttpRequests |
1000000 |
Int : Ile maksymalnie pobranych adresów URL? |
maxCrawlTimeInSeconds |
30 |
Int : Jak długo może trwać maksymalne pobieranie w sekundach? |
allowedUrls |
['.+'] |
String[] : Tablica dozwolonych formatów URL jako wyrażeń regularnych. |
forbiddenUrls |
[''] |
String[] : Tablica zakazanych formatów URL jako wyrażeń regularnych. |
Wyrażenie regularne musi pasować do całego adresu URL dokładnie w postaci ciągu znaków.
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: ... | pl