웹 크롤링

1. 웹 크롤링이란? (기본 개념)

  • 웹 크롤러 (Web Crawler / Spider): 자동화된 방식으로 웹페이지를 돌아다니며 링크를 따라 문서를 수집하는 프로그램입니다.

  • 웹 스크레이핑 (Web Scraping): 수집된 웹페이지 문서에서 사용자가 원하는 특정 데이터(예: 상품 가격, 뉴스 기사, 주가 등)를 정밀하게 추출하는 작업입니다. (일반적으로 이 두 용어는 혼용되어 사용됩니다.)

2. 웹 크롤링의 핵심 원리: HTML과 DOM 구조 이해

웹 크롤러는 브라우저가 웹페이지를 렌더링하는 원리와 동일하게 작동합니다. 데이터를 추출하기 위해서는 웹페이지의 기본 뼈대가 되는 HTML(HyperText Markup Language)과 요소의 위치를 특정하는 CSS Selector 및 XPath에 대한 이해가 필수적입니다.

  • 태그(Tag): 데이터가 담긴 상자 역할 (<div>, <p>, <a>, <table> 등)

  • 속성(Attributes): 태그의 상세 정보를 담고 있는 속성 (class, id, href 등)

3. 파이썬 웹 크롤링 핵심 라이브러리

파이썬은 웹 크롤링에 최적화된 강력한 라이브러리 생태계를 제공합니다.

A. 정적 크롤링 (Static Crawling)

  • Requests: 웹서버에 HTTP 요청을 보내고 HTML 소스코드를 가져오는 데 가장 널리 쓰이는 라이브러리입니다.

  • BeautifulSoup (bs4): 가져온 HTML 문서에서 원하는 태그와 데이터를 쉽게 파싱(추출)할 수 있도록 돕는 라이브러리입니다.

  • 적용 대상: JavaScript로 동적으로 로딩되지 않고, 페이지 소스 보기에 HTML이 그대로 드러나는 정적 웹사이트.

B. 동적 크롤링 (Dynamic Crawling)

  • Selenium / Playwright: 실제 웹 브라우저(Chrome, Edge 등)를 코드로 제어하여 마우스 클릭, 스크롤, 로그인 등 사용자의 상호작용이 필요한 동적 페이지를 크롤링할 수 있게 해줍니다.

  • 적용 대상: JavaScript를 통해 비동기로 데이터가 로딩되거나(AJAX), 무한 스크롤, 로그인 인증이 필요한 웹사이트.

4. 파이썬 웹 크롤링 단계별 실습 가이드

① 정적 크롤링 기본 예제 (Requests + BeautifulSoup)

import requests
from bs4 import BeautifulSoup

# 1. 웹페이지에 HTTP GET 요청
url = 'https://example.com/blog'
response = requests.get(url)

if response.status_code == 200:
    # 2. BeautifulSoup 객체 생성
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # 3. CSS Selector를 이용해 원하는 요소 추출
    titles = soup.select('h2.post-title')
    
    for title in titles:
        print(title.text.strip())
else:
    print(f"웹페이지 요청 실패: {response.status_code}")

② 동적 크롤링 기본 예제 (Selenium)

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

# 1. 브라우저 드라이버 실행
driver = webdriver.Chrome()

try:
    # 2. 웹페이지 접속
    driver.get('https://example.com/dynamic-page')
    time.sleep(2) # 페이지 로딩 대기
    
    # 3. 동적으로 생성된 요소 찾기
    items = driver.find_elements(By.CSS_SELECTOR, '.item-card')
    
    for item in items:
        print(item.text)
finally:
    # 4. 브라우저 종료
    driver.quit()

5. 웹 크롤링 시 주의해야 할 법적·윤리적 가이드라인

웹 데이터를 수집할 때는 기술적인 구현뿐만 아니라 법적, 윤리적 기준을 준수하는 것이 매우 중요합니다.

  1. robots.txt 준수 확인:

    • 웹사이트 주소 뒤에 /robots.txt를 입력하면(예: [https://example.com/robots.txt](https://example.com/robots.txt)) 해당 사이트가 크롤러에게 허용하는 경로와 제한하는 경로를 확인할 수 있습니다. 이를 존중해야 합니다.

  2. 서버 부하 방지 (Rate Limiting):

    • 너무 빠른 속도로 수많은 요청을 보내면 타겟 웹서버에 과부하를 주어 서비스 거부(DoS) 상태를 유발할 수 있습니다. time.sleep() 등을 활용해 요청 사이에 간격을 두어야 합니다.

  3. 저작권 및 개인정보 보호:

    • 수집한 데이터를 무단으로 상업적 재판매하거나, 개인정보(연락처, 이메일 등)를 동의 없이 수집·가공하는 경우 법적 처벌을 받을 수 있습니다.

  4. API 우선 활용:

    • 대상 웹사이트가 공식 Open API를 제공하는 경우, 크롤링보다 API를 사용하는 것이 훨씬 안정적이고 합법적인 데이터 수집 방법입니다.