Wait
을 이용하면 동적 웹 사이트를 성공적으로 스크래핑 할 수 있다.여러 사이트 들에서 스크래핑을 방지할 목적으로 랜덤하게 class 이름을 생성한다.
XPath
는 마치 데스크탑/폴더1/폴더2/음악.mp3
와 같이 XML, HTML 문서 등의 요소의 위치를 경로로 표현하는 것을 의미한다.
이렇게 위치를 이용하면 이를 해결할 수 있다.
XPath
을 이용하여 예시 사이트에 요청을 하며, 첫번째 이벤트의 제목을 출력한다.from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()))
driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]').text
오류
--------------------------------------------------------------------------- NoSuchElementException Traceback (most recent call last) Input In [5], in <cell line: 5>() 3 driver = webdriver.Chrome(service = Service(ChromeDriverManager().install())) 4 driver.get("https://indistreet.com/live?sortOption=startDate%3AASC") ----> 5 driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]').text
- 해당 페이지가 동적 웹페이지 이기 때문에 이런 오류가 발생하였다.
이를 해결하기 위해 Wait을 사용해야 한다.
.implicitly_wait()
의 매개변수는 대기하는 한계시간을 의미한다.driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()))
with webdriver.Chrome(service = Service(ChromeDriverManager().install())) as driver:
driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
driver.implicitly_wait(10)
print(driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]').text)
WebDriverWait()
과 두 메서드를 활용해서 명시적 기다림을 적용할 수 있다.until()
: 인자의 조건이 만족될 때까지until_not()
: 인자의 조건이 만족되지 않을 때까지from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome(service = Service(ChromeDriverManager().install())) as driver:
driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]')))
print(element.text)
Wait
을 이용하여 여러 공연의 제목을 스크래핑 한다.with webdriver.Chrome(service = Service(ChromeDriverManager().install())) as driver:
driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
driver.implicitly_wait(10)
for i in range(1,11):
element = driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[{}]/div/a/div[2]/p[1]'.format(i))
print(element)