Python Tech

[Python] requestsで画像をちゃんと保存する方法

2021年5月12日

この記事ではPythonのrequestsモジュールを使って、Webから画像をダウンロードして保存する方法を解説しています。

短く・シンプルに書ける一方で、状況に応じて適切に保存できるように配慮できるなど、柔軟性の高いコードを書けます。

実行環境

Python 3.9
requests 2.25.1

 

requestsで画像をシンプルに保存する

以下の例ではpythonロゴを画像ファイルとして保存してみます。

requests モジュールを使って画像を取得します。

requestsはimportが必要です。モジュールのインストールは(pipなら)以下のようにします。

$ pip install requests

 

画像ファイルとして書き込むファイルを組み込み関数のopenで開いてあげます。
書き込み・バイナリモード(wb)で開くようにしましょう。オプションの意味はドキュメントに書いてあります。

そしてwriteメソッドでダウンロードしたストリームコンテンツを書き込みます。

import requests

url = 'https://www.python.org/static/community_logos/python-logo-master-v3-TM.png'

# 超シンプルな画像保存
r = requests.get(url)
if r.status_code == 200:
    with open('py_logo.png', 'wb') as f:
        f.write(r.content)

 

シンプルに記述できるので、取得するファイルの性質があらかじめよく分かっているときはこれで十分。

 

requestsで画像種類を判別して保存する

画像処理ライブラリであるPIL(Pillow)を使って、画像種類(拡張子)の判定を組み込みます。

Pillowがインストールされていない場合は、
pipなら以下のようにインストールします。

$ pip install Pillow

画像ファイルの拡張子はi.formatで取得できるので、そのままファイル名にくっつけてあげるだけでOK。

 

from PIL import Image
from io import BytesIO

url = 'https://www.python.org/static/community_logos/python-logo-master-v3-TM.png'

# 画像ファイル種類を判別して保存
r = requests.get(url)
if r.status_code == 200:
    with BytesIO(r.content) as buf:
        i = Image.open(buf)             # PIL.Imageで読込む
        i.save(f"py_logo_2.{i.format.lower()}") # 保存ファイル名に拡張子を設定

 

Pillowのオブジェクトを操作すれば、リサイズ(縮小・拡大)やトリミング(切り取り)が自由にできます。

画像ファイル種類の判別ができるので、取得するファイル形式が分からない場合にも向いています

Pillow.Imageモジュールのマニュアル

 

まとめ

Python3のrequestsモジュールを使って画像ファイルをダウンロード・保存する方法を解説しました。

画像のチェックや加工・編集をしたい場合は、取得したバイトストリームをそのままPillowなどの画像編集向けのモジュールで読み込めばOKです。

実際の運用では、HTTPエラー時や破損データ取得時の対応、JPEGの圧縮なども組み込んであげることになるかもしれません。そうした部分はまた別の記事で。

  • この記事を書いた人

次世代ペンギン

長いのでペンギンとお呼びください。システム開発・プログラミングのお仕事をしています。甘味とコーヒーは生命線。日常での学びを記事にしています。

人気の記事

1

キャリアアップのため、または高収入を目指して、しっかりプログラミングを学びたいという人が増えてきましたね。 この記事では現役のエンジニアである私が、実際に仕事で稼げるようになるためのスクール選びで失敗 ...

2

先日の記事では、初心者からフリーランスプログラマーになる難しさと、それでもなんとか稼げるようになるにはどうしたらいいか解説しました。 今回の記事では、稼げるフリーランサーになるために必要な要素を、もう ...

3

気休めだけの甘い言葉は書きません。 最近は多くの企業やサイトで、使い捨てられるプログラマーが欲しいがために、甘い言葉で初心者プログラマを誘い出しています。 この記事では、まずは「現実」をちゃんと理解し ...

4

Vuetifyの v-progress-circular コンポーネントは、数値データや処理状況を環状(円状)のデザインで教えてくれるUIデザインです。 ローディングのスピナー(処理中のマーク)として ...

5

※画像はずとまよの新曲とは一切関係ありません   ずっと真夜中でいいのに。(以下、ずとまよ)の新曲『勘ぐれい』のMVが12月1日に公開されましたね。 MV前に公開されていた原曲を聴き、神曲な ...

6

Vuexのstore(ストア)を使うと、各コンポーネント間で個別にデータのやり取りすることなく、データを一元的に管理できます。Vueでは欠かせない機能といえるでしょう。 state(変数、コンポーネン ...

-Python, Tech

© 2021 ペンギンのーと