我试图使用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)
你能帮我从请求中使用响应的什么属性吗?
这可能比使用请求更容易。这是我唯一一次建议不要使用请求来做HTTP的事情。
使用urllib的两个内衬:
>>> import urllib
>>> urllib.request.urlretrieve("http://www.example.com/songs/mp3.mp3", "mp3.mp3")
还有一个叫做wget的Python模块,它非常容易使用。在这里找到。
这说明了设计的简单性:
>>> import wget
>>> url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3'
>>> filename = wget.download(url)
100% [................................................] 3841532 / 3841532>
>> filename
'razorback.mp3'
享受。
编辑:您还可以添加一个out参数来指定路径。
>>> out_filepath = <output_filepath>
>>> filename = wget.download(url, out=out_filepath)
我同样需要使用请求下载图像。我首先尝试了Martijn Pieters的答案,效果很好。但是当我对这个简单的函数做了一个概要时,我发现与urllib和urllib2相比,它使用了太多的函数调用。
然后我尝试了请求模块作者推荐的方法:
import requests
from PIL import Image
# python2.x, use this instead
# from StringIO import StringIO
# for python3.x,
from io import StringIO
r = requests.get('https://example.com/image.jpg')
i = Image.open(StringIO(r.content))
这大大减少了函数调用的数量,从而加快了我的应用程序的速度。
下面是我的分析器的代码和结果。
#!/usr/bin/python
import requests
from StringIO import StringIO
from PIL import Image
import profile
def testRequest():
image_name = 'test1.jpg'
url = 'http://example.com/image.jpg'
r = requests.get(url, stream=True)
with open(image_name, 'wb') as f:
for chunk in r.iter_content():
f.write(chunk)
def testRequest2():
image_name = 'test2.jpg'
url = 'http://example.com/image.jpg'
r = requests.get(url)
i = Image.open(StringIO(r.content))
i.save(image_name)
if __name__ == '__main__':
profile.run('testUrllib()')
profile.run('testUrllib2()')
profile.run('testRequest()')
testRequest的结果:
343080 function calls (343068 primitive calls) in 2.580 seconds
和testRequest2的结果:
3129 function calls (3105 primitive calls) in 0.024 seconds