데브코스 TIL/Web Scrapping

Web Scraping 기초 3-3. Wait and Call

예니ㅣ 2023. 10. 26. 15:32

강의

"XPath"는 XML, HTML 문서 등의 요소의 위치를 경로로 표현하는 것입니다.

%pip install selenium
%pip install webdriver-manager

# 스크래핑에 필요한 라이브러리를 불러와봅시다.
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

 

기다림(Wait)

  • 명시적 기다림(Explicit Wait) : 지정한 시간 동안 기다림
# Explicit Wait를 활용해서 스크래핑이 잘 이루어지도록 코드를 작성해봅시다.
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.ID, "target")))
  print(element)
  • 암묵적 기다림(Implicit Wait) : 특정 요소에 대한 제약을 통한 기다림
# 10초동안 Implicit Wait을 진행하도록 해서 스크래핑이 잘 이루어지도록 수정해봅시다.
from selenium.webdriver.support.ui import WebDriverWait

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)

 

여러 공연 제목 가져오기

# 여러 공연의 제목을 스크래핑하는 코드를 작성해봅시다.
from selenium.webdriver.support.ui import WebDriverWait

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[1]/div[{}]/a/div[2]/p[1]".format(i))
    print(element)