%pip install selenium
로 설치Web driver
가 필요하다.Web driver
를 관리하는 라이브러리인 webdriver-manager
의 설치가 필요하다.webdriver-manager
의 역할 : 현재 나의 브라우저의 버전을 확인하고 그에 맞는 버전의 드라이버를 인스톨 해준다.# selenium으로부터 webdriver 모듈을 불러온다
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 현재 사용하고 있는 크롬에 맞는 드라이버를 설치하고 service 파라미터로 전달
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("http://www.example.com")
print(driver.page_source)
위와 같이 실행할 경우 웹 브라우저 창이 계속 켜 있게 된다. 자동으로 닫히게 하기 위해 with절을 사용한다.
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
print(driver.page_source)
요소 하나 찾기
driver.find_element(by, target)
by
: 대상을 찾는 기준 : ID
, TAG_NAME
, CLASS_NAME
, ...target
: 대상의 속성 요소 여러개 찾기
driver.find_elements(by, target)
by
: 대상을 찾는 기준 : ID
, TAG_NAME
, CLASS_NAME
, ...target
: 대상의 속성여기서 by에 해당하는 파라미터를 넘길 때 from selenium.webdriver.common.by import By
로 라이브러리를 가져와 가져오려는 기준을 명시하는데 사용한다.
from selenium.webdriver.common.by import By
# p 태그에 해당하는 요소 하나를 찾기
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
print(driver.find_element(By.TAG_NAME, "p").text)
# p 태그에 해당하는 요소 여러개 찾기
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("http://www.example.com")
for element in driver.find_elements(By.TAG_NAME, "p"):
print(element.text)
# 10초동안 Implicit Wait을 진행
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[2]/div/a/div[2]/p[1]').text)
WebDriverWait()
과 아래 두 메서드를 활용해서 명시적 기다림을 적용한다.until()
: 인자의 조건이 만족될 때까지until_not()
인자의 조건이 만족되지 않을 때까지 WebDriverWait
와 expected_conditions
를 활용하여 명시적 기다림을 적용한다. 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[2]/div/a/div[2]/p[1]')))
print(element.text)
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):
print(driver.find_element(By.XPATH, f'//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[{i}]/div/a/div[2]/p[1]').text)
ActionChains
라이브러리가 마우스 입력과 같은 액션들을 연쇄적으로 수행할 수 있게 한다.# 웹 스크래핑에 필요한 라이브러리 불러오기
from selenium import webdriver
from selenium.webdriver import ActionChains
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://hashcode.co.kr/")
driver.implicitly_wait(0.5)
button = driver.find_element(By.XPATH, '//*[@id="main-app-gnb-header"]/div/div/div[1]/div/div[2]/div/div/div[1]/span[1]/a[1]')
ActionChains(driver).click(button).perform()
Keys
import가 필요하다.from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
# driver를 이용해 해당 사이트에 요청을 보낸다.
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://hashcode.co.kr")
time.sleep(1)
# 내비게이션 바에서 "로그인" 버튼 찾고 클릭
button = driver.find_element(By.XPATH, '//*[@id="main-app-gnb-header"]/div/div/div[1]/div/div[2]/div/div/div[1]/span[1]/a[1]')
ActionChains(driver).click(button).perform()
time.sleep(1)
# "아이디" input 요소에 아이디(이메일) 입력
id_input = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/div[2]/input')
ActionChains(driver).send_keys_to_element(id_input, '로그인 할 이메일 입력').perform()
time.sleep(1)
# "패스워드" input 요소에 비밀번호를 입력
pw_input = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/div[4]/input')
ActionChains(driver).send_keys_to_element(pw_input, '로그인 비밀번호 입력').perform()
time.sleep(1)
# "로그인" 버튼을 클릭
login_button = driver.find_element(By.XPATH, '//*[@id="main-app-account"]/div/div[2]/div/div[2]/div[1]/div/div[2]/button')
ActionChains(driver).click(login_button).perform()
time.sleep(1)