본문 바로가기

Server Story....

파이썬 셀레니움(Selenium): 동적 웹 데이터 수집 자동화 가이드

반응형

동적 웹 데이터 수집



1. 도입 및 배경 (Why?) 💡

우리가 운영하는 에이전트가 매일 똑같은 소리만 한다면 독자들은 금방 실망할 것입니다. 😅 진정한 자동화 에이전트는 실시간 트렌드를 읽고, 뉴스나 커뮤니티의 반응을 수집하여 글의 소재로 삼아야 합니다.

하지만 요즘 대부분의 웹사이트는 '자바스크립트'로 동적 로딩이 되기 때문에, 단순한 방식으로는 데이터를 긁어올 수 없습니다.

그래서 오늘은 브라우저를 직접 조종하는 **셀레니움(Selenium)**을 활용해, 사람이 직접 웹서핑을 하는 것처럼 정교하게 데이터를 수집하는 기술을 마스터해 보겠습니다.


2. 크롤링 작동 원리 (What?) 🏗️

셀레니움은 '웹 드라이버'라는 대리인을 통해 실제 브라우저(Chrome 등)를 실행하고, 버튼 클릭이나 스크롤 같은 동작을 수행합니다.

Plaintext
 
  [ My Python Script ] ----(명령)----> [ Chrome Driver ]
                                          |
          +-------------------------------+
          |
          v
  [ Target Website ] <----(제어)---- [ Chrome Browser ]
          |
          +----(데이터 추출)----> [ 정제된 데이터 (CSV/DB) ]

3. 사전 준비: Headless 환경 구축 🛠️

우리의 서버는 화면이 없는 리눅스(CLI) 환경입니다. 따라서 브라우저를 띄우지 않고 백그라운드에서 실행하는 'Headless' 설정이 핵심입니다.

■ 필수 패키지 설치 (Ubuntu 기준)

Bash
 
# 1. 크롬 브라우저 설치
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install ./google-chrome-stable_current_amd64.deb -y

# 2. 셀레니움 라이브러리 설치
pip3 install selenium webdriver-manager

4. 핵심 코드: 실시간 데이터 수집 (Step-by-Step) 🐍

이제 특정 사이트의 제목과 링크를 긁어오는 표준 코드를 작성해 보겠습니다.

■ crawler_agent.py

Python
 
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

# 1. 크롬 옵션 설정 (서버 환경용)
chrome_options = Options()
chrome_options.add_argument("--headless")  # 화면 없이 실행
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("user-agent=Mozilla/5.0 ...") # 사람처럼 보이게 설정

# 2. 드라이버 실행
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

def collect_trends(url):
    try:
        driver.get(url)
        time.sleep(3) # 페이지 로딩 대기 (중요!)

        # 3. 데이터 추출 (CSS Selector 활용)
        titles = driver.find_elements(By.CSS_SELECTOR, "h3.title")
        
        results = []
        for item in titles:
            results.append(item.text)
            
        return results

    finally:
        driver.quit() # 자원 반납 (안 하면 서버 메모리 폭발!)

if __name__ == "__main__":
    target_url = "https://news.google.com" # 예시 주소
    data = collect_trends(target_url)
    print(f"✅ 수집된 데이터: {data[:5]}")

5. 트러블슈팅: 당신이 마주칠 삽질 기록 🛠️

🚨 에러: SessionNotCreatedException (버전 불일치)

  • 원인: 설치된 크롬 브라우저와 드라이버의 버전이 맞지 않을 때 발생합니다.
  • 해결: 위 코드처럼 webdriver-manager를 사용하면 자동으로 최신 버전을 맞춰주므로 해결됩니다.

🚨 에러: 크롤링을 차단당했어요! (403 Forbidden)

  • 원인: 너무 빠른 요청은 봇으로 간주되어 IP가 차단될 수 있습니다.
  • 해결: time.sleep()으로 무작위 지연 시간을 주거나, User-Agent 값을 실제 브라우저 정보로 정교하게 설정해야 합니다.

🔍 더 알아보기

이 시스템과 연동되는 다른 가이드가 궁금하다면, 제 블로그 검색창에 아래 키워드를 입력해 보세요!

  • "Docker" : 이 크롤러를 도커 이미지로 만들어 무중단 가동하는 법
  • "Slack 알림" : 목표로 한 키워드가 발견되었을 때 즉시 알림 받는 법
  • "MSSQL" : 수집된 데이터를 안전하게 DB에 저장하고 분석하는 법

. . .

반응형