当前位置: 首页 > 面试题库 >

Python-如何使用请求下载图像

孔安福
2023-03-14
问题内容

我正在尝试使用pythonrequests模块从网络下载并保存图像。

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

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.rawfile对象,也可以遍历响应。

response.raw默认情况下,使用类似文件的对象不会解码压缩的响应(使用GZIP或deflate)。你可以通过将decode_content属性设置为True(requests将其设置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()方法:

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



 类似资料:
  • 我试图下载和保存图像从网络使用python的模块。 以下是我使用的(工作)代码: 以下是使用

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

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

  • 我正在执行使用Python请求库上传文件的简单任务。我搜索了Stack Overflow,似乎没有人遇到同样的问题,即服务器无法接收文件: 我正在用我的文件名填充upload_file关键字的值,因为如果我把它留空,它会说 现在我得到了 只有当文件为空时才会显示。所以我一直在思考如何成功地发送文件。我知道这个文件是有效的,因为如果我去这个网站手动填写表单,它会返回一个匹配对象的列表,这就是我想要的

  • 问题内容: 请求是一个非常不错的库。我想用它来下载大文件。问题是不可能将整个文件保留在内存中,我需要分块读取它。这是以下代码的问题 由于某种原因,它无法按这种方式工作。仍将响应加载到内存中,然后再将其保存到文件中。 更新 如果你需要一个小型客户端,可以从FTP下载大文件,则可以在此处找到它。它支持多线程和重新连接(它确实监视连接),还可以为下载任务调整套接字参数。 问题答案: 使用以下流代码,无论

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