Jak znaleźć wszystkie linki / strony w witrynie

99

Czy można znaleźć wszystkie strony i linki na DOWOLNEJ witrynie? Chciałbym wprowadzić adres URL i utworzyć drzewo katalogowe wszystkich linków z tej witryny?

Patrzyłem na HTTrack, ale to pobiera całą witrynę i po prostu potrzebuję drzewa katalogów.

Jonathan Lyon
źródło
2
crawlmysite.in - strona nie istnieje
Sarah Trees

Odpowiedzi:

70

Sprawdź linkchecker - zaindeksuje witrynę (przestrzegając robots.txt) i wygeneruje raport. Stamtąd możesz utworzyć skrypt rozwiązania do tworzenia drzewa katalogów.

Hank Gay
źródło
dziękuję bardzo Hank! Idealnie - dokładnie to, czego potrzebowałem. Bardzo cenione.
Jonathan Lyon
2
Niezłe narzędzie. Używałem wcześniej „tropiciela linków XENU”. Linkchecker jest dużo bardziej szczegółowy.
Mateng
jak mam to zrobić sam? a co, jeśli w witrynie internetowej nie ma pliku robots.txt?
Alan Coromano
1
@MariusKavansky Jak ręcznie przeszukiwać witrynę? Albo jak zbudować robota? Nie jestem pewien, czy rozumiem twoje pytanie. Jeśli nie ma robots.txtpliku, oznacza to tylko, że możesz czołgać się do syta.
Hank Gay
8
Cześć, sprawdzanie linków nie zadziałało, kiedy skanuję witrynę, zwraca tylko raport o niedziałających linkach. Bardzo mały raport. wprawdzie sprawdzili tysiące linków, ale nie widzę, gdzie są one zgłaszane. Używając wersji 9.3, czy możesz pomóc?
JayPex
45

Jeśli masz w przeglądarce konsolę programisty (JavaScript), możesz wpisać ten kod w:

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

Skrócony:

n=$$('a');for(u in n)console.log(n[u].href)
ElectroBit
źródło
1
A co z adresami URL „zapisanymi w Javascript”?
Pacerier,
Jak co? Co masz na myśli?
ElectroBit
2
Mam na myśli link zrobiony za pomocą JavaScript. Twoje rozwiązanie by tego nie pokazało.
Pacerier
2
@ElectroBit Bardzo mi się podoba, ale nie jestem pewien, na co patrzę? Kim jest $$operator? A może to po prostu dowolna nazwa funkcji, tak samo jak n=ABC(''a'); nie rozumiem, w jaki sposób urlspobiera się wszystkie elementy oznaczone tagiem „a”. Możesz wytłumaczyć? Zakładam, że to nie jest jQuery. O jakiej funkcji biblioteki prototypów mówimy?
zipzit
1
@zipzit W kilku przeglądarkach $$()jest skrótem od document.querySelectorAll(). Więcej informacji pod tym linkiem: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit
2

Inną alternatywą może być

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

Z twoim $$(jest jeszcze krótszy

Array.from($$("a")).map(x => x.href)
Sebastian
źródło
plus 1 - tak jak używasz nowoczesnego JS. Uruchomiłem ten program i chociaż zwrócił kilka linków, nie zwrócił wszystkich stron .html, które są na najwyższym poziomie. Czy istnieje powód, dla którego wszystkie strony nie zwracają się na liście tablic? Dzięki
Chris22
0

Jeśli jest to pytanie programistyczne, sugerowałbym napisanie własnego wyrażenia regularnego, aby przeanalizować całą pobraną zawartość. Tagi docelowe to IMG i A dla standardowego HTML. W przypadku JAVA

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

to wraz z klasami Pattern i Matcher powinno wykryć początek tagów. Dodaj tag LINK, jeśli chcesz również CSS.

Jednak nie jest to tak łatwe, jak mogłoby się wydawać. Wiele stron internetowych nie jest poprawnie sformułowanych. Wyodrębnienie wszystkich linków programowo, które człowiek może „rozpoznać”, jest naprawdę trudne, jeśli trzeba wziąć pod uwagę wszystkie nieregularne wyrażenia.

Powodzenia!

mizubasho
źródło
19
Nie, nie, nie, nie parsuj kodu HTML za pomocą wyrażenia regularnego , bo Jezus płacze!
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;
}

wypróbuj ten kod ....

user4318981
źródło
10
Chociaż ta odpowiedź jest prawdopodobnie poprawna i przydatna, najlepiej jest dołączyć do niej jakieś wyjaśnienie, aby wyjaśnić, w jaki sposób pomaga ona rozwiązać problem. Staje się to szczególnie przydatne w przyszłości, jeśli nastąpi zmiana (prawdopodobnie niezwiązana), która spowoduje, że przestanie działać, a użytkownicy muszą zrozumieć, jak kiedyś działało.
Kevin Brown
2
Ech, to trochę za długie.
ElectroBit
1
Zupełnie niepotrzebne jest parsowanie kodu HTML w ten sposób w php. php.net/manual/en/class.domdocument.php PHP ma możliwość zrozumienia DOM!
JamesH