Múltiples descargas simultáneas usando Wget?

Respuestas:

197

usa el aria2:

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

http://aria2.sourceforge.net

Me encanta !!

gmarian
fuente
26
No veo cómo esto ayuda a descargar un sitio web: parece que solo descarga 1 archivo. Si esto es cierto, los votos deberían ser -ve.
Stephen
8
Estoy de acuerdo, esta no es una buena respuesta, porque aria2 no puede hacer reflejos web o ftp como wget o lftp. lftp hace reflejo y admite múltiples conexiones.
Anacronista
9
No olvide -sespecificar el número de divisiones y -kel tamaño mínimo por segmento dividido; de lo contrario, es posible que nunca alcance las -xconexiones máximas.
Bob
2
@Stephen esto es descargar archivos muy grandes mucho más rápido desde sitios web mediante el uso de múltiples sockets en el servidor en lugar de uno. Esto no es para raspar un sitio web.
gabeio
no admite calcetines *
Fedcomp
111

Wget no admite múltiples conexiones de socket para acelerar la descarga de archivos.

Creo que podemos hacerlo un poco mejor que la respuesta gmariana.

La forma correcta es usar aria2.

aria2c -x 16 -s 16 [url]
#          |    |
#          |    |
#          |    |
#          ---------> the number of connections here
thomas.han
fuente
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: 1y-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
Gracias por detallar los parámetros, Nick.
thomas.han
44
La opción -s sola ya no divide un archivo de un solo servidor desde la versión 1.10. Uno necesita usar --max-connection-per-server juntos para forzar el establecimiento de múltiples conexiones. Ver documentación de 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
La abreviatura de la actualización de @ SamuelLi es aria2c -x 4 -k 1M urly funcionó bien para mí (un servidor con un límite de 100k por conexión me permitió descargar a 400k con dichos parámetros)
EkriirkE
Críticamente, aria2no no apoyar descargas HTTP recursivas, lo que es una substitución de los de wgetsi -rse desea.
user2943160
55

Como el paralelo GNU aún no se mencionó, permítanme dar otra forma:

