リクエストを使用して画像をダウンロードする方法 質問する

リクエストを使用して画像をダウンロードする方法 質問する

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_contentTruerequestsFalseshutil.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

おすすめ記事