[응용#1] 웹 크롤러 만들기 (BeautifulSoup + requests 실전 예제)

한줄 요약:
파이썬으로 웹 페이지 데이터를 자동으로 가져오는 프로그램 만들기!
👉 requests + BeautifulSoup으로 뉴스, 상품 정보, 블로그 글 등 쉽게 크롤링하자 🕵️‍♂️


1. 목표

  • requests로 웹페이지 HTML 소스 요청하기
  • BeautifulSoup으로 HTML 문서에서 원하는 데이터 추출
  • 반복문으로 여러 페이지 자동 크롤링
  • CSV 파일로 저장

2. 준비하기

1️⃣ 필요한 패키지 설치

pip install requests beautifulsoup4

2️⃣ 크롤링 대상 예시

이번 예제에서는 뉴스 목록 페이지를 예시로 사용하자.
URL 구조 예시:

https://example.com/news?page=1

페이지 번호만 바꿔가며 여러 페이지의 뉴스 제목을 가져온다고 생각해보자.


3. 기본 코드 예시

import requests
from bs4 import BeautifulSoup

# 1️⃣ URL 지정
url = "https://example.com/news?page=1"

# 2️⃣ 요청 보내기
response = requests.get(url)
response.raise_for_status()  # 오류 발생 시 예외

# 3️⃣ HTML 파싱
soup = BeautifulSoup(response.text, "html.parser")

# 4️⃣ 데이터 추출 (예: 뉴스 제목)
titles = soup.select("h2.title")  # CSS 선택자 사용

for idx, t in enumerate(titles, 1):
    print(f"{idx}. {t.get_text(strip=True)}")

4. 코드 설명

단계기능
requests.get()URL로 요청 보내기
raise_for_status()HTTP 오류 시 예외 발생
BeautifulSoup()HTML 파싱 도구
.select()CSS 선택자 방식으로 원하는 태그 찾기
.get_text(strip=True)HTML 태그 제거하고 텍스트만 추출

5. 여러 페이지 자동 크롤링

import requests
from bs4 import BeautifulSoup

base_url = "https://example.com/news?page="
all_titles = []

for page in range(1, 6):  # 1~5페이지
    url = f"{base_url}{page}"
    res = requests.get(url)
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "html.parser")

    titles = soup.select("h2.title")

    for t in titles:
        all_titles.append(t.get_text(strip=True))

print(f"총 {len(all_titles)}개의 뉴스 수집 완료!")

6. CSV 파일로 저장

import csv

with open("news_titles.csv", "w", newline="", encoding="utf-8-sig") as f:
    writer = csv.writer(f)
    writer.writerow(["번호", "뉴스 제목"])
    for i, title in enumerate(all_titles, 1):
        writer.writerow([i, title])

print("✅ news_titles.csv 파일로 저장 완료!")

7. 실전 크롤링 예시: 네이버 뉴스

⚠️ 주의: 크롤링 시 사이트 이용 약관을 반드시 확인하고, 너무 잦은 요청은 피하세요.

import requests
from bs4 import BeautifulSoup

headers = {"User-Agent": "Mozilla/5.0"}  # 브라우저 흉내내기
url = "https://news.naver.com/section/101"  # 경제 뉴스

res = requests.get(url, headers=headers)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")

titles = soup.select("div.sa_text > a.sa_text_title")

for t in titles:
    print(t.get_text(strip=True))

🪄 팁:

  • headers 추가 시 봇 차단을 피할 수 있음
  • CSS 선택자는 Chrome → 검사(F12) → 태그 우클릭 → Copy → Copy selector 로 찾을 수 있음

8. 크롤링 예외 처리 (에러 방지 필수!)

import time
import random

for page in range(1, 6):
    try:
        url = f"{base_url}{page}"
        res = requests.get(url, timeout=5)
        res.raise_for_status()
        soup = BeautifulSoup(res.text, "html.parser")
        print(f"{page}페이지 처리 완료")
    except Exception as e:
        print(f"{page}페이지 에러 발생: {e}")
    time.sleep(random.uniform(1, 3))  # 요청 간 간격 두기

9. 크롤링 데이터 활용

  • 엑셀/CSV 분석: pandas로 불러서 정리
  • 워드클라우드: 텍스트 빈도 시각화
  • 자동 요약/분류 모델 학습: 머신러닝 데이터로 활용 가능

10. 주의사항

항목설명
robots.txt 확인사이트가 허용하는 경로만 크롤링
과도한 요청 금지sleep으로 요청 간격 조절
저작권 주의뉴스 본문 등은 상업적 이용 금지
API 제공 여부 확인공식 API가 있다면 그쪽이 안전하고 효율적

11. 최종 점검 체크리스트

  • requests + BeautifulSoup 설치 완료
  • .select()로 태그 정확히 선택
  • 여러 페이지 자동 반복 처리
  • CSV 저장 테스트 완료
  • robots.txt, 이용 약관 준수

12. 요약 한 줄

웹 크롤링은 데이터 수집의 핵심 기술!
requests로 가져오고, BeautifulSoup으로 정리하고, CSV로 저장하자 ✅


이전 강좌 👈 [도구/환경#6] 파이썬 성능 최적화 (속도 개선 팁)
다음 강좌 👉 [응용#2] Selenium으로 동적 페이지 자동 크롤링

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.