cat url.list | parallel -j 8 wget -O {#}.html {}
Nikolay Shmyrev
fuente
55
Ese es un enfoque interesante. Realmente no es aplicable cuando necesita descargar un archivo enorme y obtiene una velocidad limitada por conexión, pero puede ser útil al descargar varios archivos.
Nikola Petkanski
Ejecutar este comando ejecutaría la lista 8 veces, ¿no? Lo hice de la misma manera y en lugar de procesar cada línea con 8 paralelos, solo procesa la lista completa 8 veces.
DominiosDestacado el
44
No, divide la lista en 8 trabajos
Nikolay Shmyrev
De acuerdo, definitivamente estoy haciendo algo raro. Lo resolveré. Gracias por la rápida respuesta.
DominiosDestacado el
1
Sin embargo, ese es un uso inútilcat . En este contexto limitado, es bastante inofensivo, pero tal vez no quieras perpetrar este antipatrón.
tripleee
39

Encontré (probablemente) una solución

En el proceso de descarga de unos pocos miles de archivos de registro de un servidor al siguiente, de repente tuve la necesidad de hacer una descarga multiproceso seria en BSD, preferiblemente con Wget, ya que esa era la forma más simple que podía pensar en manejar esto. Una pequeña mirada a mi alrededor me llevó a esta pequeña pepita:

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

Simplemente repita el proceso wget -r -np -N [url]para todos los hilos que necesite ... Ahora, dado que esto no es bonito y seguramente hay mejores formas de hacerlo, pero si desea algo rápido y sucio, debería ser el truco ...

Nota: las opciones de -Nmarcas wgetdescarga sólo los archivos "nuevos", lo que significa que no archivos sobrescribir o volver a descargar a menos que sus cambios de fecha y hora en el servidor.

SMUsamaShah
fuente
11
¿Pero eso no descarga todo el conjunto de artefactos para cada proceso?
Kai Mattern
10
@KaiMattern: agregue la -ncopción: "no clobber": hace que wget ignore los archivos descargados (incluso parcialmente).
SF.
1
Tenía una lista de imágenes que necesitaba descargar, y esto también funcionó para mí: wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -ncmuy feo, pero bueno, funciona. : P
Jared
1
Tener una de esas conexiones interrumpidas por alguna razón le da archivos incompletos, sin que otras conexiones la toquen. Este método crea problemas de integridad.
muhammedv
La -bbandera ejecutará el proceso wget en segundo plano, como una alternativa al &control de trabajo de bash incorporado. STDOUT se escribirá en wget-log si -o <filename>no se especifica. Bueno para guiones. Ver wget (1) para más detalles.
Paul
21

Otro programa que puede hacer esto es axel.

axel -n <NUMBER_OF_CONNECTIONS> URL

Para la autenticación HTTP baisic,

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

Ubuntu man page .

Lord Loh
fuente
55
Este programa permite un número ilimitado de conexiones, lo cual es muy útil en algunos casos.
uglide
1
Gran herramienta para centos6.xi utiliza rpm.pbone.net/index.php3/stat/4/idpl/16390122/dir/redhat_el_6/…
satch_boogie
Axel no puede hacer autenticación básica HTTP :(
rustyx
1
Yo suelo hacerloaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Lord Loh.
¿Puedo usar Axel para descargar recursivamente una carpeta completa?
Ryan Arief
17

Una herramienta nueva (pero aún no lanzada) es Mget . Ya tiene muchas opciones conocidas de Wget y viene con una biblioteca que le permite incrustar fácilmente descargas (recursivas) en su propia aplicación.

Para responder tu pregunta:

mget --num-threads=4 [url]

ACTUALIZAR

Mget ahora se desarrolla como Wget2 con muchos errores corregidos y más funciones (por ejemplo, soporte HTTP / 2).

--num-threadses ahora --max-threads.

Rockdaboot
fuente
Buen hallazgo ¡Gracias!
user9869932
¿Algún consejo sobre cómo instalar wget2 en una Mac? El sitio solo documenta cómo instalarlo desde el origen y tiene problemas para obtener el autopoint
Chris
En nuestro script TravisCI utilizamos homebrew para instalar gettext (que incluye autopoint). Echa un vistazo a .travis_setup.sh desde el repositorio wget2.
rockdaboot
13

Recomiendo encarecidamente utilizar httrack.

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

Hará un espejo con 8 conexiones simultáneas por defecto. Httrack tiene un montón de opciones donde jugar. Echar un vistazo.

Rodrigo Bustos L.
fuente
@ aaa90210: Sería genial si hubieras explicado sucintamente las deficiencias del programa. El comentario de ArturBodera es mucho más informativo.
Richard
@ArturBodera Puede agregar el archivo cookies.txt a la carpeta desde la que ejecuta su programa y automáticamente agregará esas cookies al encabezado de descarga.
Bertoncelj1
httrack no admite los siguientes redireccionamientos
Chris Hunt
11

Como otros carteles han mencionado, te sugiero que eches un vistazo a aria2 . Desde la página de manual de Ubuntu para la versión 1.16.1:

aria2 es una utilidad para descargar archivos. Los protocolos admitidos son HTTP (S), FTP, BitTorrent y Metalink. aria2 puede descargar un archivo de múltiples fuentes / protocolos e intenta utilizar su ancho de banda máximo de descarga. Admite la descarga de un archivo de HTTP (S) / FTP y BitTorrent al mismo tiempo, mientras que los datos descargados de HTTP (S) / FTP se cargan en el enjambre de BitTorrent. Usando las sumas de comprobación de fragmentos de Metalink, aria2 valida automáticamente fragmentos de datos mientras descarga un archivo como BitTorrent.

Puede usar el -xindicador para especificar el número máximo de conexiones por servidor (predeterminado: 1):

aria2c -x 16 [url] 

Si el mismo archivo está disponible desde varias ubicaciones, puede optar por descargar desde todas ellas. Utilizar el-j indicador para especificar el número máximo de descargas paralelas para cada URI estático (predeterminado: 5).

aria2c -j 5 [url] [url2]

Echa un vistazo a http://aria2.sourceforge.net/ para obtener más información. Para información de uso, la página de manual es realmente descriptiva y tiene una sección en la parte inferior con ejemplos de uso. Se puede encontrar una versión en línea en http://aria2.sourceforge.net/manual/en/html/README.html .

runejuhl
fuente
8

wget no puede descargar en múltiples conexiones, en su lugar puede intentar utilizar otro programa como aria2.

usuario181677
fuente
4

utilizar

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

en websites.txt ponga 1 url por línea, ejemplo:

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
fuente
2

Siempre dicen que depende, pero cuando se trata de reflejar un sitio web, lo mejor existe httrack . Es súper rápido y fácil de trabajar. El único inconveniente es que se llama foro de soporte, pero puede encontrar su camino utilizando la documentación oficial . Tiene interfaz tanto de GUI como de CLI y admite cookies, solo lea los documentos. Esto es lo mejor. (Tenga cuidado con esta herramienta, puede descargar toda la web en su disco duro)

httrack -c8 [url]

Por defecto, el número máximo de conexiones simultáneas está limitado a 8 para evitar la sobrecarga del servidor

pouya
fuente
2

utilizar xargspara hacer wgettrabajar en múltiples archivos en 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

Opciones de Aria2, la forma correcta de trabajar con archivos de menos de 20 MB

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

-k 2M dividir el archivo en un fragmento de 2 MB

-ko --min-split-sizetiene un valor predeterminado de 20 mb, si no configura esta opción y el archivo por debajo de 20 mb solo se ejecutará en una sola conexión sin importar el valor de -xo-s

ewwink
fuente
1

makese puede paralelizar fácilmente (p make -j 4. ej .). Por ejemplo, aquí hay un simple Makefileque estoy usando para descargar archivos en paralelo usando 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
fuente
0

Considere usar Expresiones regulares o Globing FTP . De ese modo, podría iniciar wget varias veces con diferentes grupos de caracteres iniciales de nombre de archivo, dependiendo de su frecuencia de aparición.

Así es, por ejemplo, cómo sincronizo una carpeta entre dos 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 &

El primer wget sincroniza todos los archivos / carpetas que comienzan con 0, 1, 2... F, G, H y el segundo hilo sincroniza todo lo demás.

Esta fue la forma más fácil de sincronizar entre un NAS con un puerto Ethernet 10G (10.0.0.100) y un NAS con dos puertos Ethernet 1G (10.0.0.10 y 10.0.0.11). Uní los dos hilos wget --bind-addressa los diferentes puertos ethernet y los llamé paralelos al ponerlos &al final de cada línea. Con eso pude copiar archivos enormes con 2x 100 MB / s = 200 MB / s en total.

mgutt
fuente