2010-05-10 17 views
46

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 conseguir bastante cerca de esta idea con Wget usando la opción --spider, pero cuando las tuberías que la salida a través de un grep, me parece que no puede encontrar la magia derecho a hacer que funcione:Spider a Website and Return URLs Only

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

El filtro parece grep no tener absolutamente ningún efecto en la salida 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?

ACTUALIZACIÓN

Así que acabo de descubrir en línea que, por defecto, 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 toqué el retorno a la salida estándar, que me acercaba a lo que necesito:

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

todavía estaría interesado en otras mejores medios/para hacer este tipo de cosas, si existe alguna.

+0

Consulte esta pregunta/respuesta de otra manera usando una secuencia de comandos de python: http://stackoverflow.com/questions/9561020/how-do-i-use-the-python-scrapy-module-to-list-all- the-urls-from-my-website –

+0

posible duplicado de [Obtener una lista de URL de un sitio] (http://stackoverflow.com/questions/857653/get-a-list-of-urls-from-a- sitio) –

Respuesta

39

La absoluta última cosa que quiero hacer es descarga y analizar todo el contenido a mí mismo (es decir, crear mi araña propia). 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 del recurso de contenido (recursos que no son imágenes, CSS o archivos de origen JS) URIs que se spidered. A partir de ahí, puedo enviar los URI a una herramienta de terceros para que pueda procesar mis necesidades.

La salida todavía tiene que 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.

+3

'wget -r --spider -l1 -A mp3 http://example.com/page-with-mp3s 2> & 1 | grep -Eio http. + Mp3' era un buen boleto mágico para mí. ¡Gracias! – AKX

+2

Normalmente paso esa salida a 'sort | uniq' para eliminar duplicados, FYI. –

+1

Sé que han pasado 5 años desde esta respuesta pero puede acelerar el proceso? Tarda segundos o incluso minutos para sitios con 200 URL – erdomester

19

Crear un par de expresiones regulares para extraer las direcciones de todas

<a href="(ADDRESS_IS_HERE)">. 

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

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

Esta voluntad todos los HTTP, HTTPS, FTP y FTPS enlaces desde 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 entubada:

wget -q hace no tiene 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 unix, utilizado en este ejemplo para traducir nuevas líneas y pestañas 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 EDitor unix que permite las operaciones de filtrado y transformación.

sed-e simplemente le permite darle una expresión.

La ejecución de este pequeño script en "http://craigslist.org" dio 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/ 
... 
+2

+1 para probar su solución :) – BenV

+0

genial: ¡D .. estaba buscando esto! – Tathagata

+0

Muy bueno. Pero las versiones de Win32 de las herramientas se están ahogando ... En algún lugar. ¿Puedes decirnos cómo modificarlos para Cygwin o Windows directo? – Snowy

5

He utilizado 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 hacker, sino que se acerca! Este es solo el primer nivel. ¡Imagina empacar esto en una secuencia de comandos auto recursiva!

+0

Gracias ... que se ve perfecto para la creación de scripts de una solución a mi problema de wget (http://opendata.stackexchange.com/q/4851/ 263) – Joe