Vários downloads simultâneos usando o Wget?

Respostas:

197

use o aria2:

aria2c -x 16 [url]
#          |
#          |
#          |
#          ----> the number of connections 

http://aria2.sourceforge.net

Eu amo isso !!

gmarian
fonte
26
Não vejo como isso ajuda a baixar um site - parece que ele baixa apenas 1 arquivo. Se isso for verdade - os votos devem ser -ve.
Stephen
8
Eu concordo, essa não é uma boa resposta, porque aria2 não pode fazer espelhamento de web ou ftp como wget ou lftp. O lftp faz espelhamento e também suporta múltiplas conexões.
anachronist
9
Não se esqueça -sde especificar o número de divisões e -ko tamanho mínimo por segmento dividido; caso contrário, você nunca poderá alcançar o número -xmáximo de conexões.
Bob
2
@ Stephen: é para baixar arquivos muito grandes muito mais rapidamente dos sites, usando vários soquetes no servidor em vez de um. Isso não significa raspar um site.
gabeio
não suporta meias *
Fedcomp 16/05
111

O Wget não suporta várias conexões de soquete para acelerar o download de arquivos.

Acho que podemos fazer um pouco melhor do que a resposta gmariana.

A maneira correta é usar aria2.

aria2c -x 16 -s 16 [url]
#          |    |
#          |    |
#          |    |
#          ---------> the number of connections here
thomas.han
fonte
19
Para documentar -x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1e-s, --split=N Download a file using N connections. If more than N URIs are given, first N URIs are used and remaining URLs are used for backup. If less than N URIs are given, those URLs are used more than once so that N connections total are made simultaneously. The number of connections to the same host is restricted by the --max-connection-per-server option. See also the --min-split-size option. Possible Values: 1-* Default: 5
Nick
Obrigado por elaborar os parâmetros, Nick.
Thomas.han 07/04
4
A opção -s sozinha não divide mais um arquivo de um único servidor desde a versão 1.10. É necessário usar --max-connection-per-server juntos para forçar o estabelecimento de várias conexões. Veja a documentação do aria2: About the number of connections Since 1.10.0 release, aria2 uses 1 connection per host by default and has 20MiB segment size restriction. So whatever value you specify using -s option, it uses 1 connection per host. To make it behave like 1.9.x, use --max-connection-per-server=4 --min-split-size=1M.
Samuel Li
1
A abreviação de @ atualização do SamuelLi é aria2c -x 4 -k 1M urle funcionou bem para mim (um servidor com um limite de 100k por conexão deixe-me baixar a 400k com referidos parâmetros)
EkriirkE
Criticamente, aria2se não oferecer downloads de HTTP recursiva, tornando-se um substituto inferior para wgetse -ré desejado.
user2943160 9/01
55

Como o paralelo GNU ainda não foi mencionado, deixe-me dar outra maneira:

cat url.list | parallel -j 8 wget -O {#}.html {}
Nikolay Shmyrev
fonte
5
Essa é uma abordagem interessante. Não é realmente aplicável quando você precisa fazer o download de um arquivo enorme e obtém velocidade limitada por conexão, mas pode ser útil ao baixar vários arquivos.
Nikola Petkanski
A execução desse comando executaria a lista 8 vezes, não? Fiz da mesma maneira e, em vez de processar cada linha com 8 paralelos, apenas processa a lista inteira 8 vezes.
DomainsFeatured
4
Não, divide a lista em 8 trabalhos #
Nikolay Shmyrev 18/09
Ok, eu definitivamente estou fazendo algo estranho. Vai descobrir isso. Obrigado pela resposta rápida.
DomainsFeatured
1
Esse é um uso inútilcat , no entanto. Nesse contexto limitado, é bastante inofensivo, mas talvez você não queira perpetrar esse antipadrão.
Tripleee
39

Encontrei (provavelmente) uma solução

No processo de download de alguns milhares de arquivos de log de um servidor para o outro, repentinamente tive a necessidade de fazer alguns downloads multithread sérios no BSD, de preferência com o Wget, pois era a maneira mais simples de pensar em lidar com isso. Um pouco olhando ao redor me levou a esta pequena pepita:

wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url]

