C'è parallelo wget? Qualcosa come il fping ma solo per il download?


15

Ho trovato solo puf (Parallel URL fetcher) ma non sono riuscito a farlo leggere gli URL da un file; qualcosa di simile a

 puf < urls.txt

non funziona neanche.

Il sistema operativo installato sul server è Ubuntu.


Questo potrebbe essere fatto con la libreria Python e pycurl e un po 'di logica di colla in uno script. Ma non conosco uno strumento "in scatola" per quello.
Keith

@Keith Questo approccio è meglio dell'uso di alcune librerie asincrone come gevent con urllib?
Moonwalker

urllib non è progettato per essere utilizzato in modo asincrono. Libcurl ha il suo loop asincrono e può essere impostato per eseguire almeno 1000 recuperi simultanei usando l'interfaccia "multi".
Keith,

@Keith Mi piace di più la tua risposta, quindi potresti scriverla come una risposta "reale" per prenderti il ​​dovuto merito?
Moonwalker,

Risposte:


25

Usando GNU Parallel ,

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

o xargsda GNU Findutils ,

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

dove ${jobs}è il numero massimo di wgetsi desidera consentire per l'esecuzione simultanea (impostazione -nper 1ottenere wgetun'invocazione per riga in urls.txt). Senza -j/ -P, paralleleseguirà tutti i lavori alla volta quanti i core della CPU (che non ha necessariamente senso per il wgetvincolo dall'IO della rete) e xargsverrà eseguito uno alla volta.

Una bella funzionalità che parallelha superato xargsè quella di mantenere separato l'output dei lavori in esecuzione contemporaneamente, ma se non ti interessa, xargsè più probabile che sia preinstallato.


L'ottimale jobsdipende da molti fattori: latenza del percorso, larghezza di banda del percorso, criteri del server remoto, ecc.
dhchdhd,


2

Puoi implementarlo usando Python e la libreria pycurl. La libreria pycurl ha l'interfaccia "multi" che implementa il proprio ciclo uniforme che consente connessioni multiple simultanee.

Tuttavia l'interfaccia è piuttosto simile a C e quindi un po 'ingombrante rispetto ad altri, più "Pythonic", codice.

Ho scritto un wrapper per esso che crea un client simile a un browser più completo. Puoi usarlo come esempio. Vedi il modulo pycopia.WWW.client . HTTPConnectionManager esegue il wrapping dell'interfaccia multipla.


2

Funziona e non farà DoS locale o remoto, con le opportune regolazioni:

(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 {}                             \
)

1

Parte della pagina man di GNU Parallel contiene un esempio di wget ricorsivo parallelo.

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

L'HTML viene scaricato due volte: una volta per estrarre i collegamenti e una volta per il download su disco. Gli altri contenuti vengono scaricati solo una volta.

Se non hai bisogno della ricorsività, la risposta effimera sembra ovvia.


Solo una FYI in ritardo che qualsiasi "soluzione" parallela più wget è intrinsecamente inefficiente perché richiede il download di contenuti due volte , lento a causa di tutto il download multifase e non è bello nemmeno per i sysops che devono pagare per tutto il tuo spreco di larghezza di banda perché non hai usare una soluzione efficiente.
dhchdhd,

0

Le vittime del download di Paralell non si divertiranno: si aspettano una connessione per servire ciascun client, la creazione di più connessioni significa meno client in generale. (Cioè, questo è considerato un comportamento scortese).


1
Ma potrebbe scaricare file da server diversi, quindi questo non si applica.
Renan,

Oltre a ciò che ha detto @vonbrand, potresti ottenere qualcosa come "Troppe connessioni" e non essere in grado di scaricare tutti i file. E può essere un po 'più lento (ad esempio riutilizzando una connessione HTTP rispetto alla creazione di più connessioni HTTP)
golimar

2
Finché mantieni il numero sano di mente, non è un grosso problema. Ad esempio, al momento in cui hai scritto questo, Firefox utilizzava 15 connessioni per server quando non utilizzava connessioni persistenti (da allora sono passati a provare solo connessioni persistenti, che sono limitate a 6 per server). Altri browser usano numeri simili.
derobert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.