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()