웹 크롤링(Web Crawling) 기본 개념 정리

yeahcold·2025년 3월 20일
0

Data Engineering

목록 보기
8/20

웹 크롤링은 웹에서 원하는 데이터를 자동으로 수집하는 기술입니다.
보통 크롤링 방식은 정적 크롤링(Static Crawling)동적 크롤링(Dynamic Crawling)으로 나뉘며,
웹 페이지의 렌더링 방식(CSR vs SSR)에 따라 접근 방식이 달라집니다.


🔹 1. 정적 크롤링(Static Crawling) 🏗️

정적 크롤링은 HTML 소스 코드 내에 원하는 데이터가 포함되어 있을 때 사용합니다.
즉, 페이지를 열었을 때 개발자 도구(F12) → Elements에서 데이터를 바로 확인할 수 있는 경우입니다.

주요 특징

✔ 서버에서 이미 HTML을 완성해서 내려줌
✔ JavaScript를 실행할 필요 없음
BeautifulSoup을 활용하여 HTML을 파싱

🛠 사용 예시 (BeautifulSoup)

import requests
from bs4 import BeautifulSoup

# 크롤링할 URL
url = "https://example.com"

# 페이지 요청
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

# 원하는 데이터 추출
title = soup.find("h1").text
print("페이지 제목:", title)

📌 사용할 수 있는 경우

  • 블로그, 뉴스 사이트, 위키 등 페이지 내에 데이터가 고정적으로 존재하는 경우
  • 로그인 없이 접근 가능한 공공 데이터 크롤링
  • HTML 내 div, span, table 등에 데이터가 직접 존재하는 경우

🔹 2. 동적 크롤링(Dynamic Crawling) 🏎️

일부 웹사이트는 보안 정책 또는 기술적 이유로 데이터를 직접 노출하지 않습니다.
이 경우, Selenium을 활용해 브라우저를 직접 조작하여 데이터를 가져와야 합니다.

주요 특징

✔ JavaScript가 렌더링한 후 데이터를 가져와야 하는 경우
로그인이 필요한 사이트 또는 클릭 후 데이터가 나타나는 경우
Selenium을 사용하여 크롬 브라우저를 띄워 클릭, 스크롤 등의 동작 수행

🛠 사용 예시 (Selenium)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

# ChromeDriver 경로 설정
service = Service("/path/to/chromedriver")
driver = webdriver.Chrome(service=service)

# 웹사이트 접속
driver.get("https://example.com/login")

# 로그인 (예시)
driver.find_element(By.NAME, "username").send_keys("my_id")
driver.find_element(By.NAME, "password").send_keys("my_password")
driver.find_element(By.ID, "login-button").click()

# 대시보드 이동 후 데이터 크롤링
driver.get("https://example.com/dashboard")
data = driver.find_element(By.CLASS_NAME, "data-class").text
print("크롤링 데이터:", data)

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

📌 사용할 수 있는 경우

  • 로그인이 필요한 사이트 (예: 인터넷 쇼핑몰 관리자 페이지, 마이페이지 등)
  • JavaScript를 통해 동적으로 데이터를 불러오는 사이트
  • 사용자가 특정 버튼을 클릭해야 데이터가 로딩되는 경우

🔹 3. CSR vs SSR 📊

웹사이트는 데이터를 클라이언트에게 전달하는 방식에 따라 CSR(Client-Side Rendering)SSR(Server-Side Rendering)으로 나뉩니다.

✅ CSR(Client-Side Rendering)

클라이언트(브라우저)에서 JavaScript를 실행하여 데이터를 가져와 화면을 렌더링하는 방식

✔ HTML 문서는 기본적인 틀만 있고, JavaScript가 API를 호출해 데이터를 가져옴
✔ 개발자 도구 Network → XHR에서 API 요청을 확인 가능
✔ 크롤링 시, Selenium을 사용하거나 API 직접 호출 필요

🛠 CSR 예제 (API 직접 호출)

import requests

# API 요청 (개발자 도구 → Network에서 확인한 API)
api_url = "https://example.com/api/data"
headers = {"Authorization": "Bearer my_token"}

response = requests.get(api_url, headers=headers)
data = response.json()

print("API 데이터:", data)

✅ SSR(Server-Side Rendering)

서버에서 HTML을 완성한 후, 클라이언트에 전달하는 방식

✔ 브라우저에서 HTML을 열었을 때 개발자 도구 Elements에서 데이터 확인 가능
BeautifulSoup 같은 라이브러리로 크롤링 가능


🔹 4. 크롤링 방식 정리 📝

방식필요 도구특징사용 예시
정적 크롤링BeautifulSoupHTML 내 데이터가 직접 존재뉴스 사이트, 블로그
동적 크롤링SeleniumJavaScript 실행 후 데이터 로딩로그인 후 마이페이지, AJAX 기반 사이트
API 크롤링requests개발자 도구 Network에서 API 확인 가능데이터가 JSON 형태로 응답되는 사이트

🚨 크롤링 시 주의할 점

  • robots.txt를 확인하세요 🚦
    → 웹사이트가 크롤링을 허용하는지 반드시 확인해야 합니다.
    https://example.com/robots.txt 에서 정책을 확인하세요.

  • 너무 많은 요청을 보내지 마세요 ⚠️
    → 서버에 과부하를 줄 수 있습니다.
    time.sleep(0.5) 같은 딜레이를 추가하세요.

  • 데이터 무단 수집은 불법일 수 있습니다 📜
    → 개인정보 수집, 무단 데이터 활용 등은 법적으로 문제가 될 수 있습니다.
    → 이용 약관을 확인하고, 적절한 요청 범위 내에서 데이터를 수집하세요.


💡 결론

  • 정적 크롤링: BeautifulSoup → HTML 내 직접 데이터가 있을 때 사용
  • 동적 크롤링: Selenium → JavaScript가 데이터를 불러오는 경우 사용
  • API 크롤링: requests → 개발자 도구 Network에서 API 확인 후 사용

웹사이트 구조를 분석하고 가장 효율적인 크롤링 방법을 선택하는 것이 중요합니다!

profile
Software Engineer

0개의 댓글