通过请求以简单的方式获取图像

时间:2015-09-13 18:21:17

标签: python python-requests

我发现urlliba handy way来从网址获取图片:

urllib.urlretrieve( url, localName )

然而the requests way似乎有点棘手。甚至答案都建议urllib完成这项工作。

requests真的不能像urllib那样做,这是否正确? 或者,是否有requests类似于urllib.urlretrieve()的界面?

我的项目目前仅使用requests。 我不想只为一个功能导入另一个工具。

4 个答案:

答案 0 :(得分:1)

请注意,urllib.urlretrieve()对于现代不可靠的服务毫无用处。如果服务器以状态代码500(内部服务器错误)应答,则您无法检测到它:该功能只是写下服务器的答案(空的一个或" 500内部服务器错误"或者无论)。

根据请求,您可以检查状态代码。

答案 1 :(得分:0)

只需保存对二进制文件的响应content,例如:

In [1]: import requests
In [2]: r = requests.get('https://lh3.googleusercontent.com/-NwXieow8Dac/VfWsN9Gnc4I/AAAAAAAATB8/dbaO0RKfIhE/w426-h538/PP_%2B1944wm.jpg')
In [3]: with open('fred.jpg', 'wb') as outfile:
   ...:     outfile.write(r.content)
In [4]: exit()

保存图像就好了。

答案 2 :(得分:0)

您始终可以发出 GET 请求,阅读回复,然后将其保存到文件中。

f=open("filename.jpeg","w")
data=requests.get("http://example.com/img.jpeg");
f.write(data.content)
f.close()

答案 3 :(得分:0)

您指的是

The requests way,也适用于大型文件的解决方案。正如已经指出的那样,小文件,您可以随时通过requst.get下载:

import requests
with open("destination.jpg", "wb") as dst_file:
    dst_file.write(request.get("http://example.com/img.jpeg").content)

如果您想要使用requests适合大文件的解决方案,那就完全没有问题了。

实际上当你看一下urllib.retrieve code时,你会发现它正在做的事情基本上和requests.getstream=True所做的操作基本相同,除了(正如@ y0prst回答中所指出的那样)它不会检查响应状态代码,因此它会将本地文件写入错误响应的内容(HTTP 500代码)。

您可以定义如下功能:

def requests_retrieve(url, filename, chunk_size=1024):
    with open(filename, "wb") as dst_file:
        resp = request.get(url, stream=True)
        resp.raise_for_status()
        for chunk in resp.iter_content(chunk_size)
            dst_file.write(chunk)

并将其称为urllib.urlretrieve

request_retrieve(url, localName)