如何使用请求下载图像

新手上路,请多包涵

我正在尝试使用 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 的响应中使用什么属性吗?

原文由 shkschneider 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 660
2 个回答

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

要使用 response.raw 类文件对象,默认情况下不会解码压缩响应(使用 GZIP 或 deflate)。 You can force it to decompress for you anyway by setting the decode_content attribute to True ( requests sets it to False to control decoding itself )。然后,您可以使用 shutil.copyfileobj() 让 Python 将数据流式传输到文件对象:

 import requests
import 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 不会先将整个图像下载到内存中。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

从请求中获取类文件对象并将其复制到文件中。这也将避免一次将整个内容读入内存。

 import shutil

import requests

url = 'http://example.com/img.png'
response = requests.get(url, stream=True)
with open('img.png', 'wb') as out_file:
    shutil.copyfileobj(response.raw, out_file)
del response

原文由 Oleh Prypin 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题