업데이트:

Selenium 이용한 웹 스크래핑 방법, 웹 자동화

Selenium 가이드: 웹 자동화

1. Selenium 이란?

Selenium은 웹 브라우저 자동화를 위한 아래와 같은 용도

  • 웹 애플리케이션 테스트 자동화
  • 웹 스크래핑 및 데이터 추출
  • 반복적인 웹 작업 자동화
  • 크로스 브라우저 테스팅

주요 기능

  • 브라우저 제어: 다양한 브라우저에서 웹 페이지를 자동으로 로드하고 조작할 수 있습니다.
  • DOM 조작: 웹 페이지의 DOM 요소를 검색하고 조작할 수 있습니다.
  • 폼 자동화: 폼을 자동으로 작성하고 제출할 수 있습니다.
  • 스크린샷 캡처: 웹 페이지의 스크린샷을 캡처할 수 있습니다.
  • 헤드리스 모드: 브라우저 창을 띄우지 않고 백그라운드에서 작업을 수행할 수 있습니다.

Selenium은 다양한 프로그래밍 언어를 지원하며, 웹 개발자와 QA 엔지니어들에게 필수적인 도구로 사용

2. 지원하는 웹 드라이버 종류

Selenium은 다양한 웹 브라우저를 지원합니다. 주요 웹 드라이버는 다음과 같습니다:

  • ChromeDriver (Google Chrome)
  • GeckoDriver (Mozilla Firefox)
  • EdgeDriver (Microsoft Edge)
  • SafariDriver (Apple Safari)
  • IEDriverServer (Internet Explorer)

각 브라우저의 버전에 맞는 웹 드라이버를 설치해야 합니다.

3. 기본적인 웹 페이지 호출 방법 (Chrome 드라이버 사용)

$ pip install selenium webdriver_manager

Chrome 드라이버를 사용하여 웹 페이지를 호출하는 기본적인 Python 코드는 다음과 같습니다:

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

## WebDriver 객체 생성
## ChromeDriverManager().install():
##   webdriver_manager 라이브러리는 현재 시스템과 호환되는 ChromeDriver 버전을 찾아서 다운로드
##   다운로드된 ChromeDriver 파일은 로컬에 저장되며, 해당 파일의 경로를 반환
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

## 웹 페이지 열기
driver.get('https://www.example.com')

## 브라우저 종료
driver.quit()

]

4. DOM 을 찾기 위한 find_elements 사용법

Selenium은 다양한 방법으로 웹 요소를 찾을 수 있습니다. 주요 메서드는 다음과 같습니다:

메서드 설명
find_element(By.ID, 'id') ID 속성으로 요소 찾기
find_element(By.NAME, 'name') name 속성으로 요소 찾기
find_element(By.XPATH, 'xpath') XPath로 요소 찾기
find_element(By.CSS_SELECTOR, 'css_selector') CSS 선택자로 요소 찾기
find_element(By.CLASS_NAME, 'class_name') 클래스 이름으로 요소 찾기
find_element(By.TAG_NAME, 'tag_name') HTML 태그 이름으로 요소 찾기
find_element(By.LINK_TEXT, 'link_text') 링크 텍스트로 요소 찾기
find_element(By.PARTIAL_LINK_TEXT, 'partial_link_text') 부분적인 링크 텍스트로 요소 찾기
  • By.ID는 가장 빠르고 신뢰할 수 있는 방법이지만, 모든 요소에 고유한 ID가 있는 것은 아닙니다.
  • By.XPATH는 매우 유연하지만, 복잡한 XPath는 성능에 영향을 줄 수 있습니다.
  • By.CSS_SELECTORBy.XPATH보다 일반적으로 더 빠르고 읽기 쉽습니다.
  • By.LINK_TEXTBy.PARTIAL_LINK_TEXT는 특히 네비게이션 테스트에 유용합니다.

예시

from selenium.webdriver.common.by import By

## ID로 요소 찾기
element = driver.find_element(By.ID, 'search-input')

## 여러 요소 찾기
# 1. ID로 요소 찾기
elements_by_id = driver.find_elements(By.CSS_SELECTOR, '#example-id')
for element in elements_by_id:
    print(f"ID: {element.text}")

# 2. 클래스명으로 요소 찾기
elements_by_class = driver.find_elements(By.CSS_SELECTOR, '.example-class')
for element in elements_by_class:
    print(f"Class: {element.text}")

# 3. 태그명으로 요소 찾기
elements_by_tag = driver.find_elements(By.CSS_SELECTOR, 'div')
for element in elements_by_tag:
    print(f"Tag: {element.text}")

# 4. 계층 구조로 요소 찾기 (자식 요소)
elements_by_hierarchy = driver.find_elements(By.CSS_SELECTOR, 'div > p')
for element in elements_by_hierarchy:
    print(f"Hierarchy (child): {element.text}")

# 5. 계층 구조로 요소 찾기 (후손 요소)
elements_by_descendant = driver.find_elements(By.CSS_SELECTOR, 'div p')
for element in elements_by_descendant:
    print(f"Hierarchy (descendant): {element.text}")

# 6. 여러 클래스 조합으로 요소 찾기
elements_by_multiple_classes = driver.find_elements(By.CSS_SELECTOR, '.class1.class2')
for element in elements_by_multiple_classes:
    print(f"Multiple Classes: {element.text}")

# 7. 속성 값으로 요소 찾기
elements_by_attribute = driver.find_elements(By.CSS_SELECTOR, '[attribute-name="value"]')
for element in elements_by_attribute:
    print(f"Attribute: {element.text}")

5. 주요 DOM 조작 기능

find_elements 메서드를 사용하여 여러 요소가 조회되면 모든 일치하는 요소를 리스트(배열)로 처리 해야함

click() : 요소를 클릭

button = driver.find_element(By.ID, 'submit-button')
button.click()

send_keys() : 텍스트를 입력

input_field = driver.find_element(By.NAME, 'username')
input_field.send_keys('myusername')

text : 요소의 텍스트

paragraph = driver.find_element(By.CLASS_NAME, 'content')
print(paragraph.text)

get_attribute : 요소의 속성 값을 가져옵니다.

link = driver.find_element(By.TAG_NAME, 'a')
href = link.get_attribute('href')

6. Headless 모드 및 기타 옵션

Headless 모드는 GUI 없이 브라우저를 실행하는 방법으로 서버 환경이나 백그라운드 작업에 유용

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

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu') # 필요한 경우
chrome_options.add_argument('user-agent=Mozilla/5.0 ...') # User-Agent 설정

driver = driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.get('https://example.com')

print(driver.title)

driver.quit()

기타 유용한 옵션:

  • --start-maximized: 브라우저를 최대화하여 시작
  • --disable-extensions: 확장 프로그램 비활성화
  • --disable-gpu: GPU 하드웨어 가속 비활성화
  • --no-sandbox: 샌드박스 비활성화 (주의: 보안상 위험할 수 있음)
  • window-size=1200x600: 브라우저 창 크기 설정
  • user-agent=Mozilla/5.0 ...: User-Agent 설정

댓글남기기