Post

자동화 방법[Selenium]

자동화 방법[Selenium]

🖥️ Selenium

Selenium은 웹 자동화 및 동적 크롤링을 지원하는 라이브러리임.
특히, JavaScript로 동적으로 변경되는 웹 페이지도 크롤링할 수 있다고 하는데…(난아직 몰라)

동적 크롤링이란?
URL이 변하지 않!!!으면서 내부 데이터가 JavaScript로 변경되는 웹 페이지를 크롤링하는 방식임.


🛠️ 설치 (Install)

Selenium을 사용하려면 먼저 설치한다!!(vscode기준으로 적을 예정)

1
pip install selenium  #이러면 설치 됨!! 됐음!!

🌍 WebDriver 다운로드

Selenium을 사용하려면 브라우저에 맞는 WebDriver가 필요함.

브라우저WebDriver 다운로드 링크
ChromeChromeDriver
FirefoxGeckoDriver
EdgeEdge WebDriver
Safari기본 내장 (macOS)

⚠️ WebDriver의 버전은 브라우저 버전과 맞아야 합니다!
chrome://settings/help에서 크롬 버전을 확인한 후, 동일한 버전의 ChromeDriver를 다운해 줘야한다.

📌 Selenium 기본 모듈

1
2
3
4
5
6
7
8
import selenium
from selenium import webdriver  # 브라우저 제어
from selenium.webdriver import ActionChains  # 연속 동작 수행 (예: 드래그 앤 드롭)
from selenium.webdriver.common.keys import Keys  # 키보드 입력 제어
from selenium.webdriver.common.by import By  # HTML 요소 탐색
from selenium.webdriver.support.ui import WebDriverWait  # 특정 요소가 나타날 때까지 대기
from selenium.webdriver.support import expected_conditions as EC  # 요소 상태 체크
#여기까지가 selenium 기본 셋팅임. 이렇게 깔아놓고 시작하는게 조아효

🌐 WebDriver를 이용해 웹 페이지 열기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Chrome WebDriver 실행
driver = webdriver.Chrome()

# 특정 URL 열기
driver.get("https://www.google.com")

# 현재 URL 가져오기
print(driver.current_url)

# 현재 웹 페이지의 제목 가져오기
print(driver.title)

# 브라우저 닫기
driver.close()

🔍 요소 찾기 및 조작하기

1️⃣ 검색창에 텍스트 입력

1
2
search_box = driver.find_element(By.CLASS_NAME, "검색창 클래스값") #요소를 먼저 찾아야 뭔들 가능함!! '요소이름' = driver.find_element(By.   국룰 ㅇㅋ?  
search_box.send_keys("Selenium 크롤링 테스트")                  # 이건 해당 요소에 입력이 필요 할 때 씀 send_keys  

2️⃣ 버튼 클릭

1
2
search_button = driver.find_element(By.CSS_SELECTOR, "버튼 태그.클래스값")    # 여기도 버튼의 요소를 먼저 찾는것 부터 시작임  
search_button.click()                                                       # 그런 다음에 버튼.click()  

