68 votes

Comment télécharger un fichier à l'aide de Python de manière plus intelligente ?

Je dois télécharger plusieurs fichiers via http en Python.

La façon la plus évidente de le faire est d'utiliser urllib2 :

import urllib2
u = urllib2.urlopen('http://server.com/file.html')
localFile = open('file.html', 'w')
localFile.write(u.read())
localFile.close()

Mais je devrai m'occuper des URLs qui sont malveillants d'une certaine manière, comme ceci : http://server.com/!Run.aspx/someoddtext/somemore?id=121&m=pdf . Lorsqu'il est téléchargé via le navigateur, le fichier porte un nom lisible par l'homme, à savoir . accounts.pdf .

Existe-t-il un moyen de gérer cela en python, afin que je n'aie pas besoin de connaître les noms de fichiers et de les coder en dur dans mon script ?

0voto

Chirag Points 1

Vous devez examiner 'Content-Disposition' header, voir la solution de kender.

Comment télécharger un fichier à l'aide de Python de manière plus intelligente ?

Affichage de sa solution modifiée avec la possibilité de spécifier un dossier de sortie :

from os.path import basename
import os
from urllib.parse import urlsplit
import urllib.request

def url2name(url):
    return basename(urlsplit(url)[2])

def download(url, out_path):
    localName = url2name(url)
    req = urllib.request.Request(url)
    r = urllib.request.urlopen(req)
    if r.info().has_key('Content-Disposition'):
        # If the response has Content-Disposition, we take file name from it
        localName = r.info()['Content-Disposition'].split('filename=')[1]
        if localName[0] == '"' or localName[0] == "'":
            localName = localName[1:-1]
    elif r.url != url: 
        # if we were redirected, the real file name we take from the final URL
        localName = url2name(r.url)

    localName = os.path.join(out_path, localName)
    f = open(localName, 'wb')
    f.write(r.read())
    f.close()

download("https://example.com/demofile", '/home/username/tmp')

Je viens de mettre à jour la réponse de kender pour python3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X