Si vous souhaitez obtenir le contenu d'une page web dans une variable, il vous suffit d'en faire la demande. read
la réponse de urllib.request.urlopen
:
import urllib.request
...
url = 'http://example.com/'
response = urllib.request.urlopen(url)
data = response.read() # a `bytes` object
text = data.decode('utf-8') # a `str`; this step can't be used if data is binary
Le moyen le plus simple de télécharger et d'enregistrer un fichier est d'utiliser la fonction urllib.request.urlretrieve
fonction :
import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
urllib.request.urlretrieve(url, file_name)
import urllib.request
...
# Download the file from `url`, save it in a temporary directory and get the
# path to it (e.g. '/tmp/tmpb48zma.txt') in the `file_name` variable:
file_name, headers = urllib.request.urlretrieve(url)
Mais gardez à l'esprit que urlretrieve
est considéré héritage et pourrait devenir obsolète (on ne sait pas trop pourquoi, cependant).
Donc le plus correct La façon de procéder serait d'utiliser l'option urllib.request.urlopen
pour renvoyer un objet de type fichier qui représente une réponse HTTP et le copier dans un fichier réel à l'aide de la fonction shutil.copyfileobj
.
import urllib.request
import shutil
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
Si cela vous semble trop compliqué, vous pouvez opter pour une solution plus simple et stocker l'ensemble du téléchargement dans un fichier de type bytes
puis l'écrire dans un fichier. Mais cela ne fonctionne bien que pour les petits fichiers.
import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
data = response.read() # a `bytes` object
out_file.write(data)
Il est possible d'extraire .gz
(et peut-être d'autres formats) des données compressées à la volée, mais une telle opération nécessite probablement que le serveur HTTP prenne en charge l'accès aléatoire au fichier.
import urllib.request
import gzip
...
# Read the first 64 bytes of the file inside the .gz archive located at `url`
url = 'http://example.com/something.gz'
with urllib.request.urlopen(url) as response:
with gzip.GzipFile(fileobj=response) as uncompressed:
file_header = uncompressed.read(64) # a `bytes` object
# Or do anything shown above using `uncompressed` instead of `response`.
4 votes
Alvas, une prime pour ça ? La personne qui a répondu est toujours (et plutôt) active sur SO. Pourquoi ne pas simplement ajouter un commentaire et demander ?
9 votes
Car une bonne réponse qui résiste à l'épreuve du temps mérite d'être récompensée. De plus, nous devrions commencer à faire cela pour beaucoup d'autres questions afin de vérifier si les réponses sont pertinentes aujourd'hui. Surtout que le tri des réponses des OS est assez fou, parfois la réponse dépassée ou même la plus mauvaise arrive en tête.