Python のモジュールを使用して、Web から画像をダウンロードして保存しようとしていますrequests
。
私が使用した(動作する)コードは次のとおりです。
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
?
ベストアンサー1
または、response.raw
ファイルオブジェクト、または応答を反復処理します。
ファイルのようなオブジェクトを使用すると、デフォルトでは圧縮されたレスポンス(GZIPまたはdeflate)はデコードされません。属性を にresponse.raw
設定することで、強制的に解凍することができます(デコード自体を制御するには に設定します)。その後、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=True
ように設定します。requests