beautifulsoup로 웹 스크래핑을 하다 비동기 요청을 하는 웹에서는 데이터가 받아지지 않음을 깨닫고 셀레니움을 사용해보았다.
하지만 셀레니움을 사용하며 맞닥드린 문제가 hidden으로 숨겨져 있고 LazyLoading이 걸려있는 페이지는 src의 경로를 반환하는 것이 아닌 base64로 엔코딩이 된 바이너리 타입이 반환되는것을 확인했다.
이를 해결하기 위해 온갖 사이트를 돌아다녀봤지만 마땅한 해답을 찾지 못하던 와중 innerHTML로 모든 HTML코드를 반환받아봤다.
뜻밖에도 src가 아닌 data-original-src로 경로가 설정되어있는 모습을 확인할 수 있었다.
그렇게 get_attribute('data-original-src') 로 반환을 받은 결과
야호 해결이다
최종 코드
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
# Selenium 웹 드라이버 경로 설정
driver_path = ('./chromedriver-win32/chromedriver.exe')
# Chrome 웹드라이버를 사용하여 브라우저 열기
service = Service(driver_path)
driver = webdriver.Chrome(service=service)
# 페이지 열기
driver.get('https://movie.daum.net/ranking/boxoffice/yearly')
# 원하는 요소들 찾기
movies = driver.find_elements(By.CSS_SELECTOR, '.inner_article > .g_comp > .wid_n > .coll_cont > .mg_cont > .type_plural > li')
wait = WebDriverWait(driver, 1)
for movie in movies:
movie_name = movie.find_element(By.CSS_SELECTOR, '.info_tit > a').get_attribute('textContent')
movie_image = movie.find_element(By.CSS_SELECTOR, '.thumb > img').get_attribute('src')
# 무지성 HTML 뽑아보기
# movie_image = movie.find_element(By.CSS_SELECTOR, '.thumb').get_attribute('innerHTML')
# hidden으로 되어있는 엘리먼트가 lazy 로딩이 걸려있어 base64로 설정되어 있을 경우
if "data:image" in movie_image:
movie_image = movie.find_element(By.CSS_SELECTOR, '.thumb > img').get_attribute('data-original-src')
print(movie_name + ' - ' + movie_image)
# 브라우저 닫기
driver.quit()
'코딩딩 > Error' 카테고리의 다른 글
Thymeleaf 사용시 redirect가 동작하지 않는 오류 (1) | 2024.01.10 |
---|---|
Spring Data JPA 사용시 Repository BeanCreationException (0) | 2024.01.09 |
OneToOne 양방향 관계 지연로딩 안먹히는 문제 해결법 (0) | 2024.01.05 |
OneToOne 관계에서 N+1 문제가 발생하는 이유 (2) | 2024.01.04 |
Builder 패턴 사용시 ArrayList가 초기화 되지 않는 문제 (1) | 2024.01.03 |