Spider un sitio web y solo URLs de retorno

Estoy buscando una forma de pseudo-araña de un sitio web. La clave es que realmente no quiero el contenido, sino una simple lista de URI. Puedo acercarme razonablemente a esta idea con Wget usando la opción --spider , pero al canalizar esa salida a través de un grep , parece que no puedo encontrar la magia adecuada para que funcione:

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

El filtro grep parece no tener ningún efecto en la salida de wget . ¿Tengo algo mal o hay otra herramienta que debería probar que está más orientada a proporcionar este tipo de conjunto de resultados limitados?

ACTUALIZAR

Así que descubrí fuera de línea que, de forma predeterminada, wget escribe en stderr. Me perdí eso en las páginas man (de hecho, todavía no lo he encontrado si está ahí). Una vez que conecté el retorno a la salida estándar, me acerqué a lo que necesitaba:

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

Todavía estaría interesado en otros / mejores medios para hacer este tipo de cosas, si es que existen.

Lo último que quiero hacer es descargar y analizar todo el contenido yo mismo (es decir, crear mi propia araña). Una vez que descubrí que Wget escribe en stderr de manera predeterminada, pude redirigirlo a stdout y filtrar el resultado de manera adecuada.

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

Esto me da una lista de los recursos de contenido (recursos que no son imágenes, archivos fuente CSS o JS) URI que están spidered. A partir de ahí, puedo enviar los URI a una herramienta de terceros para que pueda procesar mis necesidades.

La salida aún necesita ser simplificada ligeramente (produce duplicados como se muestra arriba), pero está casi allí y no he tenido que hacer ningún análisis yo mismo.

Crea algunas expresiones regulares para extraer las direcciones de todos

 . 

Aquí está la solución que usaría:

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

Esto generará todos los enlaces http, https, ftp y ftps de una página web. No le proporcionará urls relativas, solo URL completas.

Explicación con respecto a las opciones utilizadas en la serie de comandos canalizados:

wget -q hace que no tenga una salida excesiva (modo silencioso). wget -O: hace que el archivo descargado se repita en stdout, en lugar de guardarse en el disco.

tr es el traductor de caracteres de Unix, que se utiliza en este ejemplo para traducir nuevas líneas y tabs a espacios, así como convertir comillas simples en comillas dobles para que podamos simplificar nuestras expresiones regulares.

grep -i hace que la búsqueda no distinga entre mayúsculas y minúsculas grep -o hace que muestre solo las partes coincidentes.

sed es la utilidad Stream Unitor Unix que permite las operaciones de filtrado y transformación.

sed -e solo te permite darle una expresión.

Ejecutar este pequeño script en ” http://craigslist.org ” produjo una larga lista de enlaces:

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

He usado una herramienta llamada 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 poco hackish pero te acerca! Este es solo el primer nivel. ¡Imagina empacar esto en una secuencia de comandos auto recursiva!

Vea esta pregunta / respuesta para otra forma de hacerlo con un script de Python: ¿Cómo uso el módulo Python Scrapy para enumerar todas las URL de mi sitio web?