ssung_데이터 엔지니어링/2주차_파이썬으로 웹 다루기

Selenium 설치 및 사용법

ssungcohol 2023. 10. 26. 16:54

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