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 !!


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

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 {}

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.


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 .


5
Este programa permite um número ilimitado de conexões, o que é muito útil em alguns casos.
— Uglide 14/07


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.


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.


@ 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 .


8

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



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

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


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


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.