Pythonで画像をスクレイピングする方法 | 保存方法や注意点についても解説

Pythonで画像スクレイピングを行う方法について、プログラミング初心者でも理解しやすいように解説します。

具体的なコード例や必要なライブラリのインストール方法など、ステップバイステップでお伝えしますので、ぜひ最後までお読みください。

目次

画像スクレイピングの概要

画像スクレイピングとは、Web上に公開されている画像を自動的に収集する技術のことです。

指定したサイトに存在する画像を一括で取得できるため、膨大な量の画像を手作業でダウンロードする手間を省き、効率的にデータ収集できます。

画像スクレイピングする環境

本記事で紹介する方法は以下の環境を前提としています。

  • PC:Mac(OS:Ventura)
  • 使用する言語:Python
  • 使用するライブラリ:Requests、BeautifulSoup、Selenium

画像スクレイピングするための事前準備

まずはPythonが利用できる環境を整えます。

Pythonのインストール方法については以下の記事で詳しく手順を記載していますので、あわせて確認してください。

Pythonによるスクレイピングのやり方を初心者向けに解説!BeautifulSoupを使う方法を紹介!

Pythonが使える環境を整えたら、pipコマンドを使って以下のライブラリをインストールしましょう。

pipはPythonのパッケージ管理ツールです。

パッケージとは、Pythonで書かれた再利用可能なコードの塊を意味しています。

パッケージは公式とサードパーティ製に分かれており、サードパーティ製のパッケージをインストールする際に利用するのがpipコマンドです。

ライブラリとは、よく利用される機能を切り出し、再利用しやすいようにまとめたものです。

ライブラリを使うことで、よく使う機能を1から作る必要がなくなり、効率的に開発を進められます。

  • Requests:Webページにアクセスするためのライブラリ
  • BeautifulSoup:HTMLの解析に利用するライブラリ
  • Selenium:ブラウザを自動操作するライブラリ(画像のURLを取得する際に使用)

Pythonによる画像スクレイピングの実装コード

まずはPythonによる画像スクレイピングの実装コードを記載します。

次の「Pythonによる画像スクレイピングの手順」で実装コードについて詳しく解説していますので、ここでは理解できていなくても問題ありません。

# 必要なライブラリをインポート
import os
import requests
from bs4 import BeautifulSoup
from selenium import webdriver

# Webドライバーを起動
driver = webdriver.Chrome()

# Webページにアクセスする関数を定義
def get_page(url):
    driver.get(url)
    return driver.page_source

# 画像をダウンロードする関数を定義
def download_image(image_url, save_path):
    response = requests.get(image_url)
    with open(save_path, 'wb') as f:
        f.write(response.content)

# 画像スクレイピングのメイン関数
def image_scraping(url, save_folder):
    # WebページにアクセスしてHTMLデータを取得
    html = get_page(url)
    
    # BeautifulSoupを使ってHTMLを解析
    soup = BeautifulSoup(html, 'html.parser')
    
    # imgタグを取得
    img_tags = soup.find_all('img')
    
    # 画像のURLを取得して保存
    for img_tag in img_tags:
        image_url = img_tag['src']
        if image_url.startswith('http'):
            # 画像のURLがフルパスである場合のみダウンロード
            image_name = image_url.split('/')[-1]
            save_path = os.path.join(save_folder, image_name)
            download_image(image_url, save_path)

# 画像スクレイピングを実行する
if __name__ == "__main__":
    target_url = 'https://example.com'  # スクレイピング対象のURLを指定
    save_folder = 'images'  # 画像を保存するフォルダを指定
    if not os.path.exists(save_folder):
        os.makedirs(save_folder)
    image_scraping(target_url, save_folder)

# Webドライバーを終了
driver.quit()

Pythonによる画像スクレイピングの手順

実装コードについて解説していきます。

1.必要なライブラリをインストールする


# 必要なライブラリをインポート
import os
import requests
from bs4 import BeautifulSoup
from selenium import webdriver

画像スクレイピングを行うために必要なライブラリをインストールします。

osはOSに依存している機能を利用するためのモジュールです。

osモジュールによってファイルの一覧やパスの取得、新規ファイルやディレクトリの作成ができるようになります。

Seleniumを使用するには、使用するWebブラウザに対応したWebドライバーのダウンロードが必要です。

各Webブラウザに対応するWebドライバーは以下になります。

  • Google Chrome: ChromeDriver
  • Firefox: GeckoDriver
  • Safari: SafariDriver
  • Edge: MicrosoftWebDriver

使用しているブラウザに合わせて、適切なWebドライバーをダウンロードしてインストールしてください。

基本的にはGoogle Chromeがおすすめです。

Google Chromeをベースとした情報が多く、詰まったときに解決しやすいからです。

2.Webドライバーを起動する


# Webドライバーを起動
driver = webdriver.Chrome()

ChromeDriverを使ってGoogle Chromeブラウザを自動操作するためのWebドライバーを起動しています。

他のブラウザを使いたい場合には、webdriver.Chrome()の部分を他のドライバーに合わせて変更してください。

3.Webページにアクセスする


# Webページにアクセスする関数を定義
def get_page(url):
    driver.get(url)
    return driver.page_source

Webページにアクセスする関数としてget_page()を定義しましょう。

この関数は、引数として与えられたURLに対してWebブラウザを起動し、そのページのHTMLデータを取得しています。

driver.page_sourceで取得したHTMLデータを返します。


