페이지 로딩 시간을 기다린 후, 크롤링하기
이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
PhantomJS 지원 종료 안내
PhantomJS는 현재 개발이 중단되었습니다. Headless Chrome/Firefox와 Selenium WebDriver(ChromeDriver/GeckoDriver) 또는 Playwright 등 최신 대안을 사용하세요.
11. 페이지 로딩 시간을 기다린 후, 크롤링하기¶
- 몇몇 페이지의 경우, 페이지 로딩 지연이 발생하여(여러 요청이 병합하여 페이지 결과를 생성) tag를 못읽어오는 경우가 발생할 수 있음
- 이때, 아래의 코드를 이용하여 해결 가능
- e.g) 10초내에 해당 tag를 찾으면 반환, 그렇지 않으면 timeout 발생!
- http://selenium-python.readthedocs.io/waits.html
- WebDriverWait() 메서드
- 명시적인 페이지 로드 대기에 사용됨
- 주로 다음 코드와 같이 사용됨
try:
element = WebDriverWait(driver, 몇초).until(
# By.ID 는 ID로 검색, By.CSS_SELECTOR 는 CSS Selector 로 검색
EC.presence_of_element_located((By.ID, "cMain"))
)
except TimeoutException:
print("타임아웃")
finally:
driver.quit()
- from selenium.webdriver.common.by import By 검색 지원 방법
By.ID - 태그에 있는 ID 로 검색
By.CSS_SELECTOR - CSS Selector 로 검색
By.NAME - 태그에 있는 name 으로 검색
By.TAG_NAME - 태그 이름으로 검색
In [ ]:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
driver.get('http://v.media.daum.net/v/20170202180355822')
try:
# id가 cMain인 tag를 10초 내에 검색, 그렇지 않으면 timeoutexception 발생
element = WebDriverWait(driver, 10).until(
# By.ID 는 ID로 검색, By.CSS_SELECTOR 는 CSS Selector 로 검색
EC.presence_of_element_located((By.ID, "cMain"))
)
print(element.text)
except TimeoutException:
print("해당 페이지에 cMain 을 ID 로 가진 태그가 존재하지 않거나, 해당 페이지가 10초 안에 열리지 않았습니다.")
finally:
driver.quit()