Masayan tech blog.

  1. ブログ記事一覧>
  2. Pythonで画像ファイルをダウンロードする方法

Pythonで画像ファイルをダウンロードする方法

公開日

環境

  • 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で画像ファイルをダウンロードする方法について紹介しています。ぜひ参考にしてみてください