본문 바로가기
ETC/Python

(Python) 웹 페이지 모든 이미지 로컬 PC에 저장하기(BS4, Request, Image)

by Guardy 2024. 10. 18.
728x90
반응형
반응형

파이썬

웹 페이지 내 모든 img를 로컬 폴더에 저장할 필요가 있을분에게 추천드리는 코드입니다.

Python BS4(BeautifulSoup)와 Request 그리고 이미지처리를 위해 Image 라이브러리를 사용하였습니다.

url = "https://dev-guardy.tistory.com/"

save_folder = "dev-guardy"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)

이미지를 저장할 폴더를 만들어주고

response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
img_tags = soup.find_all('img')

Response Text를 Soup를 이용하여 image Tag들만 뽑습니다.

for index, img_tag  in enumerate(img_tags):
    img_url = img_tag.get('src')
    if img_url != None:
        if img_url[:4] != 'http':
            img_url = 'http:' + img_url
        print(img_url)
        img_response = requests.get(img_url)
        img = Image.open(BytesIO(img_response.content))
        img_name = os.path.join(save_folder, str(index) + '.png')
        img.save(img_name)
        print(f"Saved image: {img_name} (Height: {img.height})")

그 다음 img tag를 돌면서 src를 가져온뒤, 가끔 None인 경우가 있어서 if문으로 예외처리하고, 

http 와 https가 빠진 src url

http나 https가 src로 가져올때 빠지는 경우가 있어 img_url의 앞 4글자를 가져와서 http가 아닌경우 붙여주는 코드를 작성하였습니다.

마지막으로 img_url을 다시 request하여 해당 response content를 image 라이브러리를 이용하여 저장해주면 완료입니다.

코드 실행 모습
정상적으로 저장된 이미지들

 

전체 코드는 다음과 같습니다.

import os
import requests
from bs4 import BeautifulSoup
from PIL import Image
from io import BytesIO

url = "https://dev-guardy.tistory.com/" 

save_folder = "dev-guardy"
if not os.path.exists(save_folder):
    os.makedirs(save_folder)
    
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
img_tags = soup.find_all('img')

for index, img_tag  in enumerate(img_tags):
    img_url = img_tag.get('src')
    if img_url != None:
        if img_url[:4] != 'http':
            img_url = 'http:' + img_url
        print(img_url)
        img_response = requests.get(img_url)
        img = Image.open(BytesIO(img_response.content))
        img_name = os.path.join(save_folder, str(index) + '.png')
        img.save(img_name)
        print(f"Saved image: {img_name} (Height: {img.height})")

도움이 되셨다면 공감 및 댓글 부탁드립니다.

728x90
반응형