본문 바로가기
AI 개발 가이드

AI로 웹 크롤러 만들기 - BeautifulSoup + Claude API 조합

by 소개왕 탑백귀 2026. 4. 4.

AI로 웹 크롤러 만들기 - BeautifulSoup + Claude API 조합

2026년 4월 기준 | AI 개발 가이드 · 자동화

이 글에서 만드는 것: 웹 페이지를 크롤링한 뒤, AI가 자동으로 데이터를 정리·분석하는 프로그램입니다. 기존 크롤러는 HTML 구조가 바뀌면 코드를 수정해야 했지만, AI를 붙이면 구조 변경에도 유연하게 대응할 수 있습니다.

왜 크롤러에 AI를 붙이나

기존 크롤러의 가장 큰 문제는 깨지기 쉽다는 것입니다.

# 기존 방식: CSS 셀렉터에 의존
title = soup.select_one("h3.news_tit > a").text  # 클래스명이 바뀌면 에러

사이트가 HTML 구조를 바꾸면 크롤러가 바로 죽습니다. 그때마다 셀렉터를 수정해야 합니다.

AI를 붙이면 이 문제를 해결할 수 있습니다. HTML 전체를 AI에게 주고 "여기서 제목을 뽑아줘"라고 하면, 구조가 바뀌어도 AI가 알아서 찾아줍니다.

기본 크롤러 만들기

먼저 전통적인 방식의 기본 크롤러입니다.

import requests
from bs4 import BeautifulSoup


def crawl_page(url: str) -> str:
    """웹 페이지의 텍스트를 가져옵니다."""
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status()

    soup = BeautifulSoup(response.text, "html.parser")

    # 불필요한 태그 제거
    for tag in soup.find_all(["script", "style", "nav", "footer", "header"]):
        tag.decompose()

    return soup.get_text(separator="\n", strip=True)


# 테스트
text = crawl_page("https://example.com")
print(text[:500])

이 코드는 HTML에서 텍스트만 추출합니다. 여기에 AI를 연결하면 텍스트를 자동으로 분석할 수 있습니다.

AI 분석 기능 추가

크롤링한 텍스트를 Claude API에 보내서 구조화된 데이터로 변환합니다.

import anthropic
import json


client = anthropic.Anthropic()


def extract_with_ai(text: str, instruction: str) -> dict:
    """AI로 텍스트에서 원하는 정보를 추출합니다."""
    prompt = f"""{instruction}

웹 페이지 텍스트:
---
{text[:5000]}
---

JSON 형식으로만 응답해주세요. 설명은 필요 없습니다."""

    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 추출 작업은 Haiku로 충분
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}]
    )

    # JSON 파싱
    result_text = response.content[0].text
    try:
        return json.loads(result_text)
    except json.JSONDecodeError:
        # JSON 블록만 추출
        start = result_text.find("{")
        end = result_text.rfind("}") + 1
        return json.loads(result_text[start:end])

핵심: Haiku 모델을 사용합니다. 데이터 추출은 복잡한 추론이 필요 없어서, 가장 저렴한 모델로도 충분합니다. Opus 대비 비용이 1/50입니다.

크롤링 + AI 통합 코드

두 기능을 합쳐서, URL만 넣으면 구조화된 데이터가 나오는 함수를 만듭니다.

def smart_crawl(url: str, fields: list[str]) -> dict:
    """URL에서 지정한 필드를 AI로 추출합니다."""

    # 1. 크롤링
    text = crawl_page(url)

    # 2. AI 추출 지시 생성
    fields_str = ", ".join(fields)
    instruction = f"이 웹 페이지에서 다음 정보를 추출해주세요: {fields_str}"

    # 3. AI 분석
    result = extract_with_ai(text, instruction)

    return result


# 사용 예시
data = smart_crawl(
    url="https://example-blog.com/post/123",
    fields=["제목", "작성자", "작성일", "본문 요약", "태그"]
)

print(json.dumps(data, ensure_ascii=False, indent=2))

출력 예시:

{
  "제목": "파이썬 웹 크롤링 입문 가이드",
  "작성자": "김개발",
  "작성일": "2026-03-25",
  "본문 요약": "requests와 BeautifulSoup을 사용한 기초 크롤링 방법을 다룬 입문 가이드",
  "태그": ["파이썬", "크롤링", "BeautifulSoup", "웹스크래핑"]
}

CSS 셀렉터를 하나도 안 썼는데 데이터가 깔끔하게 추출됩니다. 사이트 구조가 바뀌어도 이 코드는 수정할 필요가 없습니다.

실전 활용 - 뉴스 자동 요약기

이 기술을 응용해서 뉴스 기사를 자동으로 수집하고 요약하는 프로그램을 만들어보겠습니다.

import time


def summarize_news(urls: list[str]) -> list[dict]:
    """뉴스 URL 목록을 받아서 각각 요약합니다."""
    results = []

    for url in urls:
        print(f"처리 중: {url}")

        try:
            text = crawl_page(url)
            data = extract_with_ai(text, """다음 뉴스 기사를 분석해주세요.
JSON 형식으로 응답:
{
    "title": "기사 제목",
    "summary": "3줄 요약",
    "category": "정치/경제/사회/IT/문화 중 하나",
    "key_points": ["핵심 포인트 1", "핵심 포인트 2"]
}""")
            data["url"] = url
            results.append(data)

        except Exception as e:
            print(f"  에러: {e}")

        time.sleep(2)  # 예의 바른 크롤링

    return results


# 사용 예시
news_urls = [
    "https://news-site.com/article/1",
    "https://news-site.com/article/2",
    "https://news-site.com/article/3",
]

summaries = summarize_news(news_urls)
for s in summaries:
    print(f"\n[{s.get('category', '?')}] {s.get('title', '?')}")
    print(f"  {s.get('summary', '')}")

이 코드를 매일 아침 cron으로 돌리면, 자동으로 뉴스를 수집하고 요약해주는 시스템이 됩니다. Haiku 모델을 쓰면 뉴스 100건 처리해도 비용이 $0.5 미만입니다.

크롤링 시 주의사항

법적/윤리적 주의

  • robots.txt를 확인하세요. 크롤링이 금지된 사이트는 피해야 합니다.
  • 요청 간격을 두세요. time.sleep(2) 이상을 권장합니다. 서버에 부담을 주면 IP가 차단될 수 있습니다.
  • 개인정보를 수집하지 마세요. 이름, 전화번호, 이메일 등을 무단 수집하면 법적 문제가 됩니다.

기술적 주의

  • JavaScript 렌더링 페이지: requests로 가져올 수 없는 사이트는 Playwright나 Selenium이 필요합니다.
  • AI에 보내는 텍스트 길이: 너무 긴 텍스트는 잘라서 보내야 합니다. 5,000자 정도가 적당합니다.
  • 에러 처리: 네트워크 에러, 타임아웃, AI 파싱 실패 등에 대비해야 합니다.

다음 글에서는 이 크롤러를 확장해서 AI가 웹 데이터를 분석하고 자동으로 보고서를 생성하는 시스템을 만들어보겠습니다.

전체 코드: 이 글의 코드를 합치면 약 60줄입니다. crawl_page() + extract_with_ai() + smart_crawl() 세 함수만 있으면 어떤 사이트든 AI로 데이터를 추출할 수 있습니다.