Faça o download de vários URLs de uma só vez

7

Estou ciente de wget -i como uma maneira de fazer o download de uma lista de URLs. O único problema é que preciso passar alguns dados POST diferentes para cada um, o que funciona para URLs únicas usando wget --post-data= , mas não para listas.

Estou aberto a qualquer downloader CLI, ou mesmo algo em JS ou Python. No entanto, gostaria de obter uma barra de progresso para cada download ou um arquivo de log atualizado a cada vez que um dl terminar, ou alguma outra maneira de saber quando um dl terminar.

    
por themirror 11.02.2014 / 02:55

3 respostas

3

Se você já tiver uma lista de URLs, basta adicionar os dados POST a essa lista. Algo como:

www.example.com    postdata1
www.foo.com
www.bar.com       second_post_data

Em seguida, em vez de usar -i , leia o arquivo em um loop bash e passe os dados para wget:

while read url post; do wget --post-data="$post" $url; done < list.txt

Para executá-los em paralelo para que vários arquivos sejam baixados ao mesmo tempo, use & em vez de ; . No entanto, é muito cuidadoso que isso inicie um processo wget separado para cada URL.

while read url post; do wget --post-data="$post" $url & done < list.txt

Um truque que eu uso para lançar esse tipo de coisa é manter o controle de quantos estão atualmente em execução e só executar o próximo se o número estiver abaixo de um limite, 10 por exemplo:

while read url post; do 
 while [[ "$(pgrep -fc wget)" -gt 9 && $c -gt 10 ]]; do sleep 1; done; 
 ((c++));  
 echo "Launching $url ($c)"; 
 wget --post-data="$post" $url >/dev/null 2>&1 && echo "$c finsihed" & 
done < list.txt

Isso lançará as 10 primeiras URLs e esperará que uma delas termine e lance a próxima.

    
por 11.02.2014 / 03:01
2

Você pode definir um arquivo CSV delimitado com este formato (por exemplo):

URL1;POSTDATA1
URL2;POSTDATA2
...

e analise-o usando um comando awk :

awk -F\; '{print "wget -i "$1" --post-data="$2}' your_CSV_file
    
por 11.02.2014 / 03:01
2

Eu não usei essa ferramenta antes, mas pensei em adicioná-la, já que parece exatamente o que você está procurando.

uget

É uma ferramenta de GUI chamada uget . Ele tem a capacidade de obter um arquivo de entrada que contenha as URLs para download junto com os dados HTTP POST de um segundo arquivo. Não está claro se isso permite que você use dados POST diferentes por URL ou se é um único conjunto para todas as URLs, mas pode valer a pena dar uma olhada mais de perto.

$ uget-gtk --help
...
  -i, --input-file=FILE         add URLs found in FILE.
  --http-post-data=STRING       use the POST method; send STRING as the data.
  --http-post-file=FILE         use the POST method; send contents of FILE
capturas de tela

    
por 11.02.2014 / 03:47

Tags