이전 포스팅에서 알아본 BeautifulSoup는 주로 정적인 웹 페이지에서의 데이터 추출을 위해 사용되는 라이브러리이다. 하지만 우리가 평소 사용하는 웹 사이트는 동적인 웹 페이지로 구성되어있는 경우가 더 많다. 이러한 경우에 사용할 수 있는 웹 스크래핑 도구인 Selenium에 대해서 알아보자.


 Selenium  

Selenium 이란?

selenium은 웹 어플리케이션의 동적인 요소와 상호작용하기 위한 자동화 도구로 사용된다. 실제 브라우저를 제어하여 자바스크립트를 실행하고, 클릭, 텍스트 입력 등의 사용자 동작을 시뮬레이션한다. 


기본적인 사용법

selenium 라이브러리에 있는 webdriver 모듈을 통해 웹 사이트에 직접적으로 접근해 제어가 가능하다. 크롬을 통해 웹 사이트에 접근할 것이기 때문에 ChromeDriverManager와 Service 모듈도 import 하였다.
ChromeDriverManager는 크롬 웹 드라이버를 자동으로 다운로드하고 설치하는데 사용되고, Service는 크롬 드라이버를 로컬에서 실행하기 위한 서비스를 설정하는데 사용된다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

driver1 = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver1.get("https://www.example.com")
print(driver1.page_source)
driver1.quit()

with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver2:
    driver2.get("http://www.example.com ")
    print(driver2.page_source)

driver1 처럼 객체를 설정할 경우, 크롬 브라우저는 quit을 만나기 전까지 계속 창이 열려있게 된다. 그렇기 때문에 driver2처럼 with..as : 구문을 사용하여 구문내의 명령어들이 끝날 경우 해당 브라우저 창이 자동으로 종료되게끔 하는 방법이 더 선호된다.


 주요 메서드   

get(url)

지정된 url로 웹 브라우저를 이동하는 메서드

driver.get("https://www.example.com")

find_element(by, value)

지정된 조건에 맞는 첫 번째 웹 요소를 찾는 메서드. by에는 찾을 요소의 방법을 지정하고, value에는 해당 방법에 대한 값을 지정한다.

element = driver.find_element(by="id", value="example_id")

implicitly_wait(time)

지정된 시간동안 웹 요소가 나타날 때까지 대기하는 메서드. 웹 요소가 나타나면 대기 종료됨

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # 10초 동안 대기
driver.get("https://www.example.com")

explicitly_wait(time)

지정된 시간동안 특정 조건이 충족될 때까지 대기하는 메서드. 특정 조건 충족되면 대기 종료됨

driver = webdriver.Chrome()
driver.get("https://www.example.com")
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "example_id")))

 이벤트 처리   

Selenium을 활용하면 마우스 및 키보드 이벤트를 처리하여 사용자가 웹 브라우저에서 수행하는 동작을 시뮬레이션해볼 수 있다. 

마우스 이벤트 처리

ActionChains 클래스를 사용하여 마우스 동작을 시뮬레이션한다. 이 클래스는 여러 마우스 동작을 연속적으로 실행할 수 있게 해준다. 주요 메서드로는 move_to_element(), click(), double_click(), context_click(), drag_and_drop(), drag_and_drop_by_offset() 등이 있다.

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# 요소에 대한 ActionChains 객체 생성
element = driver.find_element_by_id("example_id")
actions = ActionChains(driver)

# 요소 위로 이동 후 클릭
actions.move_to_element(element).click().perform()

# 요소를 드래그 앤 드롭
target_element = driver.find_element_by_id("target_id")
actions.drag_and_drop(element, target_element).perform()

키보드 이벤트 처리

Keys 클래스를 사용하여 특수 키(Enter, Shift, Ctrl 등)의 입력을 처리하고, send_keys() 메서드를 사용하여 텍스트 필드에 키를 입력할 수 있다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# 텍스트 필드에 키 입력하기
search_input = driver.find_element_by_id("search_input_id")
search_input.send_keys("Selenium")

# 엔터 키 누르기
search_input.send_keys(Keys.RETURN)