Spider un sito Web e URL di ritorno solo

Sto cercando un modo per pseudo-spider di un sito web. La chiave è che in realtà non voglio il contenuto, ma piuttosto un semplice elenco di URI. Posso essere ragionevolmente vicino a questa idea con Wget usando l’opzione --spider , ma quando --spider piping con un output in grep , non riesco a trovare la magia giusta per farlo funzionare:

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

Il filtro grep sembra non avere assolutamente alcun effetto sull’output di wget . Ho qualcosa che non va o c’è un altro strumento che dovrei provare che è più orientato a fornire questo tipo di set di risultati limitati?

AGGIORNARE

Quindi ho appena scoperto offline che, per impostazione predefinita, wget scrive su stderr. L’ho perso nelle pagine man (infatti, non l’ho ancora trovato se è lì dentro). Una volta convogliato il ritorno allo stdout, mi sono avvicinato a ciò di cui ho bisogno:

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

Sarei ancora interessato ad altri / mezzi migliori per fare questo genere di cose, se esistono.

L’ ultima cosa che voglio fare è scaricare e analizzare personalmente tutto il contenuto (cioè creare il mio spider). Una volta appreso che Wget scrive su stderr di default, sono stato in grado di redirect a stdout e filtrare l’output in modo appropriato.

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

Questo mi dà un elenco delle risorse del contenuto (risorse che non sono immagini, CSS o file sorgente JS) URI che sono spiderati. Da lì, posso inviare gli URI a uno strumento di terze parti per l’elaborazione per soddisfare le mie esigenze.

L’output deve ancora essere leggermente semplificato (produce duplicati come mostrato sopra), ma è quasi arrivato e non ho dovuto fare nessun’altra analisi.

Crea alcune espressioni regolari per estrarre gli indirizzi da tutti

 . 

Ecco la soluzione che userei:

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

Questo produrrà tutti i link http, https, ftp e ftps da una pagina web. Non ti darà url relativi, solo url completi.

Spiegazione relativa alle opzioni utilizzate nella serie di comandi inviati tramite pipe:

wget -q non ha un’uscita eccessiva (modalità silenziosa). wget -O – fa in modo che il file scaricato venga riprodotto su stdout, anziché salvato su disco.

tr è il traduttore di caratteri unix, utilizzato in questo esempio per tradurre le nuove righe e le tabulazioni in spazi, nonché convertire le virgolette singole in virgolette doppie in modo da semplificare le nostre espressioni regolari.

grep -i rende grep-la ricerca senza distinzione tra maiuscole e minuscole -o fa in modo che emetta solo le parti corrispondenti.

sed è l’utility unix Stream EDitor che consente operazioni di filtraggio e trasformazione.

sed -e ti lascia solo darle un’espressione.

L’esecuzione di questo piccolo script su ” http://craigslist.org ” ha prodotto una lunga lista di link:

 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/ ... 

Ho usato uno strumento chiamato 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 po ‘di hacker ma ti avvicina! Questo è solo il primo livello. Immagina di impacchettarlo in una sceneggiatura auto-ricorsiva!

Vedi questa domanda / risposta per un altro modo di farlo con uno script python: come posso usare il modulo Python Scrapy per elencare tutti gli URL dal mio sito web?