컴퓨터/Python
지난번에 Python Selenium을 이용해서 웹 브라우저를 구동시키고, 데이터를 추출하는 방법을 알아봤습니다.
사실 다양한 스크래핑, 크롤링을 하는 작업에서 Selenium을 이용하면 브라우저의 형태로 구동하여 데이터를 취득하기 편리한 장점이 있지만 비교적 느린 속도라는 문제 또한 존재합니다.
그리고 이 문제는 빠르게 동작하는 프로그램 환경에서 생각지 못하는 문제가 발생하기도 합니다.
따라서 Selenium을 사용하기 위해서 대기하는 과정을 이해하고 사용하는 방법을 알아보도록 하겠습니다.
이게 무슨 말인가?
Selenium은 웹 브라우저와 연동하여 웹 브라우저를 동작시키는 역할을 합니다.
예를 들어, 어떠한 Get요청을 해서 특정 요소를 추출하는 과정이 이루어진다면, Get요청이 완료되고 웹 브라우저에서 완성된 DOM 형태의 문서가 작성이 되어야만 합니다. 만약 대기시간이 충분하지 않아 Get요청이 완료되지 않은 상태에서 요소를 추출하는 과정이 이루어진다면 원하는 동작을 하지 못하는 경우가 발생하게 됩니다.
따라서 selenium을 잘 다루기 위해서는 다양한 방법으로 웹 브라우저가 구동해서 원하는 동작을 완료할 때까지 기다리는 대기시간을 생성해 주어야만 합니다.
간단하게 설명하자면 3가지의 방법이 있습니다.
첫 번째의 경우에는 가장 간단하게 대기시간을 지정할 수 있지만 비효율적이므로 포스트에서 설명하지 않겠습니다.
Implicity wait, Explicity wait의 경우 selenium에서 효과적으로 웹 브라우저를 제어하기 위해 제공되는 녀석들로 기본적으로 설정된 시간 내에 완료되면 대기 해제, 설정된 시간 내에 완료하지 못하면 Pass의 형태를 가지고 대기시간을 제어하게 됩니다.
가장 기본적으로 사용하는 방법입니다.
제한된(설정한) 시간까지 대기한다. 만약 제한된 시간 전에 완료한다면 대기를 해제한다. 의 의미를 가진 기능입니다.
사용방법은 아래와 같습니다.
from selenium import webdriver
#웹 드라이버 구동
browser = webdriver.Chrome()
#암시적 제한 설정 제한시간 = 10초
browser.implicitly_wait(time_to_wait=10)
#Get 요청 최대 제한 시간 = 10초
browser.get("https://www.tistory.com")
이 implicity_wait는 한번 설정하면 변경하지 않는 한 계속해서 적용됩니다.
많은 경우 위의 implicity_wait만을 사용해도 selenium을 사용할 수 있습니다.
하지만 서버로부터 다양한 방식으로 데이터를 전달받기 때문에 implicity_wait의 경우 문제가 발생하는 경우가 생깁니다.
예를 들어 implicity_wait를 설정하고, 서버로부터 javascript의 형태로 데이터를 전달받는다면 javascript데이터를 받는 순간 정보를 다 받았다고 생각하여 대기상태가 해제됩니다.
이런 경우 Get요청 이후 javascript 형태의 데이터만을 받아오게 됩니다.
대부분 javascipt를 통해 생성된 브라우저 상에서 완성된 DOM 형태의 HTML 문서가 필요한데 말이죠.
이런 경우 명시적인 대기 방법인 Explicity_wait를 이용해서 조건부 제한시간을 설정할 수 있게 됩니다.
사용하기 위해서 우선 selenium패키지에서 몇 가지 모듈을 import 해주도록 하겠습니다.
이후 예제 소스코드를 보도록 하겠습니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
#웹 드라이버 구동
browser = webdriver.Chrome()
#Get 요청
browser.get("https://www.tistory.com")
#명시적 제한 설정
WebDriverWait(browser,10).until(expected_conditions.presence_of_element_located((By.ID,"cMain")))
위와 같은 예제 방식으로 소스코드를 작성하면 명시적인 대기를 이용할 수 있습니다.
다양한 조건 방식과 사용법은 여기를 참조하세요.
Python - [크롤링 실습] selenium으로 번개장터 조회하기 1 (접속,검색,취득) (0) | 2022.07.02 |
---|---|
Python - Selenium3 ( 입력 / 클릭) (0) | 2022.05.09 |
Robots.txt ? (크롤링과 규약) (0) | 2022.05.09 |
Python - Selenium (소스 및 요소 접근) (0) | 2022.05.06 |
Python - Selenium 맛보기 (동적 웹 페이지 크롤링) (0) | 2022.05.04 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet