動的生成ページの画像をseleniumでクエリパラメータを無視して取得する

ページ内の画像をすべて自動でダウンロードしようとしたら上手くいかなかった。

見たところ動的にページが作られているらしくて、ダウンロードしようとする画像にクエリパラメータが含まれてしまって、正しく動作しないことがあるみたい。ふふ、ままならないね。

クエリ部分をなくしたらうまくいくかも。

pip install selenium
pip install webdriver_manager
import os
import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from urllib.parse import urljoin, urlparse
import time

# Seleniumを使用して画像をダウンロード
def download_images_from_dynamic_page(url, output_folder):
    # フォルダが存在しない場合は作成
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    # ChromeDriverの設定(webdriver_managerを使用して自動ダウンロード)
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    
    # URLにアクセス
    driver.get(url)
    time.sleep(5)  # ページが完全に読み込まれるまで待機(必要に応じて調整)
    
    # 画像要素を探す
    try:
        img_tags = driver.find_elements(By.TAG_NAME, "img")
        if not img_tags:
            print("No images found on the page.")
            return
        print(f"Found {len(img_tags)} images.")
    except Exception as e:
        print(f"Error finding img tags: {e}")
        return
    
    # 画像のダウンロードをループ
    for img in img_tags:
        try:
            img_url = img.get_attribute('src')
            if not img_url:
                print("No src attribute found in img tag, skipping.")
                continue

            # 画像のURLを完全な形にする(相対パスをフルURLに変換)
            img_url = urljoin(url, img_url)
            
            # クエリパラメータを取り除く
            img_url = urlparse(img_url)._replace(query="").geturl()

            print(f"Downloading image: {img_url}")

            # 画像のファイル名を取得
            img_name = os.path.basename(img_url)

            # 画像をダウンロード
            img_response = requests.get(img_url)
            img_response.raise_for_status()  # ステータスコードが200でない場合は例外を投げる
        except requests.exceptions.RequestException as e:
            print(f"Error downloading image {img_url}: {e}")
            continue

        # 画像を保存
        try:
            img_path = os.path.join(output_folder, img_name)
            with open(img_path, 'wb') as f:
                f.write(img_response.content)
            print(f"Successfully downloaded and saved {img_name}")
        except Exception as e:
            print(f"Error saving image {img_name}: {e}")
    
    # ブラウザを閉じる
    driver.quit()

# 例:指定URLから画像をダウンロード
url = 'https://example.com'  # ダウンロードしたいURLを指定
output_folder = 'downloaded_images'  # 画像を保存するフォルダ
download_images_from_dynamic_page(url, output_folder)

print("Process completed!")

url = ‘https://example.com’ # ダウンロードしたいURLを指定
の部分に画像が欲しいサイトのURLを記載する。

ちなみに、Sleepを入れてないから場合によっては負荷がかかって怒られるから注意しないといけないかも。

コメント

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