Come trovare tutti i link / pagine su un sito web


98

È possibile trovare tutte le pagine e i collegamenti su QUALSIASI sito web? Vorrei inserire un URL e produrre un albero di directory di tutti i collegamenti da quel sito?

Ho guardato HTTrack ma questo scarica l'intero sito e ho semplicemente bisogno dell'albero delle directory.


2
crawlmysite.in - sito non esiste
Sarah Trees

Risposte:


70

Controlla linkchecker: eseguirà la scansione del sito (obbedendo robots.txt) e genererà un rapporto. Da lì, puoi scrivere una soluzione per creare l'albero delle directory.


grazie mille Hank! Perfetto, esattamente quello di cui avevo bisogno. Davvero apprezzato.
Jonathan Lyon

2
Un bel strumento. Prima stavo usando "XENU link sleuth". Linkchecker è molto più dettagliato.
Mateng

come lo faccio da solo? e se in un sito web non è presente il file robots.txt?
Alan Coromano

1
@MariusKavansky Come si esegue la scansione manuale di un sito Web? O come si costruisce un crawler? Non sono sicuro di aver capito la tua domanda. Se non ci sono robots.txtfile, significa che puoi eseguire la scansione fino al contenuto del tuo cuore.
Hank Gay

8
ciao ragazzi, linkchecker non ha funzionato per me quando eseguo la scansione del sito restituisce solo un rapporto di collegamenti interrotti. Rapporto molto piccolo. mentre lo fa hanno controllato migliaia di collegamenti ma non riesco a vedere dove sono riportati. Usando la versione 9.3 puoi aiutare per favore?
JayPex

43

Se hai la console per sviluppatori (JavaScript) nel tuo browser, puoi digitare questo codice in:

urls = document.querySelectorAll('a'); for (url in urls) console.log(urls[url].href);

Accorciato:

n=$$('a');for(u in n)console.log(n[u].href)

1
E gli URL "JavaScript-ed"?
Pacerier

Tipo cosa? Cosa intendi?
ElectroBit

2
Intendo un collegamento fatto usando Javascript. La tua soluzione non lo mostrerebbe.
Pacerier

2
@ElectroBit mi piace molto, ma non sono sicuro di cosa sto guardando? Qual è l' $$operatore? O è solo un nome di funzione arbitrario, come n=ABC(''a'); se non capissi come si urlsottengono tutti gli elementi con tag "a". Puoi spiegare? Suppongo che non sia jQuery. Di quale funzione di libreria prototipo stiamo parlando?
zipzit

1
@zipzit In una manciata di browser, $$()è fondamentalmente una scorciatoia per document.querySelectorAll(). Maggiori informazioni a questo link: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit

1

Un'altra alternativa potrebbe essere

Array.from(document.querySelectorAll("a")).map(x => x.href)

Con il tuo è $$(ancora più corto

Array.from($$("a")).map(x => x.href)

più 1 - in questo modo stai usando il moderno JS. Ho eseguito questo programma e, sebbene restituisse alcuni collegamenti, non ha restituito tutte le pagine .html che si trovano al livello superiore. C'è un motivo per cui tutte le pagine non tornano nell'elenco degli array? Grazie
Chris22

0

Se questa è una domanda di programmazione, ti suggerirei di scrivere la tua espressione regolare per analizzare tutti i contenuti recuperati. I tag di destinazione sono IMG e A per HTML standard. Per JAVA,

final String openingTags = "(<a [^>]*href=['\"]?|<img[^> ]* src=['\"]?)";

questo insieme alle classi Pattern e Matcher dovrebbe rilevare l'inizio dei tag. Aggiungi il tag LINK se desideri anche CSS.

Tuttavia, non è così facile come potresti aver pensato inizialmente. Molte pagine web non sono ben strutturate. Estrarre programmaticamente tutti i collegamenti che l'essere umano può "riconoscere" è davvero difficile se è necessario tenere conto di tutte le espressioni irregolari.

In bocca al lupo!


18
No no no no, non analizzare HTML con regex , fa piangere Gesù Bambino!
dimo414

-2
function getalllinks($url) {
    $links = array();
    if ($fp = fopen($url, 'r')) {
        $content = '';
        while ($line = fread($fp, 1024)) {
            $content. = $line;
        }
    }
    $textLen = strlen($content);
    if ($textLen > 10) {
        $startPos = 0;
        $valid = true;
        while ($valid) {
            $spos = strpos($content, '<a ', $startPos);
            if ($spos < $startPos) $valid = false;
            $spos = strpos($content, 'href', $spos);
            $spos = strpos($content, '"', $spos) + 1;
            $epos = strpos($content, '"', $spos);
            $startPos = $epos;
            $link = substr($content, $spos, $epos - $spos);
            if (strpos($link, 'http://') !== false) $links[] = $link;
        }
    }
    return $links;
}

prova questo codice ....


10
Sebbene questa risposta sia probabilmente corretta e utile, è preferibile includere qualche spiegazione insieme ad essa per spiegare come aiuta a risolvere il problema. Ciò diventa particolarmente utile in futuro, se c'è un cambiamento (forse non correlato) che fa smettere di funzionare e gli utenti devono capire come funzionava una volta.
Kevin Brown

2
Eh, è un po ' lungo.
ElectroBit

1
Completamente inutile analizzare l'html in questo modo in php. php.net/manual/en/class.domdocument.php PHP ha la capacità di comprendere il DOM!
JamesH
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.