Programming

[Python] 이미지 다운로드, 폴더생성, 윈도우 스크롤,

choiyeong 2025. 1. 20. 17:15
from selenium import webdriver
from bs4 import BeautifulSoup
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By #By 사용하기 위한 모듈
from selenium.webdriver.common.keys import Keys #Keys 사용하기 위한 모듈 (엔터, 리턴 등)
from selenium.webdriver.support.ui import WebDriverWait #webdriverwait를 사용하0기 위한 모듈
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options #옵션
import requests, time, os

# 실습4. 이미지 크롤링하기 ################################
time.sleep(2)
search = driver.find_element(By.ID, 'APjFqb')
search.send_keys("토끼")
search.send_keys(Keys.ENTER)
print("토끼 검색 완료.")
time.sleep(2)

# 무한 스크롤
for i in range(1,4):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    print(i,"회 스크롤.")
    time.sleep(2)

images = driver.find_elements(By.CSS_SELECTOR, "img.YQ4gaf")
# images = WebDriverWait(driver,10).until(
#     EC.visibility_of_all_elements_located((By.CSS_SELECTOR,"img.YQ4gaf"))
#     )
os.makedirs("images", exist_ok=True) # 폴더 신규 생성, 존재시 무시한다.
code=1
for image in images :
    # print(image.get_attribute("src"))
    src = image.get_attribute("src")
    if "FAVICON" not in src and "https://" in src:
        print(src)
        res = requests.get(src)
        with open(f"images/image_{code}.png", 'wb') as file:
            file.write(res.content)
            code +=1

print("서치 끝")

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

driver.execute_script()

스크립트에 다음 명령을 내린다.

driver.execute_script("window.scrollTo();")

윈도우 스크롤을 움직일건데

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

0~문서 바디부분의 스크롤 높이까지!

 

=> 스크립트에 0~문서바디부분의 스크롤높이까지 윈도우 스크롤을 움직인다.

=스크롤을 최대한 아래로 당긴다.

 

images = driver.find_elements(By.CSS_SELECTOR, "img.YQ4gaf")

find_elements()

요소들을 찾아라 (리스트형태 반환)

mages = driver.find_elements(By.CSS_SELECTOR, "img.YQ4gaf")

CSS_SELECTOR 요소의 "img.YQ4gaf" 값들을 싹다 찾아서 images안에 리스트형태로 넣어라.

 

os.makedirs("images", exist_ok=True)

폴더 새로 생성 (폴더 위치는 VS code를 열고있는 폴더이다.

exist_ok=True : 같은 이름의 폴더가 이미 존재하면 굳이 안 만듦.

import os

필요하다.

 

src = image.get_attribute("src")

# for문으로 images만큼 image를 불러온 상태

image의 속성(attribute) 중 scr요소를 가져와라 (scr은 스크린샷의 대표적 속성값)

 

if "FAVICON" not in src and "https://" in src:

사이트에 파비콘(사이트로고)가 많아서 not in src로 걸러주었고, 동시에 다른 요소가 방해하지 않도록 "https://"를 포함한 녀석만 불러왔다.

 

res = requests.get(src)
        with open(f"images/image_{code}.png", 'wb') as file:
            file.write(res.content)

 

requests.get()으로 src값을 res에 담아두었고 with문으로 사용하는데

open(f"images/image_{code}.png", 'wb') as file:

open(f"images/image_{code}.png",'wb')를 계속 쓰지 않게 as file로 별칭을 부여,

f"images/image_{code}.png"는 저장될 파일 이름이고

'wb'는 바이너리 형태로 쓰기모드를 사용한다는 뜻이다.

이를 file.write(res.content)로 png형태의 사진을 저정할 수 있다.