Como uso o wget com uma lista de URLs e seus arquivos de saída correspondentes?

33

Suponha que list_of_urls tenha esta aparência:

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

Eu sei como usar isso com:

wget -i list_of_urls

Mas, e se meu list_of_urls tiver isso, e todos eles retornarem arquivos corretos, como PDFs ou vídeos:

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

Para um único arquivo, posso fazer isso:

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

Como eu uso o wget para baixar essa lista de URLs e salvar os dados retornados no arquivo local apropriado?

    
por Kit 13.01.2013 / 13:10

3 respostas

33

Por padrão, wget grava em um arquivo cujo nome é o último componente do URL que você passa para ele. Muitos servidores redirecionam URLs como http://www.url1.com/app?q=123&gibb=erish&gar=ble para um URL diferente com um nome de arquivo bonito, como http://download.url1.com/files/something.pdf . Você pode dizer ao wget para usar o nome do URL redirecionado (por exemplo, something.pdf ) em vez de app?q=123&gibb=erish&gar=ble passando a opção --trust-server-names . Este não é o modo padrão porque, se usado de forma descuidada, pode levar a sobrescrever um nome de arquivo imprevisível no diretório atual; mas se você confia no servidor ou está trabalhando em um diretório que não contém outros arquivos preciosos, --trust-server-names geralmente é a coisa certa para usar.

Alguns servidores usam um cabeçalho Content-Disposition em vez de redirecionamento para especificar um nome de arquivo. Passe a opção --content-disposition para fazer o wget usar este nome de arquivo.

Assim:

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

Se você ainda não estiver conseguindo nomes de arquivos bonitos, talvez queira especificar os seus próprios. Suponha que você tenha um arquivo contendo linhas 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 fazer o wget, faça o download dos arquivos para os nomes de arquivo especificados, assumindo que não há caracteres em branco na URL ou nos nomes dos arquivos:

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

A variável err contém 0 se todos os downloads forem bem-sucedidos e 1 caso contrário, você poderá return $err se colocar este trecho em uma função ou exit $err se colocar este trecho em uma string.

Se você não quiser especificar nada além das URLs e não conseguir nomes legais no servidor, poderá adivinhar o tipo de arquivo e tentar obter pelo menos extensões 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

Adicione outros tipos conforme desejado. Se o comando file não tiver a opção -m , deixe-a de fora e verifique o que o file retorna no seu sistema para os tipos de arquivo de seu interesse. Se você tiver um arquivo /etc/mime.types no seu sistema, você pode ler associações de tipos MIME para extensões dele em vez de fornecer sua própria 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 \; exit} END {print \"data\"}" /etc/mime.types)
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done
    
por 14.01.2013 / 00:57
2

Você pode percorrer as entradas no seu list_of_urls . Algo parecido com isto:

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

Note que você terá que adicionar sua própria maneira de determinar foo para cada entrada do list_of_urls (também, estou assumindo que este é um arquivo no seu disco).

    
por 13.01.2013 / 13:24
2

Você pode usar diretamente a opção wget :

wget -r -i list_of_urls
    
por 09.12.2014 / 10:52