[Python] 이미지 다운로드, 폴더생성, 윈도우 스크롤,
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안에 리스트형태로 넣어라.
폴더 새로 생성 (폴더 위치는 VS code를 열고있는 폴더이다.
exist_ok=True : 같은 이름의 폴더가 이미 존재하면 굳이 안 만듦.
import os
필요하다.
# for문으로 images만큼 image를 불러온 상태
image의 속성(attribute) 중 scr요소를 가져와라 (scr은 스크린샷의 대표적 속성값)
사이트에 파비콘(사이트로고)가 많아서 not in src로 걸러주었고, 동시에 다른 요소가 방해하지 않도록 "https://"를 포함한 녀석만 불러왔다.
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형태의 사진을 저정할 수 있다.