在 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 中从 curl 中提取单个值

在 Python 中从 Paypal 获取访问令牌 - 使用 urllib2 或请求库

使用代理的 http GET - Curl 命令有效,但 python“请求”库不

php curl get 下载远程zip文件保存在本地例子

Bash CURL GET 请求输出到单个 JSON 文件,包括服务器响应和 CURL 信息

Linux下使用curl get请求 参数带[]的情况