[데이터 엔지니어링 데브코스 2기] TIL-3주차-파트05 파이썬으로 웹 다루기(selenium)

이재호·2023년 10월 26일
0

1. Selenium

Selenium이란, Python을 이용해서 웹 브라우저를 조작할 수 있는 자동화 프레임워크입니다.

1-1. Selenium 및 webdriver

Python으로 웹 브라우저를 조작하기 위해서는, selenium 프레임워크뿐만 아니라 웹 브라우저를 제어할 수 있는 webdriver도 필요합니다. 따라서, 다음과 같은 프레임워크들을 install 해줍니다.

!pip install selenium # selenium 인스톨
!pip install webdriver-manager # webdriver

필요한 프레임워크 설치한 후, 다음과 같은 실습 코드를 진행합니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 현재 사용 중인 크롬 브라우저의 드라이버를 설치한 후,
# 해당 Service 객체를 통해 Chrome 웹 드라이버 객체를 생성한다.
driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()))

driver.get("URL링크") # 해당 웹 페이지의 get 메소드 요청.
driver.page_source # get 이후 받은 html 정보를 확인.

다만 위와 같이 실행할 경우, 웹 브라우저 창이 계속 열려있으므로 다음과 같이 with ~ as 구문으로 실행하는 방법도 있다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

with webdriver.Chrome(service = Service(ChromeDriverManager().install())) as driver:
	driver.get("URL링크")
    ...

1-2. driver 객체에서 특정 요소 추출하기.

By 라이브러리를 import하여 driver 객체에서 특정한 요소(들)를 추출할 수가 있습니다.

  • By : ID, CLASS, NAME ..
  • driver.find_element(By, "target") : By 특성값이 "target"인 요소 찾기.
  • driver.find_elements(By, "target") : By 특성값이 "target"인 요소들 찾기.

예시 코드는 다음과 같습니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

with webdriver.Chrome(service = Service(ChromeDriverManager().install())) as driver:
	driver.get("URL링크")
    
    element1 = driver.find_element(By.CLASS, "class1") # class 속성값이 "class1"인 요소 찾기.
    print(element1.text) # 요소1의 텍스트 출력.
    
    elements2 = driver.find_element(By.CLASS, "class2") # class 속성값이 "class2"인 요소들 찾기.
    for ele in elements2: # elements2에 있는 모든 요소 ele에 대해서
    	print(ele.text) # ele의 텍스트 출력.

2. Wait and Call

get 메서드를 호출하고 나서, 시간 지연(wait)을 하지 않고 다음 과정을 진행한다면 이전에 배웠던 requests와 마찬가지로 모든 데이터가 로딩되지 않은 상태의 정보를 받아올 수가 있습니다.
따라서, 해당 문제를 해결하기 위해서는 잠시 기다렸다가 데이터를 받아와야 합니다.

2-1. Implicit wait과 Explicit wait

  • Implicit wait : 모든 데이터가 로딩될 때까지 최대 N시간만 기다리겠다.
  • Explicit wait : 특정 요소가 로딩될 때까지 최대 N시간만 기다리겠다.

예시 코드는 다음과 같습니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait # wait 라이브러리
from selenium.webdriver.support import expected_conditions as EC # 특정 요소의 조건을 위한 EC 라이브러리

with webdriver.Chrome(service = Service(ChromeDriverManager().install())) as driver:
	driver.get("URL링크")
    
    # 1. Implicit wait
    driver.implicitly_wait(10) # 최대 10초 간 기다렸다가
	element1 = driver.find_element(By.ID, "id1") # driver 객체로부터 ID 특성 값이 "id1"인 요소를 찾겠다.
    
    # 2. Explicit wait
    element2 = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.Class, "class2")))
    # driver 객체로부터 최대 10초 간 (By.Class, "class2")를 타겟으로한 요소가 다 로딩될 때까지 기다렸다가
    # 해당 요소를 찾겠다.
    

2-2. XPath

XPath란, XML, HTML 문서 등의 요소의 위치를 경로로 표현하는 것을 의미합니다.

XPath를 활용해서 여러 요소들에 대한 연산을 유연하게 할 수가 있습니다.
해당 XPath는 개발자 도구에서, 타겟 요소 오른쪽 클릭 -> 복사 -> XPath 복사로 복사할 수 있습니다.

예시 코드는 다음과 같습니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

with webdriver.Chrome(service = Service(ChromeDriverManager().install())) as driver:
	driver.get("URL링크")
    driver.implicitly_wait(10)
    for i in range(1, 11)
    	element = driver.find_element(By.XPATH, f"복사한 XPath. 예) /../div{i}/..")

3. 마우스 이벤트 처리

selenium 프레임워크를 이용해서 마우스 이벤트 처리가 가능합니다.
이때, ActionChains 라는 라이브러리가 필요합니다.
ActionChains는 마우스 및 키보드와 같은 이벤트를 처리할 때 필요한 라이브러리로, 행동 순서를 입력할 때 사용됩니다.
예를 들어, 마우스 클릭을 하기 위해서 ActionChains에서는 다음과 같이 구현합니다.

ActionChains(driver).click(button). 다른 액션도 추가가능.. .perform()

예시 코드는 다음과 같습니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()))
driver.get("URL링크")
driver.implicitly_wait(10)

button = driver.find_element(By.ID, "password_btn")
ActionChains(driver).click(button).perform() # driver 객체에서 button 요소를 클릭하는 이벤트를 perform한다.

4. 키보드 이벤트 처리

selenium 프레임워크를 이용해서 키보드 이벤트 처리도 가능합니다.
마우스 이벤트 처리와 마찬가지로 ActionChains 라이브러리를 활용합니다.

from selenium import webdriver
from selenium.webdriver import ActionChains
from webdriver_manager.chrome import ChromeDriverManager
# 강의 자료에서는 해당 모듈들을 import 했지만, 굳이 import하지 않아도 동작됨.
# 아마, 옛날 버전에서는 import가 필요했던 것 같음.
# from selenium.webdriver.common.actions.action_builder import ActionBuilder
# from selenium.webdriver import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()))
driver.get("URL링크")
driver.implicitly_wait(10)

input_id = driver.find_element(By.ID, "email")
input_password = driver.find_element(By.ID, "password")
ActionChains(driver).send_keys_to_element(input_id, "email@email.com").perform() # id 입력.
ActionChains(driver).send_keys_to_element(input_password, "password123").perform() # 패스워드 입력.
profile
천천히, 그리고 꾸준히.

0개의 댓글