이전 포스팅에서 알아본 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)
'프로그래밍 > Python' 카테고리의 다른 글
[Python] Input/Output (0) | 2024.11.07 |
---|---|
[Python] 데이터 시각화 라이브러리 - Seaborn (0) | 2024.04.05 |
[Python] 웹 스크래핑 라이브러리 - beautifulsoup (1) | 2024.04.03 |
[Python] PEP8 스타일 (0) | 2024.03.28 |
[Python] 큐(Queue) (0) | 2024.03.28 |