当前位置: 首页 > 知识库问答 >
问题:

如何使用请求下载图像

景震博
2023-03-14

我试图下载和保存图像从网络使用python的请求模块。

以下是我使用的(工作)代码:

img = urllib2.urlopen(settings.STATICMAP_URL.format(**data))
with open(path, 'w') as f:
    f.write(img.read())

以下是使用请求的新(非工作)代码:

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)

您能否帮助我了解从请求中使用响应中的哪些属性?


共有3个答案

冉昊
2023-03-14

这个怎么样,一个快速的解决方案。

import requests

url = "http://craphound.com/images/1006884_2adf8fc7.jpg"
response = requests.get(url)
if response.status_code == 200:
    with open("/Users/apple/Desktop/sample.jpg", 'wb') as f:
        f.write(response.content)
任长卿
2023-03-14

从请求中获取类似文件的对象,并将其复制到文件中。这样也可以避免一次将整件事情读入内存。

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
章高爽
2023-03-14

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

使用响应。默认情况下,raw类文件对象不会解码压缩响应(使用GZIP或deflate)。通过将decode\u 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字节块读取数据;如果您觉得另一个块大小效果更好,请使用响应。具有自定义块大小的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,这样请求不会首先将整个图像下载到内存中。

 类似资料:
  • 问题内容: 我正在尝试使用的模块从网络下载并保存图像。 这是我使用的(工作)代码: 你能帮助我从响应中使用什么属性吗? 问题答案: 你可以使用对象,也可以遍历响应。 默认情况下,使用类似文件的对象不会解码压缩的响应(使用GZIP或deflate)。你可以通过将属性设置为True(requests将其设置False为控制自身解码)来强制为你解压缩。然后,你可以使用将数据流式传输到文件对象: 要遍历响

  • 问题内容: 我正在尝试使用不带外部库的图像进行下载。这是我所拥有的,我不确定什么不起作用。 为了查看流中正在发生什么,请将该行交换为: 大概该方法在套接字输入流中不希望使用HTTP标头。但是我不确定如何删除标题。我试着用读取标题行,然后将套接字输入流传递给,但这没有用。 这是打印的字符串: 末尾的不可打印字符似乎表明标题之后是某种图像。但是如何将其转换为a 或a ?后者有一个接受输入流的构造函数,

  • 问题内容: 这是我的代码: 这使我可以访问csv文件。我尝试了其他方法来处理下载: 这将给csv文件一个字符串: 这将打印第一行并返回错误:_csv.Error:在未引用的字段中看到换行符 这将在每行中打印一个字母,并且不会打印出整个内容: 我的问题是:在这种情况下读取CSV文件的最有效方法是什么。以及如何下载。 谢谢 问题答案: 这应该有助于: 输出样本: 答案相关的问题: 使用此功能将csv加

  • 问题内容: 我有一个很长的页面,可在用户滚动浏览时动态加载图像。 但是,如果用户快速滚动离开页面的某个部分,我不希望图像继续加载到页面的该部分视图之外。 除了图像加载外,页面上还同时发生了许多其他请求,因此在scroll事件上触发钝化window.stop()是不可接受的。 我尝试删除并清除不再可见的图像的img src属性,但是,由于请求已经启动,因此图像会继续加载。 请记住,当用户短暂滚动经过

  • 我试图下载一个二进制文件,并将其原始名称保存在磁盘上(linux)。 有什么想法吗?

  • 问题内容: 我想在单击按钮时发送“ ajax下载请求”,所以我尝试了这种方式: javascript: download.php: 但是没有按预期工作,我该怎么办?先感谢您 问题答案: 2015年4月27日更新 进入HTML5场景的是download属性。它支持在Firefox和Chrome,并很快来到IE11。根据您的需求,只要您要下载的文件与您的网站位于同一来源,就可以使用它代替AJAX请求(