Загрузить возвращенный Zip-файл с URL - PullRequest
47 голосов
/ 23 февраля 2012

Если у меня есть URL-адрес, который при отправке в веб-браузере открывает диалоговое окно для сохранения zip-файла, как бы мне перехватить и загрузить этот zip-файл в Python?

Ответы [ 6 ]

129 голосов
/ 10 января 2013

Насколько я могу судить, правильный способ сделать это:

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

конечно, вы хотите проверить, что GET был успешным с r.ok.

Для python 3+, замените модуль StringIO модулем io и используйте BytesIO вместо StringIO: Здесь - примечания к выпуску, в которых упоминается это изменение.

import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
6 голосов
/ 23 февраля 2012

Использование urllib2.urlopen. Возвращаемое значение представляет собой файлоподобный объект, который можно read() передать, zipfile и т. Д.

4 голосов
/ 11 июля 2018

С помощью этого поста в блоге , у меня это работает только с requests.Суть странного stream в том, что нам не нужно вызывать content при больших запросах, что потребовало бы, чтобы все это обрабатывалось сразу, засоряя память.stream позволяет избежать этого, перебирая данные по одному фрагменту за раз.

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 голосов
/ 29 июля 2015

Вот что я получил для работы в 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()
3 голосов
/ 23 февраля 2012

Либо используйте urllib2.urlopen, либо вы можете попробовать использовать отличный модуль Requests и избежать головной боли urllib2:

import requests
results = requests.get('url')
#pass results.content onto secondary processing...
0 голосов
/ 14 февраля 2019

Спасибо @yoavram за вышеупомянутое решение, мой URL-адрес связан с zip-папкой , и я обнаружил ошибку BADZipfile (файл не является zip-файлом), и было странно, если я попыталсяраз он извлекает URL и разархивирует его внезапно, поэтому я немного исправляю решение.используя is_zipfile метод согласно здесь

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