web-dev-qa-db-fra.com

Spider un site Web et renvoyer des URL uniquement

Je cherche un moyen de pseudo-araignée d'un site Web. La clé est que je ne veux pas vraiment le contenu, mais plutôt une simple liste d'URI. Je peux me rapprocher raisonnablement de cette idée avec Wget en utilisant le --spider option, mais lorsque je passe cette sortie via un grep, je n'arrive pas à trouver la bonne magie pour le 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 quelque chose de mal ou y a-t-il un autre outil que je devrais essayer qui est plus adapté à fournir ce type de jeu de résultats limité?

[~ # ~] mise à jour [~ # ~]

Je viens donc de découvrir hors ligne que, par défaut, wget écrit dans stderr. Cela m'a manqué dans les pages de manuel (en fait, je ne l'ai toujours pas trouvé s'il est là). Une fois que j'ai acheminé le retour vers la sortie standard, 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/meilleurs moyens pour faire ce genre de chose, s'il en existe.

57
Rob Wilkerson

La chose absolue dernière que je veux faire est de télécharger et d'analyser tout le contenu moi-même (c'est-à-dire de créer ma propre araignée). 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

Cela me donne une liste des URI des ressources de contenu (ressources qui ne sont pas des images, des fichiers source CSS ou JS) qui sont araignées. De là, je peux envoyer les URI à un outil tiers pour les traiter selon 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'analyse moi-même.

47
Rob Wilkerson

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

<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'

Cela générera tous les liens http, https, ftp et ftps à partir d'une page Web. Il ne vous donnera pas d'URL relatives, seulement des URL complètes.

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

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 enregistré sur le disque.

tr est le traducteur de caractères Unix, utilisé dans cet exemple pour traduire les sauts de ligne et les tabulations en espaces, ainsi que pour convertir les guillemets simples en guillemets doubles afin que nous puissions simplifier nos expressions régulières.

grep -i rend la recherche insensible à la casse grep -o ne produit que les parties correspondantes.

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

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

L'exécution de ce petit script sur " http://craigslist.org " a produit 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/
...
21
Jay Taylor

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 peu hackish mais vous rapproche! Ce n'est que le premier niveau. Imaginez-vous emballer cela dans un script auto-récursif!

6
Rick