[Python] 동적 웹 크롤링을 위한 Selenium




동적 웹 페이지에서 데이터를 수집하기 위해서는 Selenium과 같은 자동화 라이브러리를 사용해야 합니다. 이번 포스트에서는 Python의 Selenium 라이브러리를 사용하여 동적 웹 페이지에서 데이터를 수집하는 재사용 가능한 함수를 만들어 보겠습니다.


동적 웹 크롤링

동적 웹 페이지는 클라이언트 측에서 JavaScript를 사용하여 렌더링 되는 웹 페이지입니다. 이러한 웹 페이지에서 데이터를 수집하려면, Selenium과 같은 자동화 라이브러리를 사용해야 합니다. Python의 Selenium 라이브러리는 다양한 웹 브라우저를 지원하므로, Chrome, Firefox, Safari 등 다양한 웹 브라우저에서도 동적 웹 페이지를 수집할 수 있습니다.


Selenium이란?

Selenium은 웹 애플리케이션을 자동화하기 위한 프레임워크입니다. Python에서 Selenium을 사용하면 웹 페이지에서 자동으로 작업을 수행할 수 있습니다. 이를 통해 웹 페이지에서 데이터를 수집하거나, 웹 브라우저 기반으로 작동하는 애플리케이션을 자동으로 테스트하거나, 웹 기반 UI 테스트를 수행할 수 있습니다.


환경 준비

크롬 드라이버 설치

  • 크롬 브라우저에서 chrome://settings/help 주소를 입력하여 버전을 확인합니다.
  • 크롬 버전에 맞는 드라이버를 다운로드 받습니다.
  • 크롬 드라이버 다운로드 사이트는 아래와 같습니다.
  • https://chromedriver.chromium.org/downloads
  • ex) 113.0.5672.64 버전에 대한 드라이버를 다운로드 받습니다.
  • ex) https://chromedriver.storage.googleapis.com/index.html?path=113.0.5672.63/
  • 윈도우 기준으로 chromedriver_win32.zip 파일을 다운로드 받고 압축을 해제 합니다.
  • 압축 해제하면 나오는 실행 파일(chromedriver.exe)를 c:\Windows 폴더 아래로 복사를 합니다.
  • Windows 폴더 하위에 드라이버를 위치할 경우 실제 코드 상에서 ‘# Chrome WebDriver 경로 설정’ 부분은 사용하지 않아도 됩니다.

Selenium 설치

pip install selenium

Selenium 기본 코드

아래는 Selenium 라이브러리를 사용하여 동적 웹 페이지에서 데이터를 수집하는 Python 기본 코드 입니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def dynamic_web_crawler(url, xpath):
    # Chrome WebDriver 경로 설정 (c:\Windows 경로에 드라이버가 없을 경우 사용)
    # webdriver_service = Service('경로/chromedriver')

    # Chrome 옵션 설정
    options = Options()
    options.add_argument('--headless')  # 브라우저 창 숨기기

    # WebDriver 객체 생성
    driver = webdriver.Chrome(service=webdriver_service, options=options)

    try:
        # 웹 페이지로 이동
        driver.get(url)

        # 웹 페이지가 로드될 때까지 대기
        wait = WebDriverWait(driver, 10)
        wait.until(EC.presence_of_element_located((By.XPATH, xpath)))

        # 데이터 수집
        elements = driver.find_elements(By.XPATH, xpath)
        data = [element.text for element in elements]

        return data

    finally:
        # WebDriver 종료
        driver.quit()

코드 실행

dynamic_web_crawler () 함수에 url, xpath 인자를 넘겨서 실행 할 수 있습니다.

샘플로 실행한 결과는 아래와 같습니다.

# Q-net 기출문제 리스트 URL
url = 'https://www.q-net.or.kr/cst006.do?id=cst00601&code=1203&gSite=Q&gId='
xpath = '//*[@id="viewList"]/div[1]/table/tbody/tr'

dynamic_web_crawler(url, xpath)

실행 결과

DevTools listening on ws://127.0.0.1:51861/devtools/browser/b8f30adf-2ca8-4727-ba39-59e612f9e8d2
['1 제129회 화공안전기술사 문제지 기술자격출제실 .. 2023.02.06', '2 제129회 해양기술사 문제지 기술자격출제실 .. 2023.02.06', '3 제129회 항만및해안기술사 문제지 기술자격출제실 .. 
2023.02.06', '4 제129회 표면처리기술사 문제지 기술자격출제실 .. 2023.02.06', '5 제129회 포장기술사 문제지 기술자격출제실 .. 2023.02.06', '6 제129회 토질및기초기술사 문제지 기술자
격출제실 .. 2023.02.06', '7 제129회 토목품질시험기술사 문제지 기술자격출제실 .. 2023.02.06', '8 제129회 토목시공기술사 문제지 기술자격출제실 .. 2023.02.06', '9 제129회 토목구조기
술사 문제지 기술자격출제실 .. 2023.02.06', '10 제129회 컴퓨터시스템응용기술사 문제지 기술자격출제실 .. 2023.02.06']

데이터를 잘 가져온 것을 확인할 수 있습니다.


마치며

python 언어에서 selenium 라이브러리를 사용하여 동적 웹을 크롤링 할 수 있는 것을 확인할 수 있었습니다.

이로써 정적 웹은 물론 동적 웹까지 데이터 크롤링을 할 수 있고 웹 환경의 모든 데이터를 정적 페이지 크롤링, 동적 페이지 크롤링, Open API 활용 등을 이용하여 수집할 수 있겠습니다.




Leave a Comment