从 URL 下载返回的 Zip 文件

如果我有一个 URL,当我在浏览器中提交它时,它会弹出一个对话框来保存一个 zip 文件,那么我应该如何用 Python 捕获和下载这个 zip 文件呢?

192283 次浏览

大多数人建议使用 requests,如果它是可用的,和 requests 文件建议这样下载和保存原始数据从一个网址:

import requests


def download_url(url, save_path, chunk_size=128):
r = requests.get(url, stream=True)
with open(save_path, 'wb') as fd:
for chunk in r.iter_content(chunk_size=chunk_size):
fd.write(chunk)

由于答案询问下载 和储蓄的 zip 文件,所以我还没有详细介绍阅读 zip 文件的细节。请参阅下面众多答案中的一个。

如果由于某种原因您无法访问 requests,则可以使用 urllib.request。它可能不会像上面提到的那样强大。

import urllib.request


def download_url(url, save_path):
with urllib.request.urlopen(url) as dl_file:
with open(save_path, 'wb') as out_file:
out_file.write(dl_file.read())

最后,如果您仍在使用 Python2,则可以使用 urllib2.urlopen

from contextlib import closing


def download_url(url, save_path):
with closing(urllib2.urlopen(url)) as dl_file:
with open(save_path, 'wb') as out_file:
out_file.write(dl_file.read())

要么使用 urllib2.urlopen,要么尝试使用优秀的 Requests模块,避免 urllib2带来的麻烦:

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

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

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 模块与 模块分开,并使用 BytesIO 代替 StringIO: 给你是提到此更改的发行说明。

import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall("/path/to/destination_directory")

下面是我在 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()

这篇博文的帮助下,我让它只用 requests工作。 奇怪的 stream的关键是我们不需要调用 content 对于大型请求,需要同时处理所有请求, stream通过迭代数据来避免这种情况 一次一块。

url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'


response = requests.get(url, stream=True)
with open('alaska.zip', "wb") as f:
for chunk in response.iter_content(chunk_size=512):
if chunk:  # filter out keep-alive new chunks
f.write(chunk)

感谢@yoavram 提供上述解决方案, 我的 URL 路径链接到一个压缩的 文件夹,并遇到一个错误的 BADZipfile (file 不是 zip 文件) ,而且如果我尝试了几次,会觉得很奇怪 检索网址和解压缩它突然所以我修改了一点解决方案 按照 给你使用 是 _ 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()

我来这里寻找如何拯救一个。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)

我只是想保存文件。

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

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