この記事では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のオブジェクトを操作すれば、リサイズ(縮小・拡大)やトリミング(切り取り)が自由にできます。
画像ファイル種類の判別ができるので、取得するファイル形式が分からない場合にも向いています。
Pythonの学習法について
Python の勉強が辛くなっていませんか?
Pythonは比較的取り組みやすい言語と言われていますが、プログラミング初心者にとっては分からないことだらけ。
ゼロから独学で勉強するのは厳しい道のりです。
今回、様々な現場、システム、言語を経験してきた現役エンジニアの立場から、初心者でも挫折しない学習方法を解説する記事を書きました。もちろん、お金をかけずに習得できる方法も解説しています。
できるだけストレスがかからない勉強法を解説しているので、ぜひ参考にしてみてくださいね。
まとめ
Python3のrequestsモジュールを使って画像ファイルをダウンロード・保存する方法を解説しました。
画像のチェックや加工・編集をしたい場合は、取得したバイトストリームをそのままPillowなどの画像編集向けのモジュールで読み込めばOKです。
実際の運用では、HTTPエラー時や破損データ取得時の対応、JPEGの圧縮なども組み込んであげることになるかもしれません。そうした部分はまた別の記事で。