¿Hay wget paralelo? ¿Algo como fping pero solo para descargar?

15

Encontré solo puf (Buscador de URL paralelo) pero no pude hacerlo leer las URL de un archivo; algo como

 puf < urls.txt

tampoco funciona

El sistema operativo instalado en el servidor es Ubuntu.

Caminante lunar
fuente
Esto podría hacerse con la biblioteca Python y pycurl y un poco de lógica de pegamento en un script. Pero no conozco una herramienta "enlatada" para eso.
Keith
@Keith ¿Es este enfoque mejor que usar alguna biblioteca asíncrona como gevent con urllib?
Moonwalker
urllib no está diseñado para usarse de forma asincrónica. El libcurl tiene su propio bucle asíncrono y se puede configurar para realizar al menos 1000 descargas simultáneas utilizando la interfaz "multi".
Keith
@Keith Me gusta tu respuesta, así que ¿podrías escribirla como una respuesta "real" para tomar el debido crédito por ella?
Moonwalker

Respuestas:

25

Usando GNU Paralelo ,

$ parallel -j $ {jobs} wget <urls.txt

o xargsde GNU Findutils ,

$ xargs -n 1 -P $ {jobs} wget <urls.txt

donde ${jobs}está el número máximo de wgetdesea permitir la ejecución simultánea (ajuste -npara 1conseguir una wgetinvocación por línea en urls.txt). Sin -j/ -P, parallelejecutará tantos trabajos a la vez como núcleos de CPU (lo que no necesariamente tiene sentido para wgetenlazado por la red IO), y xargsejecutará uno a la vez.

Una buena característica que parallelha terminado xargses mantener separada la salida de los trabajos que se ejecutan simultáneamente, pero si no le importa, xargses más probable que esté preinstalada.

efímero
fuente
Óptimo jobsdepende de muchos factores: latencia de ruta, ancho de banda de ruta, políticas de servidor remoto, etc.
dhchdhd
2

Puede implementar eso usando Python y la biblioteca pycurl. La biblioteca pycurl tiene la interfaz "multi" que implementa su propio bucle par que permite múltiples conexiones simultáneas.

Sin embargo, la interfaz es bastante similar a C y, por lo tanto, un poco engorrosa en comparación con otro código más "pitónico".

Escribí un contenedor para él que construye un cliente más completo similar al navegador. Puedes usar eso como un ejemplo. Vea el módulo de cliente pycopia.WWW.client . El HTTPConnectionManager envuelve la interfaz múltiple.

Keith
fuente
2

Esto funciona, y no lo hará DoS local o remoto, con los ajustes adecuados:

(bandwidth=5000 jobs=8; \
 parallel      \
   --round     \
   -P $jobs    \
   --nice +5   \
   --delay 2   \
   --pipepart  \
   --cat       \
   -a urls.txt \
     wget                                \
       --limit-rate=$((bandwidth/jobs))k \
       -w 1                              \
       -nv                               \
       -i {}                             \
)
dhchdhd
fuente
1

Parte de la página de manual de GNU Parallel contiene un ejemplo de un wget recursivo paralelo.

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Breadth-first-parallel-web-crawler-mirrorer

HTML se descarga dos veces: una para extraer enlaces y otra para descargar en el disco. Otro contenido solo se descarga una vez.

Si no necesita la recursividad, la respuesta del ephemient parece obvia.

Ole Tange
fuente
Solo un FYI tardío de que cualquier "solución" paralela más wget es inherentemente ineficiente porque requiere la descarga de contenido dos veces , lento debido a toda la descarga multifásica y tampoco es bueno para los administradores que tienen que pagar todo su desperdicio de ancho de banda porque no lo hicieron No use una solución eficiente.
dhchdhd
0

Las víctimas de su descarga paralela no se divertirán: esperan que una conexión sirva a cada cliente, configurar varias conexiones significa menos clientes en general. (Es decir, esto se considera comportamiento grosero).

vonbrand
fuente
1
Pero podría estar descargando archivos de diferentes servidores, por lo que esto no se aplicaría.
Renan
Además de lo que dijo @vonbrand, puede obtener algo como "Demasiadas conexiones" y no poder descargar todos los archivos. Y puede ser un poco más lento (por ejemplo, reutilizar una conexión HTTP en comparación con crear varias conexiones HTTP)
golimar
2
Mientras mantengas el número cuerdo, no es gran cosa. Por ejemplo, en el momento en que escribió esto, Firefox estaba usando 15 conexiones por servidor cuando no usaba conexiones persistentes (desde entonces han cambiado a probar solo conexiones persistentes, que están limitadas a 6 por servidor). Otros navegadores usan números similares.
derobert