¿Cómo uso wget con una lista de URL y sus archivos de salida correspondientes?

35

Supongamos que se list_of_urlsve así:

http://www.url1.com/some.txt
http://www.url2.com/video.mp4

Sé cómo usar eso con:

wget -i list_of_urls

Pero, ¿qué pasa si mi list_of_urlstiene esto, y todos devuelven archivos adecuados como PDF o videos:

http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit

Para un solo archivo podría hacer esto:

wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"

¿Cómo uso wgetpara descargar esa lista de URL y guardar los datos devueltos en el archivo local adecuado?

Equipo
fuente

Respuestas:

33

De forma predeterminada, wget escribe en un archivo cuyo nombre es el último componente de la URL que le pasa. Muchos servidores redirigen las URL como http://www.url1.com/app?q=123&gibb=erish&gar=blea una URL diferente con un nombre de archivo atractivo http://download.url1.com/files/something.pdf. Puede decirle a wget que use el nombre de la URL redirigida (es decir something.pdf) en lugar de app?q=123&gibb=erish&gar=blepasar la --trust-server-namesopción. Este no es el modo predeterminado porque, si se usa descuidadamente, podría llevar a sobrescribir un nombre de archivo impredecible en el directorio actual; pero si confía en el servidor o está trabajando en un directorio que no contiene otros archivos preciosos, --trust-server-namesgeneralmente es lo correcto.

Algunos servidores usan un Content-Dispositionencabezado en lugar de la redirección para especificar un nombre de archivo. Pase la --content-dispositionopción para hacer que wget use este nombre de archivo.

Así:

wget --content-disposition --trust-server-names -i list_of_urls

Si todavía no obtiene nombres de archivo atractivos, puede especificar los suyos. Supongamos que tiene un archivo que contiene líneas como

http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt

Para hacer que wget descargue los archivos a los nombres de archivo especificados, suponiendo que no haya espacios en blanco en la URL o en los nombres de archivo:

err=0
while read -r url filename tail; do
  wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names

La errvariable contiene 0 si todas las descargas tuvieron éxito y 1 de lo contrario, puede hacerlo return $errsi coloca este fragmento en una función o exit $errsi coloca este fragmento en una cadena.

Si no desea especificar nada más que las URL, y no puede obtener nombres agradables del servidor, puede adivinar el tipo de archivo e intentar obtener al menos extensiones significativas.

err=0
n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    ext=data
    case $(file -i tmpfile) in
      application/pdf) ext=pdf;;
      image/jpeg) ext=jpg;;
      text/html) ext=html;;
      text/*) ext=txt;;
    esac
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

Agregue otros tipos según lo desee. Si su filecomando no tiene la -mopción, déjelo fuera y verifique qué fileretorna en su sistema para los tipos de archivo que le interesan. Si tiene un archivo /etc/mime.typesen su sistema, puede leer asociaciones de tipos MIME a extensiones desde en lugar de proporcionar tu propia lista:

n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    mime_type=$(file -m tmpfile)
    ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done
Gilles 'SO- deja de ser malvado'
fuente
2

Podrías recorrer las entradas en tu list_of_urls. Algo como esto:

while read -r url; do
    wget -O foo $url
done < list_of_urls

Tenga en cuenta que tendrá que agregar su propia forma de determinar foocada entrada de la list_of_urls(también, supongo que este es un archivo en su disco).

rahmu
fuente
Aquí hay una variación al respecto: cree un pequeño script con una línea wget -O $2 $1. En el archivo list_of_urls, hacer que cada línea de una url, espacio en blanco, un nombre de archivo (por ejemplo http://url1/blah&blah=whatever some.pdfA continuación, utilice el mismo que el anterior, en sustitución de la línea de wget con. ./thatscript.sh $urlEn este caso. $urlEn realidad, es una línea con una URL y un nombre de archivo, por supuesto.
goldilocks
2
Variación 2: coloque las URL y los nombres de archivo en líneas separadas y alternas en el archivo list_of_urls, luego use while read url; do read filename; wget -O $filename $url; done < list_of_urls.
Ricitos de Oro
2

Puede usar directamente la wgetopción:

wget -r -i list_of_urls
Steph
fuente
Esto no funciona: -rpermite la descarga recursiva. Los nombres de archivo no están configurados correctamente.
jofel