본문 바로가기
카테고리 없음

python 기반 웹 크롤링

by fisherman1 2025. 6. 12.

개요 : Python을 활용한 웹 크롤링은 정적 웹사이트부터 동적으로 JavaScript로 렌더링되는 사이트까지 다양한 데이터 수집에 활용됩니다. 크롤링 목적에 따라 BeautifulSoup + requests 또는 Selenium을 사용하는 방식이 다릅니다. 아래는 주요 크롤링 기법과 코드 예시를 구조적으로 정리한 내용입니다.

정적 웹사이트 크롤링 (requests + BeautifulSoup)

정적 웹사이트는 서버에서 HTML로 응답하는 구조이며, 가장 빠르고 간단하게 데이터를 수집할 수 있습니다.

예시: 네이버 뉴스 제목 크롤링

코드
import requests
from bs4 import BeautifulSoup

url = "https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100"
headers = {"User-Agent": "Mozilla/5.0"}

res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, "html.parser")
titles = soup.select("a.cluster_text_headline")

for i, title in enumerate(titles[:5], 1):
    print(f"{i}. {title.text.strip()}")
 
동적 웹사이트 크롤링 (Selenium)

JavaScript로 구성된 웹사이트는 requests만으로는 데이터가 보이지 않으며, 실제 브라우저 동작을 모방하는 Selenium을 사용해야 합니다.

예시: 네이버 쇼핑에서 상품명 추출

코드
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://search.shopping.naver.com/search/all?query=노트북")

time.sleep(2)
titles = driver.find_elements(By.CSS_SELECTOR, 'div.product_title__Mmw2K a')

for i, t in enumerate(titles[:5], 1):
    print(f"{i}. {t.text}")

driver.quit()
 
크롤링 시 주의할 점

웹 크롤링은 사이트의 구조와 정책을 존중해야 하며, 다음 항목들을 반드시 확인하고 준수해야 합니다.

  • robots.txt: 해당 사이트의 크롤링 허용 범위를 확인
  • User-Agent 설정: 브라우저처럼 보이도록 헤더 추가
  • 요청 간격: time.sleep() 등으로 과도한 요청 방지
  • 공식 API 우선 사용: 가능하다면 API가 훨씬 안전하고 안정적
 
추천 라이브러리 요약
목적 라이브러리 설명
HTML 파싱 BeautifulSoup HTML 구조를 트리 형태로 분석
HTTP 요청 requests, httpx 빠르고 간단한 요청
브라우저 제어 Selenium 동적 크롤링, 자동 입력/클릭
비동기 크롤링 aiohttp 수천 개 요청을 비동기로 처리
 

요약 : 웹 크롤링은 목적과 웹 구조에 따라 방식이 달라집니다. 정적 페이지는 requests + BeautifulSoup으로, 동적 페이지는 Selenium으로 접근합니다. 아래는 크롤링 방식별 요약입니다.

구분 기술 장점 단점
정적 크롤링 requests + BeautifulSoup 빠름, 가볍고 간단 JS 렌더링 불가
동적 크롤링 Selenium 브라우저 자동화, JS 처리 가능 느림, 리소스 많음