J'ai un petit utilitaire que j'utilise pour télécharger un fichier MP3 à partir d'un site Web selon un calendrier, puis crée / met à jour un fichier XML de podcast que j'ai ajouté à iTunes.
Le traitement de texte qui crée / met à jour le fichier XML est écrit en Python. Cependant, j'utilise wget dans un .bat
fichier Windows pour télécharger le fichier MP3 réel. Je préférerais que l'utilitaire entier soit écrit en Python.
J'ai eu du mal à trouver un moyen de télécharger réellement le fichier en Python, c'est pourquoi j'ai eu recours à l'utilisation wget
.
Alors, comment puis-je télécharger le fichier en utilisant Python?
wget
. Entre autres choses,wget
(1) préserve les horodatages (2) détermine automatiquement le nom de fichier à partir de l'URL, ajoute.1
(etc.) si le fichier existe déjà (3) a de nombreuses autres options, dont certaines peuvent avoir été insérées dans votre.wgetrc
. Si vous en voulez, vous devez les implémenter vous-même en Python, mais il est plus simple de simplement les invoquerwget
depuis Python.import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
Réponses:
En Python 2, utilisez urllib2 fourni avec la bibliothèque standard.
Il s'agit de la manière la plus simple d'utiliser la bibliothèque, sans gestion des erreurs. Vous pouvez également effectuer des tâches plus complexes telles que la modification des en-têtes. La documentation se trouve ici.
la source
urllib2.quote
Un de plus, en utilisant
urlretrieve
:(pour Python 3+
import urllib.request
eturllib.request.urlretrieve
)Encore un autre, avec une "barre de progression"
la source
if not os.path.isfile(file_name):
pour éviter d'écraser les podcasts! utile lors de son exécution en tant que cronjob avec les URL présentes dans un fichier .htmlEn 2012, utilisez la bibliothèque de requêtes python
Vous pouvez courir
pip install requests
pour l'obtenir.Les demandes présentent de nombreux avantages par rapport aux alternatives car l'API est beaucoup plus simple. Cela est particulièrement vrai si vous devez effectuer une authentification. urllib et urllib2 sont assez peu intuitifs et douloureux dans ce cas.
2015-12-30
Les gens ont exprimé leur admiration pour la barre de progression. C'est cool, bien sûr. Il existe maintenant plusieurs solutions standard, notamment
tqdm
:Il s'agit essentiellement de l'implémentation @kvance décrite il y a 30 mois.
la source
r.text
pour le contenu texte ou unicode. Renvoyé en unicode.r.content
: Pour le contenu binaire. Renvoyé en octets. Lisez à ce sujet ici: docs.python-requests.org/en/latest/user/quickstartLe
wb
inopen('test.mp3','wb')
ouvre un fichier (et efface tout fichier existant) en mode binaire afin que vous puissiez enregistrer des données avec lui au lieu de simplement du texte.la source
file.read
qui correspond au nombre d'octets à lire. Voir: gist.github.com/hughdbrown/c145b8385a2afa6570e2shutil.copyfileobj(mp3file, output)
plutôt.Python 3
urllib.request.urlopen
urllib.request.urlretrieve
Remarque: Selon la documentation,
urllib.request.urlretrieve
est une "interface héritée" et "pourrait devenir obsolète à l'avenir" (merci gerrit )Python 2
urllib2.urlopen
(merci Corey )urllib.urlretrieve
(merci PabloG )la source
urllib.request.urlretrieve
dessus, cela vous amènera à ce lien exact. À votre santé!urllib.request.urlretrieve
est documenté comme une "interface héritée" et "pourrait devenir obsolète à l'avenir".utiliser le module wget:
la source
Une version améliorée du code PabloG pour Python 2/3:
la source
Un
Python 2 & Python 3
moyen simple mais compatible est fourni avec lasix
bibliothèque:la source
la source
A écrit la bibliothèque wget en Python pur juste à cet effet. Il est optimisé
urlretrieve
avec ces fonctionnalités à partir de la version 2.0.la source
-o
pour-O
éviter toute confusion, comme c'est le cas dans GNU wget. Ou au moins les deux options doivent être valides.wget.py
un remplacement sur place pour de vraiwget
. Le-o
se comporte déjà différemment - il est compatible aveccurl
cette façon. Une note dans la documentation aiderait-elle à résoudre le problème? Ou est-ce la caractéristique essentielle pour qu'un utilitaire avec un tel nom soit compatible avec la ligne de commande?Voici les appels les plus couramment utilisés pour télécharger des fichiers en python:
urllib.urlretrieve ('url_to_file', file_name)
urllib2.urlopen('url_to_file')
requests.get(url)
wget.download('url', file_name)
Remarque:
urlopen
eturlretrieve
s'avèrent relativement mauvais avec le téléchargement de fichiers volumineux (taille> 500 Mo).requests.get
stocke le fichier en mémoire jusqu'à la fin du téléchargement.la source
Je suis d'accord avec Corey, urllib2 est plus complet que urllib et devrait probablement être le module utilisé si vous voulez faire des choses plus complexes, mais pour rendre les réponses plus complètes, urllib est un module plus simple si vous voulez juste les bases:
Fonctionnera bien. Ou, si vous ne voulez pas traiter avec l'objet "réponse", vous pouvez appeler directement read () :
la source
En python3, vous pouvez utiliser les librairies urllib3 et shutil. Téléchargez-les en utilisant pip ou pip3 (selon que python3 est par défaut ou non)
Exécutez ensuite ce code
Notez que vous téléchargez
urllib3
mais utilisezurllib
dans le codela source
Vous pouvez également obtenir le retour d'informations sur la progression avec urlretrieve:
la source
Si vous avez installé wget, vous pouvez utiliser parallel_sync.
pip installer parallel_sync
Doc: https://pythonhosted.org/parallel_sync/pages/examples.html
C'est assez puissant. Il peut télécharger des fichiers en parallèle, réessayer en cas d'échec, et il peut même télécharger des fichiers sur une machine distante.
la source
Si la vitesse vous importe, j'ai fait un petit test de performance pour les modules
urllib
etwget
, en ce qui concernewget
j'ai essayé une fois avec la barre d'état et une fois sans. J'ai pris trois fichiers différents de 500 Mo pour tester (différents fichiers - pour éliminer le risque de mise en cache sous le capot). Testé sur une machine Debian, avec python2.Premièrement, voici les résultats (ils sont similaires dans différentes séries):
La façon dont j'ai effectué le test utilise un décorateur de "profil". Voici le code complet:
urllib
semble être le plus rapidela source
Par souci d'exhaustivité, il est également possible d'appeler n'importe quel programme pour récupérer des fichiers à l'aide du
subprocess
package. Les programmes dédiés à la récupération de fichiers sont plus puissants que les fonctions Pythonurlretrieve
. Par exemple,wget
peut télécharger des répertoires de manière récursive (-R
), peut gérer le FTP, les redirections, les proxys HTTP, peut éviter de retélécharger les fichiers existants (-nc
), etaria2
peut effectuer des téléchargements à connexions multiples qui peuvent potentiellement accélérer vos téléchargements.Dans Jupyter Notebook, on peut également appeler des programmes directement avec la
!
syntaxe:la source
Le code source peut être:
la source
Vous pouvez utiliser PycURL sur Python 2 et 3.
la source
J'ai écrit ce qui suit, qui fonctionne en vanilla Python 2 ou Python 3.
Remarques:
la source
Cela peut être un peu tard, mais j'ai vu le code de pabloG et je n'ai pas pu m'empêcher d'ajouter un os.system ('cls') pour lui donner un aspect IMPRESSIONNANT! Vérifiez-le :
Si vous exécutez dans un environnement autre que Windows, vous devrez utiliser autre chose que «cls». Sous MAC OS X et Linux, cela devrait être «clair».
la source
cls
ne fait rien sur mon OS X ou sur un de mes serveurs Ubuntu. Certaines clarifications pourraient être utiles.clear
pour linux, ou encore mieux remplacer la ligne d'impression au lieu d'effacer toute la sortie de la ligne de commande.os.system()
) qui lance un sous-processus pour effacer l'écran à l'aide d'une commande spécifique à la plate-forme (cls
). Comment cela at-il des votes positifs ?? "Réponse" absolument sans valeur à mon humble avis.urlretrieve et requests.get sont simples, mais pas la réalité. J'ai récupéré des données pour quelques sites, y compris du texte et des images, les deux ci-dessus résolvent probablement la plupart des tâches. mais pour une solution plus universelle, je suggère l'utilisation de l'urlopen. Comme il est inclus dans la bibliothèque standard de Python 3, votre code peut s'exécuter sur n'importe quelle machine exécutant Python 3 sans préinstaller le site-package
Cette réponse fournit une solution à HTTP 403 Interdit lors du téléchargement de fichiers via http à l'aide de Python. J'ai essayé uniquement les requêtes et les modules urllib, l'autre module peut fournir quelque chose de mieux, mais c'est celui que j'ai utilisé pour résoudre la plupart des problèmes.
la source
Réponse tardive, mais pour
python>=3.6
vous pouvez utiliser:Installer
dload
avec:la source
Je voulais télécharger tous les fichiers à partir d'une page Web. J'ai essayé
wget
mais cela échouait donc j'ai décidé pour la route Python et j'ai trouvé ce fil.Après l'avoir lu, j'ai fait une petite application en ligne de commande
soupget
, développant les excellentes réponses de PabloG et Stan et ajoutant quelques options utiles.Il utilise BeatifulSoup pour collecter toutes les URL de la page, puis télécharger celles avec les extensions souhaitées. Enfin, il peut télécharger plusieurs fichiers en parallèle.
C'est ici:
Un exemple de son utilisation est:
Et un exemple réel si vous voulez le voir en action:
la source