【Python】pythonを使ってネット上の画像を一括保存しよう!

「Pythonで画像の保存をやってみたけど、エラーが出て画像が保存されない!」

その気持ち、痛いほどよくわかります。業務効率化が得意なエンジニアの私も、新人の頃は同じようにスクレイピングのエラーに頭を抱えていました。

特に画像保存は、「サイトによって書き方が違う」「保存先のフォルダがないと怒られる」「403エラーで拒否される」といった地味に面倒な落とし穴が多いんです。

そこで今回は、「これさえコピペすれば、とりあえず動く」という、実用性と安定性を重視した画像ダウンロードコードを用意しました。

準備はたったの3分。さっそく自動化の快感を味わってみましょう!


準備:必要なライブラリをインストール

まずは、Webサイトの情報を読み取るための「道具」を2つだけインストールします。
コマンドプロンプトやターミナルに以下のコマンドを貼り付けて実行してください。

bash
pip install requests beautifulsoup4

  • requests: Webサイトのデータを取ってくるためのライブラリ(郵便屋さんの役割)
  • beautifulsoup4: 取得したデータから画像URLを探し出すためのライブラリ(整理整頓の役割)

コピペでOK!画像保存の全コード

以下のコードを、download_images.py という名前で保存して実行してください。
※URLの部分は、練習用としてご自身が管理しているサイトや、スクレイピングが許可されているサイトに変更して試してみてください。

“`python
import os
import time
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def download_web_images(target_url, save_dir):
# 1. 保存先フォルダを作成(すでにあればスルー)
if not os.path.exists(save_dir):
os.makedirs(save_dir)
print(f”フォルダ「{save_dir}」を作成しました。”)

# 2. サイトにアクセスするための設定(ロボットだと思われないための「名刺」)
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}

try:
    # 3. サイトの情報を取得
    response = requests.get(target_url, headers=headers, timeout=10)
    response.raise_for_status() # エラーがあればここで停止

    soup = BeautifulSoup(response.text, 'html.parser')

    # 4. <img>タグをすべて探す
    images = soup.find_all('img')
    print(f"{len(images)}枚の画像が見つかりました。")

    for i, img in enumerate(images):
        # 画像のURL(src属性)を取得
        img_url = img.get('src')
        if not img_url:
            continue

        # 相対パス(/img/top.jpgなど)を絶対パス(https://...)に変換
        full_url = urljoin(target_url, img_url)

        try:
            # 画像をダウンロード
            img_data = requests.get(full_url, headers=headers, timeout=10).content

            # ファイル名の決定(URLの最後を利用)
            file_name = f"image_{i+1}.jpg"
            file_path = os.path.join(save_dir, file_name)

            # 5. データをファイルとして保存
            with open(file_path, 'wb') as f:
                f.write(img_data)

            print(f"保存完了: {file_name}")

            # サーバーに負荷をかけないよう、1秒待機(ここがマナー!)
            time.sleep(1)

        except Exception as e:
            print(f"スキップしました(保存失敗): {full_url} - {e}")

except Exception as e:
    print(f"エラーが発生しました: {e}")

— 設定エリア —

target_site = “https://example.com” # ここに取得したいサイトのURLを入れる
output_folder = “downloaded_images” # 保存したいフォルダ名を入れる

実行!

download_web_images(target_site, output_folder)
“`


挫折しないためのポイント解説

初心者がつまづきやすいポイントを、エンジニア目線で噛み砕いて解説します。

1. 「User-Agent」は魔法の合言葉

サイトの中には、プログラムからのアクセスを拒否するものがあります。headers の中にある User-Agent は、「私は怪しいロボットではなく、普通のブラウザですよ」と伝えるための「名刺」のようなものです。これを入れるだけで、多くのエラーが解決します。

2. 「urljoin」が地味にすごい

画像のURLが https://... から始まっておらず、/img/photo.jpg のように省略されていることがあります。これをそのままダウンロードしようとするとエラーになります。urljoin は、サイトのURLと合体させて正しい住所を自動で作ってくれる便利機能です。

3. 「time.sleep(1)」は必須の優しさ

一瞬で100枚ダウンロードするようなコードを書くと、相手のサーバーに大きな負担をかけ、最悪の場合はアクセス禁止(出禁)になります。1秒休む という一文を入れるのが、スクレイピング界のマナーです。


もしエラーが出た時は?

  • 「403 Forbidden」が出る
    そのサイトは、プログラムによる画像収集を厳しく制限している可能性があります。無理に突破せず、他のサイトで試してみましょう。
  • 画像が0枚と表示される
    最近のサイト(InstagramやTwitterなど)は、JavaScriptという技術を使って後から画像を表示させているため、今回のシンプルな方法では取得できないことがあります。その場合は「Selenium(セレニウム)」という別の道具が必要になります。

まとめ:自動化で「自由な時間」を作ろう

最初は「コードを動かす」だけでも大変かもしれませんが、一度動いてしまえば、今まで1時間かかっていた作業が数秒で終わるようになります。

浮いた時間で新しい技術を学んだり、ゆっくりコーヒーを飲んだりできるのがエンジニアリングの醍醐味です。

まずはこのコードをベースに、自分好みにカスタマイズしてみてくださいね!

※注意:スクレイピングの注意点
取得した画像を無断で再配布・販売すると著作権法に触れる可能性があります。また、相手サイトの「利用規約」を必ず確認し、個人で楽しむ範囲や、許可された範囲内で活用しましょう。

コメント

タイトルとURLをコピーしました