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?

31
demandé sur Keyur Potdar 2012-02-23 22:42:35

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.

7
répondu senderle 2017-06-21 12:46:54

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()
90
répondu yoavram 2016-02-18 22:21:20

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()
4
répondu Webucator 2015-07-29 17:10:39

utilisez l'une ou l'autre urllib2.urlopen, ou vous pouvez essayer d'utiliser l'excellent Requests module et éviter les maux de tête urllib2:

import requests
results = requests.get('url')
#pass results.content onto secondary processing...
3
répondu aravenel 2012-02-23 18:59:47

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()
0
répondu Jeremiah England 2018-07-12 02:27:27