Apenas repita o procedimento wget -r -np -N [url]para quantos threads você precisar ... Agora, dado que isso não é bonito, e certamente existem maneiras melhores de fazer isso, mas se você quiser algo rápido e sujo, deve fazer o truque ...

Nota: a opção -Ntorna o wgetdownload apenas dos arquivos "mais recentes", o que significa que não sobrescreverá nem fará o download novamente dos arquivos, a menos que o carimbo de data e hora seja alterado no servidor.

SMUsamaShah
fonte
11
Mas isso não faz o download de todo o conjunto de artefatos para cada processo?
Kai Mattern
10
@KaiMattern: adicione a -ncopção: "no clobber" - faz com que o wget ignore os arquivos baixados (mesmo parcialmente).
SF.
1
Eu tinha uma lista de imagens que precisava baixar e isso funcionou para mim também: wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -ncMuito feio, mas ei, funciona. : P
Jared
1
A interrupção de uma dessas conexões por algum motivo fornece arquivos incompletos, sem serem afetados por outras conexões. Este método cria problemas de integridade.
22317 muhammedv
O -bsinalizador executará o processo wget em segundo plano, como uma alternativa ao &controle de tarefas do bash embutido. STDOUT será gravado no wget-log se -o <filename>não for especificado. Bom para scripts. Veja wget (1) para mais detalhes.
Paul
21

Outro programa que pode fazer isso é axel.

axel -n <NUMBER_OF_CONNECTIONS> URL

Para autenticação HTTP básica,

axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"

Página de manual do Ubuntu .

