在 python 中从 cURL GET 请求保存 .zip 文件
Posted
技术标签:
【中文标题】在 python 中从 cURL GET 请求保存 .zip 文件【英文标题】:Saving a .zip file from cURL GET request in python 【发布时间】:2019-10-10 03:46:43 【问题描述】:我正在尝试在 Python 脚本中实现 Amplitude 的导出 API。我一直在使用 requests 库,但我不知道如何指定文件名来保存来自调用的响应。此 API 要求保存为指定的 .zip 文件 (>> yourfilename.zip),因为这是返回响应的格式。这是来自 API 网站的示例 cURL 调用,我正在尝试将其转换为 Python:
curl -u API_Key:Secret_Key 'https://amplitude.com/api/2/export?start=start_date&end=end_date' >> yourfilename.zip
当我在终端中调用它时,它可以完美运行并将“yourfilename.zip”保存到我的本地。但是,以下 Python 代码不起作用:
import requests
params = (
('start', START_DATE),
('end', END_DATE),
)
auth = (
('API_Key', API_KEY),
('Secret_Key', SECRET_KEY),
)
response = requests.get('https://amplitude.com/api/2/export', params=params, auth=auth, stream=True)
requests.get() 调用无法执行并返回 403 响应,因为我不知道如何指定要保存的 .zip 文件,就像 API 网站上的示例 cURL 调用一样。非常感谢任何帮助,谢谢。
【问题讨论】:
403 forbidden
看来您一开始没有收到回复。如果你这样做了,你可以简单地将r.contents
写入文件.zip if r.status_code is 200: with open(f'file.zip', 'wb') as f: f.write(response.content)
【参考方案1】:
import requests
import json
import sys, io
from zipfile import ZipFile
import gzip
auth_data = 'key': 'somekey', 'secret': 'somesecretkey'
params = (('start', '20200106T00'), ('end', '20200106T23'),)
rd = requests.get('https://amplitude.com/api/2/export',
params=params,
auth=(auth_data['key'], auth_data['secret']),
stream=True)
if rd.status_code == 200:
zf = ZipFile(io.BytesIO(rd.content), 'r')
else:
sys.exit()
event_list = []
for gz_file in zf.filelist:
gz_bdata = zf.read(gz_file.filename)
js_rows = gzip.decompress(gz_bdata)
js_rows = js_rows.decode('utf8')
for s in js_rows.split('\n'):
if s:
event_list.append(json.loads(s))
【讨论】:
以上是关于在 python 中从 cURL GET 请求保存 .zip 文件的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中从 Paypal 获取访问令牌 - 使用 urllib2 或请求库
使用代理的 http GET - Curl 命令有效,但 python“请求”库不