以简单的方式通过请求获取图像
Fetching image via Requests in simple way
我发现 urllib
有 a handy way 从 url 获取图像:
urllib.urlretrieve( url, localName )
不过the requests
way好像有点棘手。甚至答案都建议 urllib
完成这项工作。
requests
真的不能像 urllib
那样做这件事是正确的吗?
或者,有没有类似urllib.urlretrieve()
的requests
接口?
我的项目目前只使用 requests
。
我不想只为一个功能导入另一个工具。
只需将响应 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()
保存图像就好了。
您始终可以发出 GET 请求,读取响应,然后将其保存到文件中。
f=open("filename.jpeg","w")
data=requests.get("http://example.com/img.jpeg");
f.write(data.content)
f.close()
请注意,urllib.urlretrieve() 对于现代不可靠的服务毫无用处。如果服务器以状态代码 500(内部服务器错误)进行应答,则您无法检测到它:该函数只是写下服务器的应答(空一个或“500 内部服务器错误”或其他)。
通过请求,您可以检查状态代码。
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.get
和 stream=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)
我发现 urllib
有 a handy way 从 url 获取图像:
urllib.urlretrieve( url, localName )
不过the requests
way好像有点棘手。甚至答案都建议 urllib
完成这项工作。
requests
真的不能像 urllib
那样做这件事是正确的吗?
或者,有没有类似urllib.urlretrieve()
的requests
接口?
我的项目目前只使用 requests
。
我不想只为一个功能导入另一个工具。
只需将响应 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()
保存图像就好了。
您始终可以发出 GET 请求,读取响应,然后将其保存到文件中。
f=open("filename.jpeg","w")
data=requests.get("http://example.com/img.jpeg");
f.write(data.content)
f.close()
请注意,urllib.urlretrieve() 对于现代不可靠的服务毫无用处。如果服务器以状态代码 500(内部服务器错误)进行应答,则您无法检测到它:该函数只是写下服务器的应答(空一个或“500 内部服务器错误”或其他)。
通过请求,您可以检查状态代码。
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.get
和 stream=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)