웹 브라우저 자동화 - Selenium : 3-3. Wait and Call

임동윤·2022년 9월 29일
0

웹 스크래핑 기초

목록 보기
13/20
post-thumbnail

Wait and Call

  • Wait을 이용하면 동적 웹 사이트를 성공적으로 스크래핑 할 수 있다.

XPath

  • 여러 사이트 들에서 스크래핑을 방지할 목적으로 랜덤하게 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을 사용해야 한다.

Implicit Wait

  • Implicit Wait 은 암시적 기다림으로, 페이지 전체가 로드될 때까지 기다린다.
  • .implicitly_wait()의 매개변수는 대기하는 한계시간을 의미한다.

실습

  • 10초동안 Implicit 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)

Explicit Wait

  • Explicit Wait 은 명시적 기다림으로, 명시된 조건이 만족 될때가지 기다린다.
  • WebDriverWait()과 두 메서드를 활용해서 명시적 기다림을 적용할 수 있다.
    • until(): 인자의 조건이 만족될 때까지
    • until_not() : 인자의 조건이 만족되지 않을 때까지

실습

  • Explicit Wait를 활용해서 스크래핑이 잘 이루어지도록 한다.
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)

profile
AI Tensorflow Python

0개의 댓글