見出し画像

python:指定したURLの下層を含む複数の画像を抽出する方法

pythonにて、指定したURLの下層を含む複数の画像を抽出する方法です。

・対象のURLをメッセージボックスで入力します。

・「C:\Work」に画像を自動出力します。
 フォルダが無い場合は自動作成します。
 処理終了後に自動起動します。

・外部リンクは除きます。

最初にパッケージをインストールします。

pip install requests beautifulsoup4

以下をコピーアンドペーストしてください。

「C:\Work」を任意のフォルダに書き替えてください。

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
from tkinter import simpledialog
import os
import subprocess

def get_base_url(page_url):
    parsed_url = urlparse(page_url)
    base_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
    return base_url

def get_all_image_urls(page_url):
    base_url = get_base_url(page_url)
    image_urls = []
    try:
        response = requests.get(page_url)
        soup = BeautifulSoup(response.text, 'html.parser')
        for img in soup.find_all('img'):
            img_url = img.get('src')
            if img_url:
                abs_img_url = urljoin(page_url, img_url)
                if base_url in abs_img_url:
                    image_urls.append(abs_img_url)
    except Exception as e:
        print(f"Error fetching images: {e}")
    return image_urls

def save_image(img_url, save_path):
    try:
        response = requests.get(img_url)
        if response.status_code == 200:
            with open(save_path, 'wb') as f:
                f.write(response.content)
                print(f"Image saved: {save_path}")
        else:
            print(f"Failed to download image from {img_url}")
    except Exception as e:
        print(f"Error saving image: {e}")

def main():
    page_url = simpledialog.askstring("Input", "下層を含む画像を抽出したいURLを入力してください:")
    if page_url:
        image_urls = get_all_image_urls(page_url)

        #################################
        #任意のフォルダに変更してください。#
        #################################
        save_folder = r'C:\Work'
        os.makedirs(save_folder, exist_ok=True)

        for idx, img_url in enumerate(image_urls, 1):
            save_path = os.path.join(save_folder, f"image{idx}.jpg")
            save_image(img_url, save_path)

        # フォルダを開く
        subprocess.run(['explorer', save_folder])

if __name__ == "__main__":
    main()

いいなと思ったら応援しよう!