Lorde Loh.
fonte
5
Este programa permite um número ilimitado de conexões, o que é muito útil em alguns casos.
Uglide 14/07
1
Ótima ferramenta. para centos6.xi usado rpm.pbone.net/index.php3/stat/4/idpl/16390122/dir/redhat_el_6/…
satch_boogie
Axel não pode fazer autenticação básica HTTP :(
rustyx
1
Eu costumo fazeraxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Lorde Loh.
posso usar o axel para baixar recursivamente uma pasta inteira?
Ryan Arief 20/01
17

Uma nova ferramenta (mas ainda não lançada) é o Mget . Ele já possui muitas opções conhecidas do Wget e vem com uma biblioteca que permite incorporar facilmente o download (recursivo) em seu próprio aplicativo.

Para responder sua pergunta:

mget --num-threads=4 [url]

ATUALIZAR

O Mget agora é desenvolvido como Wget2 com muitos bugs corrigidos e mais recursos (por exemplo, suporte a HTTP / 2).

--num-threadsé agora --max-threads.

rockdaboot
fonte
Bom achado. Obrigado!
user9869932
alguma dica sobre como instalar o wget2 em um mac? Site apenas documentos como instalá-lo a partir da fonte e tendo problemas para obter autopoint
Chris
No script do TravisCI, usamos o homebrew para instalar o gettext (que inclui o ponto automático). Dê uma olhada em .travis_setup.sh no repositório wget2.
rockdaboot
13

Eu sugiro fortemente o uso do httrack.

ex: httrack -v -w http://example.com/

Ele fará um espelho com 8 conexões simultâneas como padrão. O Httrack tem inúmeras opções de onde jogar. Dar uma olhada.

Rodrigo Bustos L.
fonte
@ aaa90210: Seria ótimo se você tivesse explicado sucintamente as deficiências do programa. O comentário de ArturBodera é muito mais informativo.
Richard
@ArturBodera Você pode adicionar o arquivo cookies.txt à pasta da qual você está executando seu programa e ele adicionará automaticamente esses cookies ao cabeçalho do download.
precisa saber é o seguinte
O httrack não suporta os seguintes redirecionamentos
Chris Hunt
11

Como outros pôsteres mencionaram, sugiro que você dê uma olhada no aria2 . Na página de manual do Ubuntu para a versão 1.16.1:

aria2 é um utilitário para baixar arquivos. Os protocolos suportados são HTTP (S), FTP, BitTorrent e Metalink. O aria2 pode baixar um arquivo de várias fontes / protocolos e tenta utilizar sua largura de banda máxima de download. Ele suporta o download de um arquivo de HTTP (S) / FTP e BitTorrent ao mesmo tempo, enquanto os dados baixados de HTTP (S) / FTP são carregados no enxame BitTorrent. Usando as somas de verificação de blocos do Metalink, o aria2 valida automaticamente blocos de dados ao baixar um arquivo como o BitTorrent.

Você pode usar o -xsinalizador para especificar o número máximo de conexões por servidor (padrão: 1):

aria2c -x 16 [url] 

Se o mesmo arquivo estiver disponível em vários locais, você poderá fazer o download de todos eles. Use o -jsinalizador para especificar o número máximo de downloads paralelos para cada URI estático (padrão: 5).

aria2c -j 5 [url] [url2]

Dê uma olhada em http://aria2.sourceforge.net/ para obter mais informações. Para informações de uso, a página de manual é realmente descritiva e possui uma seção na parte inferior com exemplos de uso. Uma versão online pode ser encontrada em http://aria2.sourceforge.net/manual/en/html/README.html .

runejuhl
fonte
8

O wget não pode baixar em várias conexões; em vez disso, você pode tentar usar outro programa como o aria2.

user181677
fonte
4

usar

aria2c -x 10 -i websites.txt >/dev/null 2>/dev/null &

em websites.txt coloque 1 url por linha, exemplo:

https://www.example.com/1.mp4
https://www.example.com/2.mp4
https://www.example.com/3.mp4
https://www.example.com/4.mp4
https://www.example.com/5.mp4
David Corp
fonte
2

Eles sempre dizem que depende, mas quando se trata de espelhar um site, existe o melhor httrack . É super rápido e fácil de trabalhar. A única desvantagem é o chamado fórum de suporte, mas você pode encontrar o seu caminho usando a documentação oficial . Possui interface GUI e CLI e suporta cookies, basta ler os documentos. Este é o melhor (seja cuidadoso com esta ferramenta, você pode baixar a Web inteira no seu disco rígido)

httrack -c8 [url]

Por padrão, número máximo de conexões simultâneas limitadas a 8 para evitar sobrecarga do servidor

pouya
fonte
2

use xargspara tornar o wgettrabalho em vários arquivos em paralelo

#!/bin/bash

mywget()
{
    wget "$1"
}

export -f mywget

# run wget in parallel using 8 thread/connection
xargs -P 8 -n 1 -I {} bash -c "mywget '{}'" < list_urls.txt

Opções Aria2, o caminho certo para trabalhar com arquivos menores que 20mb

aria2c -k 2M -x 10 -s 10 [url]

-k 2M arquivo dividido em 2mb

-kou --min-split-sizetem o valor padrão de 20mb, se você não definir esta opção e arquivar abaixo de 20mb, ela será executada apenas em uma conexão única, independentemente do valor -xou-s

ewwink
fonte
1

makepode ser paralelizado facilmente (por exemplo, make -j 4). Por exemplo, aqui está um exemplo Makefileque estou usando para baixar arquivos em paralelo usando o wget:

BASE=http://www.somewhere.com/path/to
FILES=$(shell awk '{printf "%s.ext\n", $$1}' filelist.txt)
LOG=download.log

all: $(FILES)
    echo $(FILES)

%.ext:
    wget -N -a $(LOG) $(BASE)/$@

.PHONY: all
default: all
Paul Price
fonte
0

Considere usar expressões regulares ou globbing de FTP . Com isso, você pode iniciar o wget várias vezes com diferentes grupos de caracteres iniciais de nome de arquivo, dependendo da frequência de ocorrência.

É por exemplo, como sincronizo uma pasta entre dois NAS:

wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.10 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[0-9a-hA-H]*" --directory-prefix=/volume1/foo &
wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.11 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[!0-9a-hA-H]*" --directory-prefix=/volume1/foo &

O primeiro wget sincroniza todos os arquivos / pastas iniciados com 0, 1, 2... F, G, He o segundo thread sincroniza todo o resto.

Essa foi a maneira mais fácil de sincronizar entre um NAS com uma porta Ethernet 10G (10.0.0.100) e um NAS com duas portas Ethernet 1G (10.0.0.10 e 10.0.0.11). Liguei os dois threads do wget --bind-addressàs diferentes portas Ethernet e os chamei de paralelos, colocando &no final de cada linha. Com isso, eu era capaz de copiar arquivos enormes com 2x 100 MB / s = 200 MB / s no total.

mgutt
fonte