python-从URL下载返回的Zip文件

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

user1229108 asked 2019-11-19T00:20:43Z
7个解决方案
142 votes

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

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()
yoavram answered 2019-11-19T00:21:41Z
7 votes

使用zipfile。返回值是一个文件状对象,您可以zipfile,传递给zipfile,依此类推。

senderle answered 2019-11-19T00:21:04Z
7 votes

在此博客文章的帮助下,我仅使用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()
Jeremiah England answered 2019-11-19T00:22:06Z
5 votes

这是我在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()
Webucator answered 2019-11-19T00:22:30Z
3 votes

您可以使用urllib2.urlopen,也可以尝试使用出色的Requests模块并避免urllib2的麻烦:

import requests
results = requests.get('url')
#pass results.content onto secondary processing...
aravenel answered 2019-11-19T00:22:55Z
1 votes

感谢@yoavram提供上述解决方案,  我的网址路径已链接到压缩文件夹,并遇到BADZipfile错误  (文件不是zip文件),如果我尝试了几次,这很奇怪  检索网址并突然将其解压缩,所以我将解决方案稍作修改  一点。 按照此处使用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()
hindamosh answered 2019-11-19T00:23:20Z
1 votes

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

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

swateek answered 2019-11-19T00:23:52Z
translate from https://stackoverflow.com:/questions/9419162/download-returned-zip-file-from-url