Relativamente spesso risolvo il compito di scaricare tutte le pagine di un sito o di un dominio, perché poi eseguo varie misurazioni con i risultati, o uso le pagine per la ricerca full-text.
Una possibile soluzione è usare lo strumento già pronto Xenu, che è molto difficile da installare su un server web (è un programma Windows), o Wget, che non è supportato ovunque e crea un'altra dipendenza non necessaria.
Se il compito è solo quello di fare una copia della pagina per la visualizzazione successiva, è molto utile il programma HTTrack, che mi piace di più, solo quando si tratta di URL parametrizzati si può perdere precisione in alcuni casi.
Così ho iniziato a cercare uno strumento che possa indicizzare tutte le pagine automaticamente direttamente in PHP con una configurazione avanzata. Alla fine, questo è diventato un progetto opensource.
Proprio per queste esigenze ho implementato il mio pacchetto Composer WebCrawler, che può gestire il processo di indicizzazione delle pagine in modo elegante da solo, e se mi imbatto in un nuovo caso, lo miglioro ulteriormente.
Si installa con il comando Composer:
composer require baraja-core/webcrawler
Ed è facile da usare. Basta creare un'istanza e chiamare il metodo crawl()
:
$crawler = new \Baraja\WebCrawler\Crawler;$result = $crawler->crawl('https://example.com');
Nella variabile $result
, il risultato completo sarà disponibile come istanza dell'entità CrawledResult
, che consiglio di studiare perché contiene molte informazioni interessanti su tutto il sito.
Spesso abbiamo bisogno di limitare il download delle pagine in qualche modo, perché altrimenti probabilmente scaricheremmo tutto internet.
Questo viene fatto usando l'entità Config
, a cui viene passata la configurazione come array (chiave-valore) e poi passata al Crawler dal costruttore.
Per esempio:
$crawler = new \Baraja\WebCrawler\Crawler(new \Baraja\WebCrawler\Config([// chiave => valore]));
Opzioni di impostazione:
Chiave | Valore predefinito | Valori possibili |
---|---|---|
followExternalLinks |
false |
Bool : Resta solo all'interno dello stesso dominio? Può indicizzare anche i link esterni? |
sleepBetweenRequests |
1000 |
Int : tempo di attesa tra il download di ogni pagina in millisecondi. |
maxHttpRequests |
1000000 |
Int : Quanti URL massimi scaricati? |
maxCrawlTimeInSeconds |
30 |
Int : Quanto dura il download massimo in secondi? |
allowedUrls |
['.+'] |
String[] : array di formati URL consentiti come espressioni regolari. |
forbiddenUrls |
[''] |
String[] : array di formati URL proibiti come espressioni regolari. |
L'espressione regolare deve corrispondere all'intero URL esattamente come una stringa.
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: ... | it