如何使用请求下载图像

问题:

我试图使用python的requests模块从Web下载并保存图像。
这是我使用的(工作)代码:

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使用的响应中的什么属性

回答:

您可以使用response.raw file object或迭代响应。
要使用response.raw类似文件的对象,默认情况下不会解码压缩的响应(使用GZIP或放气)。您可以通过将decode_content属性设置为Truerequests将其设置为False来控制解码本身),强制您解压缩。然后,您可以使用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() method

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

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How to download image using requests

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

1 + 7 =