본문 바로가기
Python

Python Selenium으로 동적 웹페이지 크롤링 완전 정복 (기초편)

by ramzee 2025. 3. 30.

0. 이 글은 무엇을 위한 글인가요?

  • requests로는 안 보이던 데이터를 크롤링하고 싶은 분
  • 자바스크립트로 로딩되는 웹페이지도 수집하고 싶은 분
  • Selenium으로 브라우저 자동 제어를 해보고 싶은 분

Selenium은 사람처럼 웹사이트를 조작하며 데이터를 수집할 수 있는 도구입니다.


1. Selenium이란?

  • 웹 브라우저를 자동으로 실행하고, 검색하고, 클릭할 수 있는 도구
  • 무한 스크롤, 로그인 필요, 동적 콘텐츠 크롤링에 적합

2. 설치 및 준비

2-1. 패키지 설치
pip install selenium
2-2. ChromeDriver 설치
  1. 크롬 주소창에 chrome://settings/help 입력하여 버전 확인
  2. 아래 사이트에서 같은 버전의 ChromeDriver 다운로드
    https://chromedriver.chromium.org/downloads
  3. 압축을 풀고 chromedriver.exe를 파이썬 파일과 같은 폴더에 두기

3. 기본 코드 흐름

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 브라우저 실행
driver = webdriver.Chrome()
driver.get('https://news.naver.com/')
time.sleep(2)  # 페이지 로딩 대기

# 뉴스 블록들 모두 찾기
news_blocks = driver.find_elements(By.CSS_SELECTOR, 'div.comp_news_feed')

# 제목+링크 저장용 리스트
titles = []

# 각 뉴스 블록에서 메인 뉴스 + 하위 뉴스 추출
for block in news_blocks:
    try:
        # 메인 뉴스 제목과 링크
        main_tag = block.find_element(By.CSS_SELECTOR, 'a.cnf_news_area')
        main_title = block.find_element(By.CSS_SELECTOR, 'strong.cnf_news_title').text.strip()
        main_link = main_tag.get_attribute('href')
        titles.append((main_title, main_link))
    except:
        pass

    try:
        # 하위 뉴스들
        sub_tags = block.find_elements(By.CSS_SELECTOR, 'a.cnf_news')
        for tag in sub_tags:
            sub_title = tag.text.strip()
            sub_link = tag.get_attribute('href')
            if sub_title:
                titles.append((sub_title, sub_link))
    except:
        pass

driver.quit()

4. 출력 예시


서울, 오늘 오후부터 눈…퇴근길 불편 우려
중국 ‘양회’ 개막…경제성장률 5% 유지할까
美·EU, 전기차·배터리 갈등 해소 노력
...

5. 크롤링한 데이터 DataFrame으로 정리

import pandas as pd

# 제목+링크로 리스트 생성
news_list = [{'제목': title, '링크': link} for title, link in titles]

# DataFrame 생성
df = pd.DataFrame(news_list)
print(df.head())
출력 예시

          제목                          링크
"고속도로에 타조가 뛰어다녀요"..소방당국, 마취총 쏴 포획   https://n.news.naver.com/article/660/0000081842
여수 시내 주행 중 람보르기니 불.."엔진룸에서 시작"      https://n.news.naver.com/article/660/0000081854
...

6. 옵션 설정 (브라우저 안 띄우기)

Headless 모드 설정

from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')

driver = webdriver.Chrome(options=options)

7. 자주 쓰는 기능 요약

기능 코드
웹 열기 driver.get(url)
요소 찾기 find_element, find_elements
텍스트 추출 element.text.strip()
링크 추출 element.get_attribute('href')
대기 time.sleep(초)
브라우저 종료 driver.quit()

8. 결과 저장하기


df.to_csv('selenium_뉴스.csv', index=False, encoding='utf-8-sig')

Excel에서 열어도 한글이 깨지지 않도록 utf-8-sig 사용합니다.


9. 마무리 요약

  • Selenium은 실제 브라우저처럼 작동하며 동적 페이지도 수집 가능
  • 자바스크립트로 생성되는 데이터도 접근 가능
  • 입력, 클릭, 스크롤, 로그인 등 사람처럼 행동 가능