Plusieurs téléchargements simultanés en utilisant Wget?

Réponses:

197

utilisez aria2:

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

http://aria2.sourceforge.net

J'aime cela !!

gmarian
la source
26
Je ne vois pas comment cela aide à télécharger un site Web - il semble qu'il ne télécharge qu'un seul fichier. Si cela est vrai - les votes devraient être -ve.
Stephen
8
Je suis d'accord, ce n'est pas une bonne réponse, car aria2 ne peut pas faire de miroir web ou ftp comme wget ou lftp. lftp effectue la mise en miroir et prend en charge plusieurs connexions.
Anachroniste
9
N'oubliez pas -sde spécifier le nombre de divisions et -kde spécifier la taille minimale par segment divisé - sinon vous risquez de ne jamais atteindre le nombre -xmaximal de connexions.
Bob
2
@Stephen consiste à télécharger des fichiers très volumineux beaucoup plus rapidement à partir de sites Web en utilisant plusieurs sockets sur le serveur au lieu d'un. Ce n'est pas un moyen de gratter un site Web.
gabeio
ne prend pas en charge les chaussettes *
Fedcomp
111

Wget ne prend pas en charge plusieurs connexions de socket afin d'accélérer le téléchargement des fichiers.

Je pense que nous pouvons faire un peu mieux que la réponse gmarian.

La bonne façon est d'utiliser aria2.

aria2c -x 16 -s 16 [url]
#          |    |
#          |    |
#          |    |
#          ---------> the number of connections here
thomas.han
la source
19
Pour documenter -x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1et-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
Merci d'avoir précisé les paramètres, Nick.
thomas.han
4
L'option -s seule ne sépare plus un fichier d'un seul serveur depuis la version 1.10. Il faut utiliser --max-connection-per-server ensemble pour forcer l'établissement de plusieurs connexions. Voir la documentation 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
Le raccourci de la mise à jour de @ SamuelLi est aria2c -x 4 -k 1M urlet a bien fonctionné pour moi (un serveur avec une limite de 100k par connexion me permet de télécharger à 400k avec lesdits paramètres)
EkriirkE
Surtout, aria2ne prend pas en charge les téléchargements HTTP récursifs, ce qui en fait un remplacement de qualité inférieure wgetsi vous le -rsouhaitez.
user2943160
55

Puisque le parallèle GNU n'était pas encore mentionné, permettez-moi de donner une autre façon:

cat url.list | parallel -j 8 wget -O {#}.html {}
Nikolay Shmyrev
la source
5
C'est une approche intéressante. Pas vraiment applicable lorsque vous devez télécharger un énorme fichier et que vous obtenez une vitesse limitée par connexion, mais peut être utile lors du téléchargement de plusieurs fichiers.
Nikola Petkanski
L'exécution de cette commande exécuterait la liste 8 fois, non? Je l'ai fait de la même manière et au lieu de traiter chaque ligne avec 8 parallèles, il traite juste la liste entière 8 fois.
DomainsFeatured
4
Non, il divise la liste sur 8 emplois
Nikolay Shmyrev
D'accord, je fais vraiment quelque chose de bizarre. Va le comprendre. Merci pour la réponse rapide.
DomainsFeatured
1
C'est une utilisation inutile decat , cependant. Dans ce contexte limité, c'est assez inoffensif, mais peut-être que vous ne voulez pas perpétuer cet anti-modèle.
tripleee
39

J'ai trouvé (probablement) une solution

Dans le processus de téléchargement de quelques milliers de fichiers journaux d'un serveur à l'autre, j'ai soudainement eu besoin de faire un téléchargement sérieux multithread en BSD, de préférence avec Wget car c'était la façon la plus simple de penser à cela. Un petit coup d'œil m'a conduit à cette petite pépite:

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

Répétez simplement le wget -r -np -N [url]pour autant de threads que vous en avez besoin ... Maintenant étant donné que ce n'est pas joli et qu'il y a sûrement de meilleures façons de le faire, mais si vous voulez quelque chose de rapide et de sale, cela devrait faire l'affaire ...

Remarque: l'option -Npermet de wgettélécharger uniquement des fichiers "plus récents", ce qui signifie qu'elle n'écrasera ni ne téléchargera à nouveau les fichiers à moins que leur horodatage ne change sur le serveur.

SMUsamaShah
la source
11
Mais cela ne télécharge-t-il pas l'ensemble des artefacts pour chaque processus?
Kai Mattern
10
@KaiMattern: ajoutez l' -ncoption: "no clobber" - cela fait que wget ignore les fichiers déjà téléchargés (même partiellement).
SF.
1
J'avais une liste d'images que je devais télécharger, et cela a aussi fonctionné pour moi: wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nctrès moche, mais bon, ça marche. : P
Jared
1
Avoir l'une de ces connexions rompues pour une raison quelconque vous donne des fichiers inachevés, sans être touché par d'autres connexions. Cette méthode crée des problèmes d'intégrité.
muhammedv
L' -bindicateur exécutera le processus wget en arrière-plan, comme alternative au &contrôle de travail intégré de bash . STDOUT sera écrit dans wget-log s'il -o <filename>n'est pas spécifié. Bon pour les scripts. Voir wget (1) pour plus de détails.
Paul
21

Un autre programme qui peut le faire est axel.

axel -n <NUMBER_OF_CONNECTIONS> URL

Pour l'authentification HTTP baisic,

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

Page de manuel Ubuntu .

Lord Loh.
la source
5
ce programme permet un nombre illimité de connexions, ce qui est très utile dans certains cas.
uglide
1
Excellent outil. pour centos6.xi utilisé rpm.pbone.net/index.php3/stat/4/idpl/16390122/dir/redhat_el_6/…
satch_boogie
Axel ne peut pas faire d'authentification de base HTTP :(
rustyx
1
Je fais d'habitudeaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Lord Loh.
puis-je utiliser axel pour télécharger récursivement un dossier entier?
Ryan Arief
17

Un nouvel outil (mais pas encore publié) est Mget . Il a déjà de nombreuses options connues de Wget et est livré avec une bibliothèque qui vous permet d'intégrer facilement le téléchargement (récursif) dans votre propre application.

Pour répondre à ta question:

mget --num-threads=4 [url]

METTRE À JOUR

Mget est maintenant développé en tant que Wget2 avec de nombreux bugs corrigés et plus de fonctionnalités (par exemple le support HTTP / 2).

--num-threadsest maintenant --max-threads.

rockdaboot
la source
Belle trouvaille. Je vous remercie!
user9869932
des conseils sur la façon d'installer wget2 sur un mac? Le site documente uniquement comment l'installer à partir de la source et a du mal à obtenir l'autopoint
Chris
Dans notre script TravisCI, nous utilisons use homebrew pour installer gettext (qui inclut l'autopoint). Jetez un œil à .travis_setup.sh du repo wget2.
rockdaboot
13

Je suggère fortement d'utiliser httrack.

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

Il fera un miroir avec 8 connexions simultanées par défaut. Httrack a une tonne d'options où jouer. Regarde.

Rodrigo Bustos L.
la source
@ aaa90210: Ce serait formidable si vous aviez expliqué succinctement les lacunes des programmes. Le commentaire d'ArturBodera est beaucoup plus informatif.
Richard
@ArturBodera Vous pouvez ajouter le fichier cookies.txt au dossier à partir duquel vous exécutez votre programme et il ajoutera automatiquement ces cookies à l'en-tête de téléchargement.
Bertoncelj1
httrack ne prend pas en charge les redirections suivantes
Chris Hunt
11

Comme d'autres affiches l'ont mentionné, je vous suggère de jeter un œil à aria2 . Depuis la page de manuel Ubuntu pour la version 1.16.1:

aria2 est un utilitaire de téléchargement de fichiers. Les protocoles pris en charge sont HTTP (S), FTP, BitTorrent et Metalink. aria2 peut télécharger un fichier à partir de plusieurs sources / protocoles et essaie d'utiliser votre bande passante de téléchargement maximale. Il prend en charge le téléchargement d'un fichier depuis HTTP (S) / FTP et BitTorrent en même temps, tandis que les données téléchargées depuis HTTP (S) / FTP sont téléchargées vers l'essaim BitTorrent. À l'aide des sommes de contrôle des morceaux de Metalink, aria2 valide automatiquement des morceaux de données lors du téléchargement d'un fichier comme BitTorrent.

Vous pouvez utiliser l' -xindicateur pour spécifier le nombre maximal de connexions par serveur (par défaut: 1):

aria2c -x 16 [url] 

Si le même fichier est disponible à partir de plusieurs emplacements, vous pouvez choisir de télécharger à partir de chacun d'eux. Utilisez l' -jindicateur pour spécifier le nombre maximal de téléchargements parallèles pour chaque URI statique (par défaut: 5).

aria2c -j 5 [url] [url2]

Jetez un œil à http://aria2.sourceforge.net/ pour plus d'informations. Pour les informations d'utilisation, la page de manuel est vraiment descriptive et comporte une section en bas avec des exemples d'utilisation. Une version en ligne est disponible sur http://aria2.sourceforge.net/manual/en/html/README.html .

runejuhl
la source
8

wget ne peut pas télécharger dans plusieurs connexions, à la place, vous pouvez essayer d'utiliser un autre programme comme aria2.

user181677
la source
4

utilisation

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

dans website.txt, mettez 1 URL par ligne, par exemple:

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
la source
2

Ils disent toujours ça dépend mais quand il s'agit de la mise en miroir d' un site Web La meilleure existe httrack . C'est super rapide et facile à travailler. Le seul inconvénient est ce qu'on appelle le forum de support, mais vous pouvez trouver votre chemin en utilisant la documentation officielle . Il a à la fois une interface graphique et une interface CLI et il prend en charge les cookies, lisez simplement les documents C'est le meilleur. (Soyez prudent avec cet outil, vous pouvez télécharger le Web entier sur votre disque dur)

httrack -c8 [url]

Par défaut, nombre maximum de connexions simultanées limité à 8 pour éviter la surcharge du serveur

pouya
la source
2

utiliser xargspour faire wgettravailler plusieurs fichiers en parallèle

#!/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

Options Aria2, la bonne façon de travailler avec un fichier inférieur à 20 Mo

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

-k 2M diviser le fichier en morceaux de 2 Mo

-kou --min-split-sizea une valeur par défaut de 20 Mo, si vous ne définissez pas cette option et si vous déposez un fichier sous 20 Mo, il ne fonctionnera qu'en connexion unique, quelle que soit la valeur de -xou-s

ewwink
la source
1

makepeut être parallélisé facilement (par exemple, make -j 4). Par exemple, voici un simple que Makefilej'utilise pour télécharger des fichiers en parallèle à l'aide de 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
la source
0

Envisagez d'utiliser des expressions régulières ou des globes FTP . Par cela, vous pouvez démarrer wget plusieurs fois avec différents groupes de caractères de début de nom de fichier en fonction de leur fréquence d'occurrence.

C'est par exemple comment je synchronise un dossier entre deux 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 &

Le premier wget synchronise tous les fichiers / dossiers commençant par 0, 1, 2... F, G, Het le deuxième thread synchronise tout le reste.

C'était le moyen le plus simple de synchroniser un NAS avec un port Ethernet 10G (10.0.0.100) et un NAS avec deux ports Ethernet 1G (10.0.0.10 et 10.0.0.11). J'ai lié les deux threads wget --bind-addressaux différents ports Ethernet et les ai appelés parallèles en les mettant &à la fin de chaque ligne. Par cela, j'ai pu copier des fichiers énormes avec 2x 100 Mo / s = 200 Mo / s au total.

mgutt
la source