为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用请求下载图像

如何使用请求下载图像

守着星空守着你 2019-06-14 17:20:28
如何使用请求下载图像我正在尝试用python的requests模块。下面是我使用的(工作)代码:img = urllib2.urlopen(settings.STATICMAP_URL.format(**data))with open(path, 'w') as f:     f.write(img.read())下面是使用requests:r = requests.get(settings.STATICMAP_URL.format(**data))if r.status_code == 200:     img = r.raw.read()     with open(path, 'w') as f:         f.write(img)您能帮助我了解响应中要使用的哪些属性吗?requests?
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

您可以使用response.raw文件对象,或者迭代响应。

使用response.raw默认情况下,类似文件的对象不会解码压缩的响应(用GZIP或放气).您可以通过设置decode_content属性为True (requests把它设置为False来控制解码本身)。然后你可以用shutil.copyfileobj()要让Python将数据流到文件对象:

import requestsimport shutil

r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)if r.status_code == 200:
    with open(path, 'wb') as f:
        r.raw.decode_content = True
        shutil.copyfileobj(r.raw, f)

要迭代响应,使用一个循环;这样的迭代确保数据在这个阶段被解压缩:

r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)if r.status_code == 200:
    with open(path, 'wb') as f:
        for chunk in r:
            f.write(chunk)

这将以128个字节块读取数据;如果感觉另一个块大小更好,请使用Response.iter_content()方法具有自定义块大小:

r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)if r.status_code == 200:
    with open(path, 'wb') as f:
        for chunk in r.iter_content(1024):
            f.write(chunk)

请注意,您需要以二进制模式打开目标文件,以确保python不尝试为您翻译换行符。我们还stream=True所以requests不会先把整个图像下载到内存中。


查看完整回答
反对 回复 2019-06-14
  • 3 回答
  • 0 关注
  • 676 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信