Descargar el archivo zip devuelto desde la URL

Si tengo una URL que, cuando se envía en un navegador web, aparece un cuadro de diálogo para guardar un archivo zip, ¿cómo podría capturar y descargar este archivo zip en Python?

Utilice urllib2.urlopen . El valor de retorno es un objeto similar a un archivo que puede read() , pasar al zipfile y así sucesivamente.

Por lo que puedo decir, la forma correcta de hacer esto es:

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

por supuesto, querría comprobar que el GET fue exitoso con r.ok

Para Python 3+, sustituya el módulo StringIO con el módulo io y use BytesIO en lugar de StringIO: Aquí hay notas de la versión que mencionan este cambio.

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

Esto es lo que tengo que trabajar 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() 

Con la ayuda de esta publicación de blog , lo tengo trabajando solo con requests . El punto de lo extraño del stream es que no necesitamos llamar content en solicitudes grandes, lo que requeriría que todo se procesara a la vez, obstruyendo la memoria. El stream evita esto al iterar a través de los datos una porción a la vez.

 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() 

Use urllib2.urlopen, o puede intentar usar el excelente módulo de Requests y evitar los dolores de cabeza de urllib2:

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

Gracias a @yoavram por la solución anterior, mi ruta url vinculada a una carpeta comprimida, y encuentro un error de BADZipfile (el archivo no es un archivo zip), y fue extraño que si lo intentara varias veces, recuperara la URL y la descomprimiera. De repente así que modifico un poco la solución. utilizando el método is_zipfile como aquí

 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()