Télécharger le fichier Zip retourné à partir de L'URL
si j'ai une URL qui, lorsqu'elle est soumise dans un navigateur web, apparaît dans une boîte de dialogue pour enregistrer un fichier zip, Comment pourrais-je attraper et télécharger ce fichier zip en Python?
5 réponses
Utiliser urllib2.urlopen
. La valeur de retour est un fichier comme un objet que vous pouvez read()
passez à zipfile
et ainsi de suite.
autant que je puisse dire, la bonne façon de le faire est:
import requests, zipfile, StringIO
r = requests.get(zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()
bien sûr, vous voulez vérifier que le GET a été un succès avec r.ok
.
pour python 3+, sous le module StringIO avec le io module et utiliser BytesIO à la place de StringIO:Ici sont des notes de mise à jour qui mentionnent ce changement.
import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
voici ce que j'ai à faire en Python 3:
import zipfile, urllib.request, shutil
url = 'http://www....myzipfile.zip'
file_name = 'myzip.zip'
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
with zipfile.ZipFile(file_name) as zf:
zf.extractall()
Avec l'aide de ce post, je l'ai en travaillant avec des requests
. Le point de l'étrange stream
chose est si nous n'avons pas besoin d'appeler content
sur les grosses requêtes, ce qui exigerait qu'elles soient toutes traitées en même temps, bloquant la mémoire. stream
évite cela en itérant à travers les données un morceau à la fois.
url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'
target_path = 'alaska.zip'
response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
if chunk: # filter out keep-alive new chunks
handle.write(chunk)
handle.close()