web-dev-qa-db-fra.com

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, fait apparaître une boîte de dialogue pour enregistrer un fichier Zip, comment puis-je récupérer et télécharger ce fichier Zip en Python?

42
user1229108

Utilisez urllib2.urlopen . La valeur de retour est un objet de type fichier que vous pouvez read(), transmettre à zipfile et ainsi de suite.

6
senderle

Pour autant que je sache, la bonne façon de procéder est la suivante:

import requests, zipfile, StringIO
r = requests.get(Zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()

vous voudrez bien sûr vérifier que GET a réussi avec r.ok.

Pour Python 3+, insérez le module StringIO dans le module io et utilisez BytesIO au lieu de StringIO: Ici sont des notes de publication mentionnant ce changement. 

import requests, zipfile, io
r = requests.get(Zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
117
yoavram

Avec l’aide de cet article de blog , je l’utilise avec juste requests. Le point étrange de la chose stream étrange est qu’il n’est pas nécessaire d’appeler content pour les demandes volumineuses, ce qui nécessiterait que tout soit traité en même temps, ce qui encombrerait la mémoire. La stream évite cela en parcourant les données un bloc à 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()
4
Jeremiah England

Voici ce que je dois travailler dans 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()
4
Webucator

Utilisez urllib2.urlopen ou essayez d’utiliser l’excellent module Requests et évitez les maux de tête urllib2:

import requests
results = requests.get('url')
#pass results.content onto secondary processing...
3
aravenel

Merci à @yoavram pour la solution ci-dessus, mon chemin d’URL lié à un folder compressé, et rencontre une erreur de BADZipfile (le fichier n’est pas un fichier Zip), et c’était étrange de l’essayer plusieurs fois récupérer l'URL et le décompresser tout d'un coup donc je modifie un peu la solution bit. en utilisant la méthode is_zipfile selon ici

r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
while not check:
    r = requests.get(url, stream =True)
    check = zipfile.is_zipfile(io.BytesIO(r.content))
else:
    z = zipfile.ZipFile(io.BytesIO(r.content))
    z.extractall()
0
hindamosh