Comment faire pour télécharger un fichier à l'aide de python dans un "intelligentes" de la sorte?
J'ai besoin de télécharger plusieurs fichiers via http en Python.
La façon la plus évidente à faire, c'est seulement à l'aide de urllib2:
import urllib2
u = urllib2.urlopen('http://server.com/file.html')
localFile = open('file.html', 'w')
localFile.write(u.read())
localFile.close()
Mais je vais avoir à traiter avec les Url qui sont méchants, d'une certaine façon, dire comme ceci: http://server.com/!Run.aspx/someoddtext/somemore?id=121&m=pdf
. Lors du téléchargement via le navigateur, le fichier a un nom lisible par l'utilisateur, c'est à dire. accounts.pdf
.
Est-il un moyen de gérer cela en python, donc je n'ai pas besoin de connaître les noms de fichier et de coder en dur dans mon script?
- Est le nom de fichier sur le serveur est-il pertinent? Sans doute ces fichiers ont un sens pour vous, alors vous devriez être en mesure de nommer vous-même. Si les noms n'ont pas de sens, venir avec un nombre aléatoire unique de vous identifier (uuid peut-être?)
- J'aimerais avoir des noms de fichiers lisibles et utiles. Le problème c'est que le script va prendre des Url pour le téléchargement à partir d'un fichier texte, et les Url seront ajoutés et supprimés par un non-technicien.
Vous devez vous connecter pour publier un commentaire.
Télécharger des scripts comme qui tendent à pousser un en-tête indiquant à l'utilisateur-agent de ce nom du fichier:
Si vous pouvez attraper un en-tête, vous pouvez obtenir le bon nom de fichier.
Il y a un autre thread qui a un peu de code à offrir pour
Content-Disposition
-grabbing.Sur la base des observations et @Oli réponse, j'ai fait une solution à ceci:
Il prend le nom de fichier de Contenu-Disposition; s'il n'est pas présent, utilise le nom de fichier à partir de l'URL (si la redirection est arrivé, la finale de l'URL est pris en compte).
urlsplit(url)[2]
avec un appel àurllib.unquote
, sinon les noms de fichiers serait pour cent codé. Voici comment je fais:return basename(urllib.unquote(urlsplit(url)[2]))
Combinant une grande partie de la ci-dessus, voici une plus pythonic solution:
2 Kender:
il n'est pas sûr -- serveur web peut passer de mal formaté nom ["fichier.ext] ou [fichier.ext'] ou même être vide et localName[0] va lever une exception.
Code Correct peut ressemble à ceci:
local_name.strip('\'"')
-- qui ne bande de début et de fin et est également plus succincte.À l'aide de
wget
:À l'aide de urlretrieve:
urlretrieve crée également la structure de répertoire si n'existe pas.