Selenium
을 이용한 웹 브라우저 조작Selenium
, webdriver-manager
Selenium
을 통해 웹 브라우저를 이동할 수 있고 마우스를 이용한 클릭, 스크롤, 키보드를 통한 입력 등을 python으로 자동화할 수 있다.time.sleep()
을 사용한다.# 필요한 라이브러리
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# driver 객체 생성
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 페이지 열기
driver.get("원하는 url")
# 페이지 소스 확인
driver.page_source
# with ~ as .. 구문을 통한 driver 구동
## webdriver를 실행한 후 자동으로 꺼지게 하기 위함
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
print(driver.page_source)
...
# 요소 찾기
from selenium.webdriver.common.by import By
## By에는 TAG_NAME, ID, CLASS_NAME 등 여러가지가 있다.
## 요소 1개 찾기
driver.find_element(By.TAG_NAME, "p")
## 요소 모두 찾기
driver.find_elements(By.TAG_NAME, "p")
### find_element와 find_elements의 반환 값은 selenium 객체이며
### text등을 사용하여 값을 확인할 수 있다.
### find_elements는 모든 값을 순서대로 list에 담아서 반환한다.
# 대기(Wait)
## Implicit Wait
driver.implicitly_wait(10) # 실행될 때까지 10초 기다린다.
### 무작정 10초 모두 기다리는 것이 아니라
### 실행이 완료될 때까지 기다리는 최대 시간이 10초인 것이다.
### 10초 이전에 완료된다면 바로 다음 단계로 넘어간다.
## Explicit Wait
### until(): 인자의 조건이 만족될 때까지
### until_not() 인자의 조건이 만족되지 않을 때까지
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
### 10초가 될 때까지 ID가 'id'인 요소가 나타나면 값을 반환한다.
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'id')))
# 클릭 이벤트 발생시키기
## 1. 대상 요소를 찾는다.
## 2. 실행하고자 하는 내용을 ActionChain을 통해 전달한다.
## 3. perform()을 통해 실행한다.
from selenium.webdriver import ActionChains
button = driver.find_element(By.id, 'button')
ActionChains(driver).click(button).perform()
# 입력 이벤트 발생시키기
## 1. 대상 요소를 찾는다.
## 2. 입력하고자 하는 내용을 ActionChain을 통해 전달한다.
## 3. perform()을 통해 실행한다.
from selenium.webdriver import ActionChains
id_input = driver.find_element(By.ID, 'id')
ActionChains(driver).send_keys_to_element(id_input, 'id').perform()
selenium
과 함께 BeautifulSoup
을 사용하면 더 유연하게 사용할 수 있을 것 같다. 같이 쓰는 실습을 해보고 싶다.지금까지 대기하는건 time.sleep()
만 사용해왔었는데 implicitly_wait()
과 WebDriverWait
을 사용하면 조금더 유용할 것이라는 생각이 들었다. 아직은 간단한 코드라고 느껴서 그런지 너무 재미있다!!!