環境
- Windows 10
- Python 3.10.1
結論
Pythonの画像処理ライブラリPillow(PIL)を使用することで簡単に実現できる
pip install pillow
実装
- 具体的なPILの実装はdownload_image_service.pyに記述してあるのでそちらを参照ください
呼び出し側
- Ximageオブジェクトを用意し、DownloadImageServiceに渡す
tests\test_download_image_service.py
from shared.Application.download_image_service import DownloadImageService
from shared.Domain.ximage import XImage
from shared.Domain.xurl import XUrl
import os
def test_画像をダウンロードできること():
image_url = "https://www.olympus-imaging.jp/product/dslr/e30/sample/images/index_image_02_l.jpg"
x_url = XUrl(href=image_url)
x_image = XImage(x_url=x_url, alt="猫の画像")
download_path_to = "C:\\Users\\nishigaki\\Desktop\\"
downloaded_image_filepath = DownloadImageService().execute(
x_image=x_image, download_path_to=download_path_to
)
assert os.path.isfile(downloaded_image_filepath) == True
def test_無効なURLを渡すとFalseが返ること():
image_url = "https://www.olympus-imaging.jp/hoge.jpg"
x_url = XUrl(href=image_url)
x_image = XImage(x_url=x_url, alt="猫の画像")
download_path_to = "C:\\Users\\nishigaki\\Desktop\\"
downloaded_image_filepath = DownloadImageService().execute(
x_image=x_image, download_path_to=download_path_to
)
assert downloaded_image_filepath == False
画像のurlやらを詰める自作のimageオブジェクト
shared\Domain\ximage.py
import os
import urllib
from shared.Domain.xregex import XRegex
from shared.Application.check_regex_service import CheckRegexService
from shared.Domain.xstr import XStr
from shared.Domain.xurl import XUrl
class XImage:
def __init__(self, x_url: XUrl, alt):
self.x_url = x_url
self.alt = alt
def get_url(self):
return self.x_url
def get_src(self):
return self.x_url.get_href()
# ファイル名を返します(フォルダ、クエリストリング除く純粋なファイル名をurlデコードしたもの)
def get_file_name(self):
file_name = CheckRegexService().execute(
XRegex(".+?(?=\?)"), xstr=XStr(self.x_url.get_href())
)
return urllib.parse.unquote(os.path.basename(file_name))
def get_file_name_with_queryst(self):
return os.path.basename(self.x_url.get_href())
def get_alt(self):
return self.alt
具体的なPILの実装
- 呼び出し元から、XImageオブジェクトと保存先のパスを受け取り、ダウンロードする
- 画像をダウンロードする際は、いったんurlをバイナリファイルに変換する必要がある
- PILのopenメソッドは、バイナリファイルを引数に受け取り、imageオブジェクト返すので、それを受け取ってsaveメソッドで保存
shared\Application\download_image_service.py
from shared.Application.check_is_valid_url_service import CheckIsValidUrlService
from shared.Domain.ximage import XImage
import io
import requests
from PIL import Image
class DownloadImageService:
def execute(self, x_image: XImage, download_path_to):
if not CheckIsValidUrlService().execute(x_image.get_url()):
return False
image_binary = io.BytesIO(requests.get(x_image.get_src()).content)
image = Image.open(image_binary)
image.save(f"{download_path_to}{x_image.get_file_name()}")
return f"{download_path_to}{x_image.get_file_name()}"
以上です
まとめ
いかがでしたでしょうか。本記事では、Pythonで画像ファイルをダウンロードする方法について紹介しています。ぜひ参考にしてみてください