1. ホーム
  2. パイソン

[解決済み】リクエストを使って画像をダウンロードする方法

2022-03-24 22:32:33

質問

python の 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 ?

解決方法は?

のどちらかを使用します。 response.raw ファイルオブジェクト または、レスポンスに対して反復処理を行う。

を使用するには 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=True そのため requests は、最初に画像全体をメモリにダウンロードしないようにします。