So finden Sie alle Links / Seiten auf einer Website

97

Ist es möglich, alle Seiten und Links auf einer bestimmten Website zu finden? Ich möchte eine URL eingeben und einen Verzeichnisbaum aller Links von dieser Site erstellen.

Ich habe mir HTTrack angesehen, aber das lädt die gesamte Site herunter und ich brauche einfach den Verzeichnisbaum.

Jonathan Lyon
quelle
2
crawlmysite.in - Seite existiert nicht
Sarah Trees

Antworten:

70

Check out linkchecker - Es wird die Site crawlen (während es gehorcht robots.txt) und einen Bericht erstellen. Von dort aus können Sie eine Lösung zum Erstellen des Verzeichnisbaums erstellen.

Hank Gay
quelle
Vielen Dank Hank! Perfekt - genau das, was ich brauchte. Sehr geschätzt.
Jonathan Lyon
2
Ein schönes Werkzeug. Ich habe "XENU Link Sleuth" verwendet. Linkchecker ist weitaus ausführlicher.
Mateng
wie mache ich das selbst und was ist, wenn eine Website keine robots.txt enthält?
Alan Coromano
1
@MariusKavansky Wie crawlen Sie eine Website manuell? Oder wie baut man einen Crawler? Ich bin mir nicht sicher, ob ich deine Frage verstehe. Wenn es keine robots.txtDatei gibt, bedeutet dies nur, dass Sie nach Herzenslust kriechen können.
Hank Gay
8
Hallo Leute, Linkchecker hat bei mir nicht funktioniert, wenn ich die Site scanne. Es wird nur ein Bericht über defekte Links zurückgegeben. Sehr kleiner Bericht. Währenddessen haben sie Tausende von Links überprüft, aber ich kann nicht sehen, wo diese gemeldet werden. Können Sie bitte mit Version 9.3 helfen?
JayPex
42

Wenn Sie die Entwicklerkonsole (JavaScript) in Ihrem Browser haben, können Sie diesen Code eingeben:

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

Verkürzt:

n=$$('a');for(u in n)console.log(n[u].href)
ElectroBit
quelle
1
Was ist mit "Javascript-ed" URLs?
Pacerier
Wie was? Was meinst du?
ElectroBit
2
Ich meine einen Link mit Javascript. Ihre Lösung würde es nicht zeigen.
Pacerier
2
@ElectroBit Ich mag es wirklich, aber ich bin nicht sicher, was ich sehe? Was ist der $$Betreiber? Oder ist das nur ein beliebiger Funktionsname, genauso wie n=ABC(''a'); ich nicht verstehe, wie urlsalle mit 'a' gekennzeichneten Elemente abgerufen werden? Können Sie erklären? Ich gehe davon aus, dass es nicht jQuery ist. Welche Prototyp-Bibliotheksfunktion sprechen wir?
Zipzit
1
@zipzit In einer Handvoll Browser $$()ist im Grunde eine Abkürzung für document.querySelectorAll(). Weitere Informationen unter diesem Link: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit
1

Eine andere Alternative könnte sein

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

Mit Ihrem ist es $$(noch kürzer

Array.from($$("a")).map(x => x.href)
Sebastian
quelle
plus 1 - so verwenden Sie modernes JS. Ich habe dieses Programm ausgeführt, und obwohl es einige Links zurückgegeben hat, wurden nicht alle HTML-Seiten zurückgegeben, die sich auf der obersten Ebene befinden. Gibt es einen Grund, warum nicht alle Seiten in der Array-Liste zurückgegeben werden? Danke
Chris22
0

Wenn dies eine Programmierfrage ist, würde ich vorschlagen, dass Sie Ihren eigenen regulären Ausdruck schreiben, um alle abgerufenen Inhalte zu analysieren. Ziel-Tags sind IMG und A für Standard-HTML. Für JAVA

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

Dies sollte zusammen mit Pattern- und Matcher-Klassen den Anfang der Tags erkennen. Fügen Sie ein LINK-Tag hinzu, wenn Sie auch CSS möchten.

Es ist jedoch nicht so einfach, wie Sie vielleicht ursprünglich gedacht haben. Viele Webseiten sind nicht gut geformt. Das programmgesteuerte Extrahieren aller Verknüpfungen, die der Mensch "erkennen" kann, ist wirklich schwierig, wenn Sie alle unregelmäßigen Ausdrücke berücksichtigen müssen.

Viel Glück!

Mizubasho
quelle
18
Nein, nein, nein, analysiere HTML nicht mit Regex , es bringt Jesuskind zum Weinen!
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;
}

versuchen Sie diesen Code ....

user4318981
quelle
10
Obwohl diese Antwort wahrscheinlich richtig und nützlich ist, wird sie bevorzugt, wenn Sie eine Erklärung hinzufügen, um zu erklären, wie sie zur Lösung des Problems beiträgt. Dies ist in Zukunft besonders nützlich, wenn eine Änderung (möglicherweise ohne Bezug) dazu führt, dass sie nicht mehr funktioniert und die Benutzer verstehen müssen, wie sie einmal funktioniert hat.
Kevin Brown
2
Eh, es ist ein bisschen lang.
ElectroBit
1
Es ist völlig unnötig, das HTML auf diese Weise in PHP zu analysieren. php.net/manual/en/class.domdocument.php PHP kann das DOM verstehen!
JamesH