Estoy usando wget para descargar el contenido del sitio web, pero wget descarga los archivos uno por uno.
¿Cómo puedo hacer la descarga de wget usando 4 conexiones simultáneas?
Estoy usando wget para descargar el contenido del sitio web, pero wget descarga los archivos uno por uno.
¿Cómo puedo hacer la descarga de wget usando 4 conexiones simultáneas?
Respuestas:
usa el aria2:
aria2c -x 16 [url]
# |
# |
# |
# ----> the number of connections
Me encanta !!
-s
especificar el número de divisiones y -k
el tamaño mínimo por segmento dividido; de lo contrario, es posible que nunca alcance las -x
conexiones máximas.
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
-x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1
y-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
y funcionó bien para mí (un servidor con un límite de 100k por conexión me permitió descargar a 400k con dichos parámetros)
aria2
no no apoyar descargas HTTP recursivas, lo que es una substitución de los de wget
si -r
se desea.
Como el paralelo GNU aún no se mencionó, permítanme dar otra forma:
cat url.list | parallel -j 8 wget -O {#}.html {}
cat
. En este contexto limitado, es bastante inofensivo, pero tal vez no quieras perpetrar este antipatrón.
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 -N
marcas wget
descarga 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.
-nc
opción: "no clobber": hace que wget ignore los archivos descargados (incluso parcialmente).
wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc
muy feo, pero bueno, funciona. : P
-b
bandera 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.
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"
axel -n 4 "user:pasword@http://domain.tld/path/file.ext"
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-threads
es ahora --max-threads
.
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.
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 -x
indicador 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 .
wget no puede descargar en múltiples conexiones, en su lugar puede intentar utilizar otro programa como aria2.
prueba pcurl
http://sourceforge.net/projects/pcurl/
usa curl en lugar de wget, descargas en 10 segmentos en paralelo.
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
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
utilizar xargs
para hacer wget
trabajar 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
-k
o --min-split-size
tiene 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 -x
o-s
make
se puede paralelizar fácilmente (p make -j 4
. ej .). Por ejemplo, aquí hay un simple Makefile
que 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
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-address
a 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.