Comment trouver tous les liens / pages d'un site Web

98

Est-il possible de trouver toutes les pages et liens sur TOUT site Web donné? Je voudrais entrer une URL et produire une arborescence de répertoires de tous les liens de ce site?

J'ai regardé HTTrack mais cela télécharge tout le site et j'ai simplement besoin de l'arborescence des répertoires.

Jonathan Lyon
la source
2
crawlmysite.in - le site n'existe pas
Sarah Trees

Réponses:

70

Check out linkchecker - il explorera le site (tout en obéissant robots.txt) et générera un rapport. À partir de là, vous pouvez créer un script pour une solution pour créer l'arborescence de répertoires.

Hank Gay
la source
merci beaucoup Hank! Parfait - exactement ce dont j'avais besoin. Très apprécié.
Jonathan Lyon
2
Un bel outil. J'utilisais "XENU link sleuth before". Linkchecker est beaucoup plus verbeux.
Mateng
comment faire moi-même? et que faire s'il n'y a pas de robots.txt dans un site Web?
Alan Coromano
1
@MariusKavansky Comment explorez-vous manuellement un site Web? Ou comment construisez-vous un robot d'exploration? Je ne suis pas sûr de comprendre votre question. S'il n'y a pas de robots.txtfichier, cela signifie simplement que vous pouvez explorer à votre guise.
Hank Gay
8
salut les gars, linkchecker n'a pas fonctionné pour moi lorsque je scanne le site, il ne renvoie qu'un rapport de liens rompus. Très petit rapport. alors qu'ils le font, ils ont vérifié des milliers de liens mais je ne peux pas voir où ils sont signalés. En utilisant la version 9.3, pouvez-vous nous aider?
JayPex
43

Si vous avez la console développeur (JavaScript) dans votre navigateur, vous pouvez saisir ce code dans:

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

Raccourci:

n=$$('a');for(u in n)console.log(n[u].href)
ElectroBit
la source
1
Qu'en est-il des URL "Javascript-ed"?
Pacerier
Comme ça? Que voulez-vous dire?
ElectroBit
2
Je veux dire un lien fait en utilisant Javascript. Votre solution ne le montrerait pas.
Pacerier
2
@ElectroBit J'aime vraiment ça, mais je ne suis pas sûr de ce que je regarde? Quel est l' $$opérateur? Ou est-ce juste un nom de fonction arbitraire, comme n=ABC(''a'); je ne comprends pas comment urlsobtenir tous les éléments étiquetés «a». Peux-tu expliquer? Je suppose que ce n'est pas jQuery. De quelle fonction de bibliothèque prototype parlons-nous?
zipzit
1
@zipzit Dans une poignée de navigateurs, $$()est essentiellement un raccourci pour document.querySelectorAll(). Plus d'infos sur ce lien: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit
1

Une autre alternative pourrait être

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

Avec ton c'est $$(encore plus court

Array.from($$("a")).map(x => x.href)
Sébastien
la source
plus 1 - comme ça, vous utilisez JS moderne. J'ai exécuté ce programme et, bien qu'il ait renvoyé quelques liens, il n'a pas renvoyé toutes les pages .html qui se trouvent au niveau supérieur. Y a-t-il une raison pour laquelle toutes les pages ne reviennent pas dans la liste des tableaux? Merci
Chris22
0

S'il s'agit d'une question de programmation, je vous suggère d'écrire votre propre expression régulière pour analyser tout le contenu récupéré. Les balises cibles sont IMG et A pour le HTML standard. Pour JAVA,

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

ceci avec les classes Pattern et Matcher devrait détecter le début des balises. Ajoutez la balise LINK si vous voulez également du CSS.

Cependant, ce n'est pas aussi facile que vous le pensiez initialement. De nombreuses pages Web ne sont pas bien formées. Extraire par programmation tous les liens que l'être humain peut "reconnaître" est vraiment difficile si vous devez prendre en compte toutes les expressions irrégulières.

Bonne chance!

mizubasho
la source
18
Non non non non, n'analyse pas le HTML avec regex , cela fait pleurer le bébé Jésus!
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;
}

essayez ce code ...

user4318981
la source
10
Bien que cette réponse soit probablement correcte et utile, il est préférable que vous y incluiez des explications pour expliquer comment elle aide à résoudre le problème. Cela devient particulièrement utile à l'avenir, s'il y a un changement (peut-être sans rapport) qui l'empêche de fonctionner et que les utilisateurs doivent comprendre comment cela fonctionnait autrefois.
Kevin Brown
2
Eh, c'est un peu long.
ElectroBit
1
Complètement inutile d'analyser le html de cette manière en php. php.net/manual/en/class.domdocument.php PHP a la capacité de comprendre le DOM!
JamesH