Spider un site Web et retourner les URL uniquement

Je cherche un moyen de pseudo-spider un site web. La clé est que je ne veux pas réellement le contenu, mais plutôt une simple liste d’URI. Je peux me rapprocher raisonnablement de cette idée avec Wget en utilisant l’option --spider , mais en diffusant cette sortie via un grep , je n’arrive pas à trouver la bonne magie pour la faire fonctionner:

 wget --spider --force-html -r -l1 http://somesite.com | grep 'Saving to:' 

Le filtre grep semble n’avoir absolument aucun effet sur la sortie wget . Ai-je un problème ou est-ce qu’il y a un autre outil que je devrais essayer et qui est plus orienté vers la fourniture de ces résultats limités?

METTRE À JOUR

Je viens donc de découvrir hors ligne que, par défaut, wget écrit sur stderr. Cela me manquait dans les pages de manuel (en fait, je ne l’ai toujours pas trouvé s’il y est). Une fois que je suis revenu à stdout, je me suis rapproché de ce dont j’avais besoin:

 wget --spider --force-html -r -l1 http://somesite.com 2>&1 | grep 'Saving to:' 

Je serais toujours intéressé par d’autres moyens / meilleurs pour faire ce genre de choses, le cas échéant.

La dernière chose absolue que je veux faire est de télécharger et d’parsingr tout le contenu moi-même (c.-à-créer mon propre araignée). Une fois que j’ai appris que Wget écrit sur stderr par défaut, j’ai pu le redirect vers stdout et filtrer correctement la sortie.

 wget --spider --force-html -r -l2 $url 2>&1 \ | grep '^--' | awk '{ print $3 }' \ | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' \ > urls.m3u 

Cela me donne une liste de la ressource de contenu (les ressources qui ne sont pas des images, des fichiers source CSS ou JS) des URI spidered. À partir de là, je peux envoyer les URI à un outil tiers pour traitement afin de répondre à mes besoins.

La sortie doit encore être légèrement rationalisée (elle produit des doublons, comme indiqué ci-dessus), mais elle est presque là et je n’ai pas eu à faire d’parsing syntaxique.

Créez quelques expressions régulières pour extraire les adresses de tous

 . 

Voici la solution que j’utiliserais:

 wget -q http://example.com -O - | \ tr "\t\r\n'" ' "' | \ grep -i -o ']\+href[ ]*=[ \t]*"\(ht\|f\)tps\?:[^"]\+"' | \ sed -e 's/^.*"\([^"]\+\)".*$/\1/g' 

Cela affichera tous les liens http, https, ftp et ftps à partir d’une page Web. Il ne vous donnera pas d’urls relatives, seulement des URL complètes.

Explication concernant les options utilisées dans les séries de commandes de canalisation:

wget -q ne lui donne pas une sortie excessive (mode silencieux). wget -O – fait en sorte que le fichier téléchargé soit répercuté sur stdout plutôt que sur le disque.

tr est le traducteur de caractères unix, utilisé dans cet exemple pour traduire les nouvelles lignes et les tabulations en espaces, ainsi que pour convertir des guillemets simples entre guillemets afin de simplifier nos expressions régulières.

grep -i fait que grep -o, insensible à la casse, ne génère que les parties correspondantes.

sed est l’utilitaire unix Stream EDitor qui permet les opérations de filtrage et de transformation.

sed -e vous laisse juste lui donner une expression.

L’exécution de ce petit script sur ” http://craigslist.org ” a généré une longue liste de liens:

 http://blog.craigslist.org/ http://24hoursoncraigslist.com/subs/nowplaying.html http://craigslistfoundation.org/ http://atlanta.craigslist.org/ http://austin.craigslist.org/ http://boston.craigslist.org/ http://chicago.craigslist.org/ http://cleveland.craigslist.org/ ... 

J’ai utilisé un outil appelé xidel

 xidel http://server -e '//a/@href' | grep -v "http" | sort -u | xargs -L1 -I {} xidel http://server/{} -e '//a/@href' | grep -v "http" | sort -u 

Un petit hackish mais ça vous rapproche! Ce n’est que le premier niveau. Imaginez-vous en faire un script récursif!

Voir cette question / réponse pour un autre moyen de le faire avec un script python: Comment utiliser le module Python Scrapy pour répertorier toutes les URL de mon site Web?