67 votes

Spider un site Web et renvoyer uniquement les URL

Je cherche un moyen de pseudo-spider un site web. La clé est que je ne veux pas vraiment le contenu, mais plutôt une simple liste d'URIs. Je peux m'approcher raisonnablement de cette idée avec Wget en utilisant le --spider mais lorsque l'on fait passer cette sortie par l'option grep je n'arrive pas à trouver la bonne magie pour que ça marche :

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

El grep semble n'avoir absolument aucun effet sur le wget sortie. Est-ce que je me trompe ou existe-t-il un autre outil que je devrais essayer et qui est plus adapté pour fournir ce type de résultats limités ?

UPDATE

Je viens donc de découvrir hors ligne que, par défaut, wget écrit sur stderr. J'ai raté ça dans les pages du manuel (en fait, je ne l'ai toujours pas trouvé s'il est là). Une fois que j'ai fait passer le retour à stdout, je me suis rapproché de ce dont j'ai besoin :

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

Je serais toujours intéressé par d'autres/meilleurs moyens de faire ce genre de choses, s'il en existe.

0 votes

Voir cette question/réponse pour une autre façon d'utiliser un script de python : stackoverflow.com/questions/9561020/

0 votes

Duplication possible de Obtenir une liste d'URLs d'un site

61voto

Rob Wilkerson Points 12220

L'absolu dernier Ce que je veux faire, c'est télécharger et analyser tout le contenu moi-même (c'est-à-dire créer mon propre spider). Une fois que j'ai appris que Wget écrit sur stderr par défaut, j'ai pu le rediriger vers stdout et filtrer la sortie de manière appropriée.

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

J'obtiens ainsi une liste des URI de ressources de contenu (ressources qui ne sont pas des images, des fichiers sources CSS ou JS) qui sont explorées. À partir de là, je peux envoyer les URI à un outil tiers qui les traitera en fonction de mes besoins.

La sortie doit encore être légèrement simplifiée (elle produit des doublons comme indiqué ci-dessus), mais c'est presque terminé et je n'ai pas eu à faire d'analyse moi-même.

5 votes

wget -r --spider -l1 -A mp3 http://example.com/page-with-mp3s 2>&1 | grep -Eio http.+mp3 a été un bon billet magique pour moi. Merci !

4 votes

Je passe généralement cette sortie à sort | uniq pour supprimer les doublons, FYI.

2 votes

Je sais que 5 ans se sont écoulés depuis cette réponse mais pouvez-vous accélérer le processus ? Cela prend quelques secondes, voire quelques minutes pour les sites de 200 urls.

24voto

Jay Taylor Points 3262

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

<a href="(ADDRESS_IS_HERE)">.

Voici la solution que j'utiliserais :

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

Cette commande affichera tous les liens http, https, ftp et ftps d'une page Web. Elle ne vous donnera pas les urls relatives, seulement les urls complètes.

Explication concernant les options utilisées dans la série de commandes pipées :

wget -q permet de ne pas avoir une sortie excessive (mode silencieux). wget -O - fait en sorte que le fichier téléchargé soit renvoyé vers stdout, plutôt qu'enregistré sur le disque.

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

grep -i rend la recherche insensible à la casse grep -o permet d'afficher uniquement les parties correspondantes.

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

sed -e vous permet simplement de lui fournir une expression.

En exécutant ce petit script sur " http://craigslist.org "a donné 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/
...

0 votes

Très cool. Mais les versions Win32 des outils s'étouffent... Quelque part. Pouvez-vous dire comment les modifier pour Cygwin ou directement pour Windows ?

0 votes

@Snowy Je ne suis pas sûr de ce que vous voulez dire par "étouffer". Cygwin devrait fonctionner correctement. Vous pouvez également essayer d'utiliser curl au lieu de wget .

2 votes

Je tiens à préciser que @Rob voulait obtenir toutes les urls d'un site web et non d'une page web.

7voto

Richard Points 240

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

C'est un peu bidouillé mais ça vous rapproche ! Ceci n'est que le premier niveau. Imaginez que vous puissiez emballer tout cela dans un script auto-récursif !

0 votes

Merci ... cela semble parfait pour créer un script de contournement de mon problème wget ( opendata.stackexchange.com/q/4851/263 )

1voto

Adam Points 362

Voir cette question/réponse pour une autre façon de le faire avec un script python : Comment utiliser le module Python Scrapy pour lister toutes les URLs de mon site web ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X