개요
동적 웹 페이지를 크롤링할 때, 페이지 일부가 로딩되지 않아 오류가 발생하는 상황을 방지하기 위함.
또한, 페이지 일부가 로딩되기를 기다리는 시간이 30초 이상으로 너무 길어, 많은 수의 페이지를 크롤링하는데 시간이 지나치게 오래 걸리는 것을 해결하고자 함.
1. 동적 웹 페이지의 일부가 로딩될 때까지 대기
- 단순 시간 대기 : time 라이브러리의 time.sleep()
- 암묵적 대기 : driver.implicitly_wait()
- 명시적 대기 : selenium 라이브러리의 WebDriverWait, expected_conditions
두 가지 방법 중에 2번쨰 방법을 추천하는 이유는 time.sleep()은 정해진 시간을 대기한다.
웹페이지가 이미 로딩되었더라도 무조건 대기하게 되고, 정해진 시간을 지나서도 웹페이지가 로딩되지 않은 경우에도 문제가 발생한다.
명시적 대기
selenium 라이브러리의 WebDriverWait, expected_conditions를 사용하면 expected_conditions를 만족할 때까지 대기할 수 있게 된다.
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
# 아래와 같은 방법으로 사용할 수 있다.
# wait(driver, 대기할 시간 sec).until(조건).실행할 함수()
condition = EC.presence_of_element_located((By.CSS_SELECTOR, "div.input_box>input.input_search"))
wait(driver, 30).until(condition).send_keys(search_key)
괄호 안에 들어가는 By.는 확인하려는 요소가 어떤 속성인지 정의하고 " "안에 확인하려는 요소의 경로나 이름을 넣으면 된다. expected_conditions으로 설정할 수 있는 주요 조건들은 아래와 같다.
- expected_conditions.presence_of_element_located((By. ,""))
- 로딩된 페이지에 조건 요소가 있는지 확인
- expected_conditions.visibility_of_element_located((By. ,""))
- 로딩된 페이지에 조건 요소가 보이는지 확인
- expected_conditions.presence_of_all_elements_located((By. ,""))
- 로딩된 페이지가 조건 요소 중 하나라도 있는지 확인
- expected_conditions.element_to_be_clickable((By. ,""))
- 조건 요소가 클릭 가능한지 확인
참고자료
https://charimlab.tistory.com/entry/ep01웹크롤링-17-셀레니움-로딩될-때까지-시간조건-설정하기-with-파이썬
https://velog.io/@fhdufhdu/SIG-프로젝트-2.-Selenium과-BS4를-사용해보자데이터-수집
'python > 웹크롤링' 카테고리의 다른 글
[Python] bs4 - get_text(), string (0) | 2023.05.28 |
---|---|
[Python] requests - text와 content의 차이 (0) | 2023.05.28 |
[Python] selenium - 웹페이지 html 가져오기 (0) | 2022.12.11 |
[Python] bs4 - find/select (0) | 2022.12.06 |