# 画像をダウンロードする関数を定義
def download_image(image_url, save_path):
    response = requests.get(image_url)
    with open(save_path, 'wb') as f:
        f.write(response.content)

次に画像をダウンロードする関数としてdownload_image()を定義しましょう。

この関数は、引数として与えられた画像のURLから画像をダウンロードし、指定した場所に保存する処理を行います。

requests.get(image_url)で画像のURLからデータを取得し、open(save_path, ‘wb’)で指定した場所に画像を保存します。

実際にスクレイピングをする際は、適切なURLと保存先のフォルダを指定することを忘れずに行ってください。


# 画像スクレイピングのメイン関数
def image_scraping(url, save_folder):
    # WebページにアクセスしてHTMLデータを取得
    html = get_page(url)

最後に画像をスクレイピングするためのメイン関数としてimage_scraping()を定義しましょう。

get_page(url)という部分では、先ほど定義したget_page()関数を呼び出しています。

これにより、引数で指定されたURLのWebページにアクセスして、そのページのHTMLデータを取得します。

4.imgタグを取得する


    # BeautifulSoupを使ってHTMLを解析
    soup = BeautifulSoup(html, 'html.parser')
    
    # imgタグを取得
    img_tags = soup.find_all('img')

BeautifulSoupライブラリを使って、ページのHTMLデータを解析します。

soupという変数に解析したHTMLデータが格納されます。

次にBeautifulSoupのfind_all()メソッドを使用してimgタグを取得しましょう。

これにより、ページ内の全ての画像要素を取得できます。

5.画像URLを取得する


    # 画像のURLを取得して保存
    for img_tag in img_tags:
        image_url = img_tag['src']

img_tagsに格納された各imgタグから、画像のURLを取得しています。

img_tag[‘src’]で画像のURLが取得できます。

6.画像を保存する


        if image_url.startswith('http'):
            # 画像のURLがフルパスである場合のみダウンロード
            image_name = image_url.split('/')[-1]
            save_path = os.path.join(save_folder, image_name)
            download_image(image_url, save_path)


# 画像スクレイピングを実行する
if __name__ == "__main__":
    target_url = 'https://example.com'  # スクレイピング対象のURLを指定
    save_folder = 'images'  # 画像を保存するフォルダを指定
    if not os.path.exists(save_folder):
        os.makedirs(save_folder)
    image_scraping(target_url, save_folder)

if image_url.startswith(‘http’):という条件文で、画像のURLがフルパスであるかを確認しています。

もし画像のURLがフルパスであれば、その画像をダウンロードし、指定したフォルダに保存します。

image_url.split(‘/’)[-1]で画像のファイル名を抽出し、os.path.join(save_folder, image_name)で保存先のパスを生成。

そして、download_image(image_url, save_path)関数を呼び出して画像をダウンロードして保存します。

最後に、image_scraping()関数の中でURLから画像のダウンロードまでの処理が完了します。

target_urlにはスクレイピング対象のWebページのURLを、save_folderには画像を保存するフォルダのパスを指定してください。

【おまけ】エラー処理をする

適切なエラーメッセージを表示することで、どこにエラーが生じているのかがわかりやすくなります。

たとえば以下のような記述を加えると、get_page()関数内でWebページへのアクセスに失敗した場合にエラーメッセージを表示できます。


def get_page(url):
    try:
        response = requests.get(url)
        response.raise_for_status()
        return response.text
    except requests.exceptions.RequestException as e:
        print("Webページへのアクセスができませんでした。URLを確認してください。")
        return None

画像スクレイピングする際の注意点

画像スクレイピングは便利な技術ですが、利用する際にはいくつか注意点があります。

対象サイトの利用規約を確認する

画像スクレイピングを行う前に、対象となるWebサイトの利用規約を確認しましょう。

Webサイトの利用規約には、スクレイピングが明示的に禁止されている場合があります。

そのような場合には、無断でスクレイピングを行うことは違法となりますので、注意が必要です。

利用規約については、たいていWebサイトのフッター部分やプライバシーポリシーのページからチェックできます。

サーバーへの負荷を考慮する

画像スクレイピングを行う際には、対象サイトのサーバーに負荷をかけないよう注意しましょう。

大量のリクエストを繰り返すと、サーバーに過剰な負荷がかかり、サイトのパフォーマンスに影響を及ぼすことがあります。

負荷を軽減するために、スクレイピングの間隔を適切に設定したり、並行して多くのリクエストを送信しないようにしたりすることが大切です。

プライバシーや倫理を考慮する

画像スクレイピングを行う際には、プライバシーと倫理を尊重することが重要です。

他人の個人情報やプライベートな画像を無断で取得することは、倫理的に問題がある行為とされています。

また、公開されている画像でも、著作権や知的財産権を侵害する恐れがある場合もあるため注意してください。

倫理的な観点を忘れずに、常識的な範囲で画像スクレイピングを行うように心掛けましょう。

画像スクレイピングで情報収集を効率化しよう

画像スクレイピングが有効なシーンの一例としては、大量の画像を収集してAIモデルに学習させることです。

ほかにもプレゼン資料作成にあたり、使用したい画像が複数ある場合、無料素材を提供しているサイトから一括で画像を収集することもできます。

プライベートでの活用であれば、好きなアーティストやアイドルの画像をまとめて取得することも可能です。

ただし、法的・倫理的な観点を忘れず利用することが重要です。

本記事で解説している注意点を守りながら、効率的に情報収集を行ってみてください。

目次