Подтвердить что ты не робот

Загрузить возвращенный Zip файл с URL

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Вот что я получил, чтобы работать в 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

С помощью этого поста в блоге я работаю только с 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()

Ответ 5

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

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

Ответ 6

Спасибо @yoavram за вышеупомянутое решение, мой URL-адрес связан с заархивированной папкой, и я обнаружил ошибку 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()

Ответ 7

Я пришел сюда в поисках, как сохранить файл .bzip2. Позвольте мне вставить код для тех, кто может искать это.

url = "http://api.mywebsite.com"
filename = "swateek.tar.gz"

response = requests.get(url, headers=headers, auth=('myusername', 'mypassword'), timeout=50)
if response.status_code == 200:
with open(filename, 'wb') as f:
   f.write(response.content)

Я просто хотел сохранить файл как есть.