Selenium
- python을 사용해 웹 브라우저 조작을 자동화 할 수 있는 프레임워크
- 크롬 (구글), 파이어폭스, 사파리, 엣지( MS) 등이 가능
- 셀레니움은 실제 사람과 비슷하게 동작하여 많은 정보들을 수집 가능
Selenium 설치
pip install selenium
Web Driver 설치
- 웹 브라우저를 제어할 수 있는 자동화 프레임 워크
pip install Webdriver-manager
Selenium 시작
# webdriver 모듈 불러오기
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# webdriver 를 사용하여 Chrome() 객체 생성
# 객체 생성 후 driver를 사용해 요청 보내기
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("원하는 URL")
# page_source를 사용해 HTML 문서 확인
print(driver.page_source)
위와 같이 진행 했을 때 chrome 브라우저가 계속 켜져 있음!
이유는 브라우저 창을 끄라는 명령을 내려준 적이 없기 때문.
따라서, 아래와 같이 with-as 구문을 사용해 driver를 종료하도록 설정 가능
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("원하는 URL")
print(driver.page_source)
Driver에서 특정 요소 추출하기
- .find_element(by, target) - 요소 하나 찾기
- by : 대상을 찾는 기준 - ID, TAG_NAME, CLASS_NAME ...
- target : 대상의 속성
- .find_elements(by, target)
- by : 대상을 찾는 기준 - ID, TAG_NAME, CLASS_NAME ...
- target : 대상의 속성
# p 태그에 해당하는 요소 하나 찾기
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("원하는 URL")
driver.find_element(By.TAG_NAME, "p")
print(driver.find_element(By.TAG_NAME, "p").text)
# p 태그에 해당하는 요소 여러개 찾기
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("원하는 URL")
driver.find_element(By.TAG_NAME, "p")
for element in driver.find_elements(By.TAG_NAME, "p"):
print("Text", element.text)
XPath를 사용해 요소 추출하기
- XML, HTML 문서 등의 요소의 위치를 경로로 표현하는 것을 의미
- 컴퓨터를 예로 들면 Desktop/폴더1/폴더1-1/file 과 같은 형식
- 스크래핑 하고자 하는 class의 이름을 방지할 목적으로 적혀있을 때 사용
- Ex_) //*[@id="__next"]/div/main/div[2]/div/div[4]/div[1]/div[1]/div/a/div[2]/p[1]
# XPath를 사용하여 하나의 요소 추출
from selenium.webdriver.support.ui import WebDriverWait
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("원하는 URL")
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)
# XPath를 사용하여 여러개의 요소 추출
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("원하는 URL")
driver.implicitly_wait(10)
for i in range(1, 11): # 1~10
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)
- implict Wait - 찾고자 하는 요소가 로드될 때까지 지정한 시간만큼 대기할 수 있도록 설정
# 10초까지 기다리겠다는 의미
driver.implicitly_wait(10)
- explict wait - 명시적으로 대기하도록 설정
- EC.presence_of_element_lacted()를 사용하여 설정
with webdriver.Chrome(service=Service(ChromeDriverManager().install())) as driver:
driver.get("원하는 URL")
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)
마우스 사용하기
- 입력하고자 하는 내용을 .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("원하는 웹사이트")
driver.implicitly_wait(0.5)
# 해당 CLASS_NAME은 예제이므로 원하는 요소 별 변경 필요
button = driver.find_element(By.CLASS_NAME, "UtilMenustyle__Link-sc-2sjysx-4.ewJwEL")
ActionChains(driver).click(button).perform()
키보드 사용하기
- 입력하고자하는 내용을 send_keys_to_element를 통해 전달
- .perform()을 통해 동작
# 주어진 웹 사이트에서, 원하는 요소를 키보드처럼 입력하기
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 = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("원하는 웹 사이트)
# 입력하고자 하는 입력창을 클릭
button = driver.find_element(By.CLASS_NAME, "입력하고자 하는 곳의 CALSS_NAME")
ActionChains(driver).click(button).perform()
# ID 입력
id_input = driver.find_element(By.CLASS_NAME, "ID 입력 칸의 CLASS_NAME")
Actionchains(driver).send_keys_to_element(id_input, "아이디 입력").perform()
# PW 입력
pw_input = driver.find_element(By.CLASS_NAME, "pw 입력 칸의 CLASS_NAME")
Actionchains(driver).send_keys_to_element(pw_input, "비밀번호 입력").perform()
# 로그인 누르고 로그인
login_button = driver.find_element(By.CLASS_NAME, "로그인 버튼 CLASS_NAME")
ActionChains(driver).click(login_button).perform()
728x90
'ssung_데이터 엔지니어링 > 2주차_파이썬으로 웹 다루기' 카테고리의 다른 글
Seaborn - 스크래핑 결과 시각화 (1) | 2023.10.27 |
---|---|
HTML Parser, BeautifulSoup (0) | 2023.10.25 |
웹 스크래핑과 웹 크롤링 (0) | 2023.10.24 |
HTML (Hypertext Markup Language) (2) | 2023.10.23 |