collegamenti Web Crawler / logica pagina in PHP
-
21-08-2019 - |
Domanda
Sto scrivendo un cingolato base che memorizza nella cache le pagine semplicemente con PHP.
Tutto ciò che fa è uso get_file_contents
per ottenere contenuti di una pagina web e regex per ottenere tutti i link fuori <a href="URL">DESCRIPTION</a>
- nel momento in cui ritorna:
Array {
[url] => URL
[desc] => DESCRIPTION
}
Il problema che sto avendo è capire la logica dietro determinare se il link alla pagina è locale o sussing se si può essere in una directory locale completamente diverso.
Potrebbe essere un qualsiasi numero di combinazioni:. Vale a dire href="../folder/folder2/blah/page.html"
o href="google.com"
o href="page.html"
- le possibilità sono infinite
Quale sarebbe l'algoritmo corretto per avvicinarsi a questo? Io non voglio perdere tutti i dati che potrebbero essere importanti.
Soluzione
Prima di tutto, regex e HTML non mescolare. Usa:
foreach(DOMDocument::loadHTML($source)->getElementsByTagName('a') as $a)
{
$a->getAttribute('href');
}
Link che possono andare fuori del vostro sito iniziare con protocollo o //
, cioè.
http://example.com
//example.com/
href="google.com"
è collegamento a un file locale.
Ma se si vuole creare una copia statica di un sito, perché non basta usare wget
?
Altri suggerimenti
Consideriamo prima le proprietà di collegamenti locali.
Questi saranno essere:
- relativa senza schema e non host o
- assoluto con uno schema di 'http' o 'https' ed un host che corrisponde alla macchina da cui il script è in esecuzione
Questo è tutto la logica avresti bisogno di identificare se un link è locale.
Utilizzare la parse_url per separare i diversi componenti di un URL identificare il schema e host .
Si dovrebbe cercare http: // nel href. Altrimenti, è possibile determinare se inizia con ./ o qualsiasi combinazione di "./". Se non si trova un "/", allora si dovrebbe presumere che la sua un file. Vuoi uno script per questo?