📌 주요 메서드!! .send_keys(“텍스트”) → 입력창에 텍스트 입력
.click() → 버튼 클릭 하는거임
driver.find_element(By. → 요소를 찾는게 먼저!!
추가로 흔히 웹에서 입력 후 엔터 키로 작동이 가능한 환경이라면 .click() 대신 .submit() 을 사용해도 무관하다!!!


🔎 요소 탐색 방법 (find_element vs find_elements)

selenium 버전 달라짐에 따라 추가 됐다고 함!!!

✅ 단일 요소 찾기 (find_element)

탐색 방법예제 코드
By.IDfind_element(By.ID, "아이디값")
By.CLASS_NAMEfind_element(By.CLASS_NAME, "클래스값")
By.CSS_SELECTORfind_element(By.CSS_SELECTOR, "태그.클래스")
By.NAMEfind_element(By.NAME, "네임값")
By.XPATHfind_element(By.XPATH, "XPATH 표현식")
By.LINK_TEXTfind_element(By.LINK_TEXT, "링크 텍스트")
By.PARTIAL_LINK_TEXTfind_element(By.PARTIAL_LINK_TEXT, "일부 링크 텍스트")
By.TAG_NAMEfind_element(By.TAG_NAME, "태그명")

✅ 여러 요소 찾기 (find_elements) 여러 개의 요소를 리스트 형태로 가져올 수 있음.

1
2
3
4
elements = driver.find_elements(By.CLASS_NAME, "클래스값")     # 여러 항목을 가져올거라면 클래스로 하는게 나음  

for element in elements:
    print(element.text)  # 각 요소의 텍스트 출력

🔹 find_elements()는 리스트를 반환하므로, 반복문을 사용하여 각 요소를 접근해야…


📝 HTML 태그 내 텍스트 가져오기

특정 HTML 태그 안의 텍스트 내용을 추출하는 방법

1
2
3
4
5
6
7
titles = []  # 결과 저장 리스트
elements = driver.find_elements(By.CSS_SELECTOR, "태그.클래스값 or 클래스.아이디 도 가능")  

for element in elements:
    titles.append(element.text)  # 요소의 텍스트 가져오기

print(titles)  # 추출한 텍스트 출력

🔹 .text를 사용하면 해당 요소 안의 텍스트를 가져올 수 있다.


⏳ 대기 (Wait) - 웹페이지 로딩이 끝날 때까지 기다리기

웹 페이지가 완전히 로드되지 않아도 특정 요소가 나타날 때까지 기다릴 수 있습니다.
코드를 사용해 최대 10초 동안 요소가 나타날 때까지 대기.

1
2
3
4
5
6
7
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 특정 요소가 나타날 때까지 최대 10초 대기
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "대기할 요소 ID"))
)

WebDriverWait을 사용하면 페이지가 완전히 로드되지 않아도 필요한 요소가 나타날 때까지 기다릴 수 있음.

📝 팝업 창 조작

1
2
alert = driver.switch_to.alert
alert.accept()

브라우저에 나타난 JavaScript 경고창(Alert : 팝업창이라 이해하면 쉬움) 을 확인 (확인 버튼! 클릭) 함.
switch_to.alert 를 사용해 열린 JavaScript Alert 창을 조작하고, accept()는 확인 버튼 클릭하는 역할 함

📝 입력 취소,지우기

1
2
3
4
5
6
)
search_box = driver.find_element(By.ID, "search")   # 검색창 요소 찾기
search_box.send_keys("축구화")                       # 검색창에 축구화 입력
search_box.clear()                                  # 검색창 지우기  
search_box.send_keys("축구")                         # 검색창에 축구 입력  
search_box.submit()                                 # 검색창에서 바로 엔터 누름

clear() 메서드는 입력된 값을 삭제하는 기능을 함!!!

📝 검색 결과 검증!!

1
assert"축구"in search_results.text

assert 를 이용해 특정 텍스트가 검색 결과 내에 포함 되었는지 검증할 때 사용!!

📝 숨겨진 UI 요소 조작

1
2
3
4
5
# 숨겨진 입력창 찾기
hidden_input = driver.fin_element(By.ID,"hidden_input")

# 요소를 강제로 보이게 만들기
driver.execute_script("arguments[0].style.display = 'block';".hidden_input)

execute_script() 는 Selenium에서 JavaScript 코드를 실행할 수 있도록 해주는 메서드임
display: none 상태의 요소를 강제로 표시할 수도 있음!!


🎯 요약

✔ Selenium은 웹 자동화 및 동적 크롤링을 지원
✔ pip install selenium으로 설치 후, 웹 드라이버를 다운로드하여 실행
✔ find_element(By.X, “값”) → 특정 요소 찾기 및 조작
✔ WebDriverWait을 사용하면 페이지가 로드될 때까지 기다릴 수 있음
✔ .send_keys(), .click(), .text 등을 활용하여 입력, 클릭, 텍스트 가져오기 가능

일단 여기까지 이해가 된듯하다..휴


로그 설정을 위해

import logging

logging.basicConfig(
    level = logging.INFO,
    format = '%(asctime)s - %(levelname)s - %(message)s',
    filename = 'test.log'
)
logger = logging.getLogger(__name__)

여기까지 해 줘야 함..

This post is licensed under CC BY 4.0 by the author.