从URL下载返回的Zip文件

时间:2012-02-23 18:42:36

标签: python url download zip urllib

如果我有一个URL,当在网络浏览器中提交时会弹出一个保存zip文件的对话框,我该如何在Python中捕获和下载这个zip文件?

9 个答案:

答案 0 :(得分:125)

据我所知,正确的做法是:

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

当然,您希望使用r.ok检查GET是否成功。

对于python 3+,将StringIO模块与io模块一起使用并使用BytesIO而不是StringIO:Here是提及此更改的发行说明。

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

答案 1 :(得分:6)

使用urllib2.urlopen。返回值是一个类似文件的对象,您可以read()传递给zipfile,等等。

答案 2 :(得分:4)

这是我在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 :(得分:4)

this blog post的帮助下,我仅使用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 :(得分:3)

使用urllib2.urlopen,或者您可以尝试使用优秀的Requests模块并避免urllib2头痛:

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

答案 5 :(得分:0)

感谢@yoavram提供上述解决方案,  我的网址路径链接到一个压缩的文件夹,并遇到BADZipfile错误  (文件不是zip文件),如果我尝试了几次,这很奇怪  检索网址并突然将其解压缩,所以我将解决方案稍作修改  一点。根据{{​​3}}

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

答案 6 :(得分:0)

我是来这里搜索如何保存.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)

我只是想按原样保存文件。

答案 7 :(得分:0)

使用 requests, zipfile and io python 包。

特别是 BytesIO 函数用于将解压后的文件保存在内存中,而不是将其保存到驱动器中。

import requests
from zipfile import ZipFile
from io import BytesIO

r = requests.get(zip_file_url)
z = ZipFile(BytesIO(r.content))    
file = z.extract(a_file_to_extract, path_to_save)
with open(file) as f:
    print(f.read())

答案 8 :(得分:0)

将 .zip 文件保存到磁盘位置的超轻量级解决方案(使用 Python 3.9):

import requests

url = r'https://linktofile'
output = r'C:\pathtofolder\downloaded_file.zip'

r = requests.get(url)
with open(output, 'wb') as f:
    f.write(r.content)