Estou usando o wget para baixar o conteúdo do site, mas o wget baixa os arquivos um por um.
Como posso fazer o download do wget usando 4 conexões simultâneas?
Estou usando o wget para baixar o conteúdo do site, mas o wget baixa os arquivos um por um.
Como posso fazer o download do wget usando 4 conexões simultâneas?
Respostas:
use o aria2:
aria2c -x 16 [url]
# |
# |
# |
# ----> the number of connections
Eu amo isso !!
-s
de especificar o número de divisões e -k
o tamanho mínimo por segmento dividido; caso contrário, você nunca poderá alcançar o número -x
máximo de conexões.
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
-x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1
e-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
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.
aria2c -x 4 -k 1M url
e funcionou bem para mim (um servidor com um limite de 100k por conexão deixe-me baixar a 400k com referidos parâmetros)
aria2
se não oferecer downloads de HTTP recursiva, tornando-se um substituto inferior para wget
se -r
é desejado.
Como o paralelo GNU ainda não foi mencionado, deixe-me dar outra maneira:
cat url.list | parallel -j 8 wget -O {#}.html {}
cat
, no entanto. Nesse contexto limitado, é bastante inofensivo, mas talvez você não queira perpetrar esse antipadrão.
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 -N
torna o wget
download 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.
-nc
opção: "no clobber" - faz com que o wget ignore os arquivos baixados (mesmo parcialmente).
wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc
Muito feio, mas ei, funciona. : P
-b
sinalizador 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.
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"
axel -n 4 "user:pasword@http://domain.tld/path/file.ext"
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
.
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.
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 -x
sinalizador 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 -j
sinalizador 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 .
O wget não pode baixar em várias conexões; em vez disso, você pode tentar usar outro programa como o aria2.
tente pcurl
http://sourceforge.net/projects/pcurl/
usa curl em vez de wget, baixa em 10 segmentos em paralelo.
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
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
use xargs
para tornar o wget
trabalho 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
-k
ou --min-split-size
tem 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 -x
ou-s
make
pode ser paralelizado facilmente (por exemplo, make -j 4
). Por exemplo, aqui está um exemplo Makefile
que 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
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, H
e 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.