
- Selenium
- Wait and Call
- 마우스 이벤트 처리하기
- 키보드 이벤트 처리하기
파이썬을 사용해서 웹 브라우저를 조작할 수 있는 자동화 프레임워크. 마우스나 키보드를 이용한 조작을 파이썬으로 수행할 수 있다. 추가로
웹 브라우저와 연동을 하고 제어하기 위해 Web Driver가 필요하다.
pip install selenium
pip install webdriver-manager
# selenium으로부터 webdriver 모듈을 불러옵니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# Chrome() 객체 생성
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# get 메서드를 통해 요청을 보냄
driver.get("http://www.example.com")
# page_source 속성을 통해 HTML 문서확인하기
print(driver.page_source)
with-as 구문을 사용하면 명령이 끝났을 때 driver 를 종료하도록 설정 가능with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("https://www.example.com")
print(driver.page_source)
.find_element(by,target) : 요소 하나 찾기.find_elements(by,target) : 요소 여러개 찾기by : 대상을 찾는 기준 EX) ID, TAG-NAME, CLASS_NAME ...target : 대상의 속성# 요소 한개 추출
# 기준을 설정할 By 라이브러리 import
from selenium.webdriver.common.by import By
# url 연결 후 p 태그로 이루어진 요소 하나 추출
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("https://www.example.com")
print(driver.find_element(By.TAG_NAME, "p").text)
# 요소 여러개 추출
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("https://www.example.com")
# find_elements는 리스트 형태로 반환, for 문을 통해 출력
for element in driver.find_elements(By.TAG_NAME, "p"):
print("Text : ", element.text)
find 메서드를 사용해서 요소를 추출하다 보면 동적 웹페이지와 같은 경우 데이터가 전부 load 되기 전에 메서드를 실행해 결과값에 오류가 생기는 경우가 있다.Selenium 은 동적 웹 사이트에 대한 지원을 진행하기 위해 명시적 기다림(Explicit Wait)과 암묵적 기다림(Implicit Wait)을 지원함.
- 암묵적 기다림 (Implicit) : 다 로딩이 될 때까지 지정한 시간 동안 기다림.
- 명시적 기다림 (Explicit) : 특정 요소에 대한 제약을 통한 기다림. 찾으려는 요소가 가져올 수 있을 때까지 기다리기.
XPath란 XML, HTML 문서 등의 요소의 위치를 경로로 표현하는 것을 의미한다.# 라이브러리 import
from selenium import webdriver
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://indistreet.com/live?sortOption=startDate%3AASC")
# 요소를 XPATH를 이용한 위치로 찾기
driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]')
# 10초동안 Implicit Wait을 진행하도록 해서 스크래핑이 잘 이루어지도록 수정해봅시다.
# 10초까지 기다리는데 완전한 응답이 온다면 다음걸로 넘어감.
from selenium.webdriver.support.ui import WebDriverWait
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("https://indistreet.com/live?sortOption=startDate%3AASC")
# 로딩이 전부 완료될때까지의 한계 시간을 10초 설정
driver.implicitly_wait(10)
print(driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]').text)
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")
# Explicit Wait으로 변경,
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/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):
element = driver.find_element(By.XPATH, '//*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[{}]/div/a/div[2]/p[1]'.format(i))
print(element.text)
웹 페이지에서 일어나는 일들을
Event라고 함. 마우스로 일어날 수 있는 대표적인 이벤트는 마우스 움직이기(move), 마우스 누르기(press down), 마우스 떼기(press up)등이 있다. 버튼을 찾은 후 이를 클릭하는 것을 구현하려면
- 입력하고자 하는 대상 요소 찾기 (
find_element())- 입력하고자 하는 내용을
click을 통해 전달..perform()을 통해 동작
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-header"]/header/section/div/div/div/a[1]')
# 클릭 실행
ActionChains(driver).click(button).perform()
위의 마우스 이벤트 처리와 동일하게 키보드 이벤트 또한 같은 방식으로 처리한다. 다른 점은
send_keys_to_element를 통해 입력하고자 하는 내용을 전달한다.
from selenium import webdriver
from selenium.webdriver import ActionChains
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
# driver를 이용해 해당 사이트에 요청을 보내봅시다.
import time
# 웹페이지 연결
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-header"]/header/section/div/div/div/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)
ESC : 명령모드
1.Y: Code Cell (코드 편집)
2.M: Markdown Cell (마크다운 으로 표현)
3.A: 현재 셀 위에 셀 만들기
4.B: 현재 셀 아래에 셀 만들기
5.dd: 현재 셀 삭제하기
Header: #, ##, ###italic: _ , *bold: __ , **~strikethrough: ~unordered list: - , ...ordered list: 1.