AI API 활용

파이썬으로 Claude API 연동하기 - 블로그 글 자동 요약기 만들기

소개왕 탑백귀 2026. 4. 1. 21:51

파이썬으로 Claude API 연동하기 - 블로그 글 자동 요약기 만들기

2026년 4월 기준 | AI API 활용 · 파이썬 튜토리얼

이 글에서 다루는 것: Claude API 키 발급부터, 파이썬으로 블로그 글을 자동 요약하는 프로그램을 만드는 전체 과정을 다룹니다. 코드를 복사해서 바로 실행할 수 있도록 작성했습니다.

왜 Claude API인가

AI API를 처음 써보려는 분들에게 Claude API를 추천하는 이유가 있습니다.

  • 한국어 요약 품질이 좋습니다. GPT와 비교했을 때 핵심을 빠뜨리지 않으면서 자연스러운 한국어 문장을 만들어냅니다.
  • 긴 글 처리에 강합니다. 최대 20만 토큰 입력이 가능해서, 긴 블로그 글도 한번에 넣을 수 있습니다.
  • API 구조가 단순합니다. 코드 10줄이면 첫 호출이 가능합니다.

API 키 발급 및 환경 설정

1단계: API 키 받기

  1. console.anthropic.com 접속
  2. 회원가입 후 로그인
  3. 좌측 메뉴에서 API Keys 클릭
  4. Create Key 버튼 클릭 → 키 복사
주의: API 키는 한 번만 보여줍니다. 반드시 안전한 곳에 저장해두세요. 코드에 직접 넣지 말고 환경 변수로 관리하는 것을 권장합니다.

2단계: 파이썬 라이브러리 설치

pip install anthropic

3단계: 환경 변수 설정

Windows 기준:

set ANTHROPIC_API_KEY=sk-ant-your-key-here

Mac/Linux 기준:

export ANTHROPIC_API_KEY=sk-ant-your-key-here

기본 API 호출 코드

먼저 가장 간단한 형태로 Claude API를 호출해봅니다.

import anthropic

client = anthropic.Anthropic()  # 환경 변수에서 자동으로 키를 읽음

message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "안녕하세요, 간단히 자기소개 해주세요."}
    ]
)

print(message.content[0].text)

이 코드를 실행하면 Claude가 응답을 반환합니다. 여기서 핵심은 세 가지입니다:

  • model: 사용할 모델. claude-sonnet-4-20250514이 가격 대비 성능이 좋습니다.
  • max_tokens: 응답 최대 길이. 요약용이면 1024면 충분합니다.
  • messages: 대화 내용. role은 "user" 또는 "assistant"입니다.

블로그 글 요약기 구현

이제 실제로 쓸 수 있는 요약기를 만들어보겠습니다.

import anthropic
import requests
from bs4 import BeautifulSoup


def get_blog_text(url: str) -> str:
    """블로그 URL에서 본문 텍스트를 추출합니다."""
    response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
    soup = BeautifulSoup(response.text, "html.parser")

    # 티스토리 본문 영역 추출
    article = soup.select_one("div.entry-content")
    if article is None:
        article = soup.select_one("div.contents_style")

    if article:
        return article.get_text(strip=True)
    return soup.get_text(strip=True)


def summarize(text: str) -> str:
    """Claude API로 텍스트를 요약합니다."""
    client = anthropic.Anthropic()

    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=[
            {
                "role": "user",
                "content": f"""다음 블로그 글을 3줄로 요약해주세요.
각 줄은 핵심 내용을 담고, 한국어로 자연스럽게 작성해주세요.

블로그 글:
{text}"""
            }
        ]
    )

    return message.content[0].text


# 실행
url = "https://your-blog.tistory.com/1"
blog_text = get_blog_text(url)
result = summarize(blog_text)

print("=== 요약 결과 ===")
print(result)

코드 설명

이 프로그램은 두 단계로 동작합니다:

  1. get_blog_text(): 블로그 URL을 받아서 HTML에서 본문 텍스트만 추출합니다. 티스토리의 경우 div.entry-content 또는 div.contents_style 안에 본문이 있습니다.
  2. summarize(): 추출한 텍스트를 Claude에게 보내서 3줄 요약을 받습니다. 프롬프트에서 "한국어로 자연스럽게"라고 지정하는 것이 품질에 큰 영향을 줍니다.

실행 결과 예시

제 블로그 글 하나를 넣어본 결과입니다:

=== 요약 결과 ===
1. Claude, ChatGPT, Gemini 세 AI 모델의 코딩 능력을 5가지 실전 과제로 비교 테스트했다.
2. 코드 품질과 디버깅은 Claude가, 빠른 프로토타입은 ChatGPT가, 가성비는 Gemini가 각각 강점을 보였다.
3. 하나만 고를 필요 없이 용도에 따라 나눠 쓰는 것이 가장 효율적인 활용법이다.

약 3,000자 분량의 글이 3줄로 깔끔하게 정리됩니다.

실전 업그레이드 - 여러 글 한번에 요약

블로그 글이 여러 개라면 하나씩 돌리기 번거롭습니다. URL 목록을 받아서 한번에 처리하는 버전을 만들어봅니다.

import time


def batch_summarize(urls: list[str]) -> dict:
    """여러 URL을 한번에 요약합니다."""
    results = {}

    for i, url in enumerate(urls, 1):
        print(f"[{i}/{len(urls)}] {url} 처리 중...")

        try:
            text = get_blog_text(url)
            summary = summarize(text)
            results[url] = {"status": "success", "summary": summary}
        except Exception as e:
            results[url] = {"status": "error", "message": str(e)}

        # API 호출 간격 (rate limit 방지)
        time.sleep(1)

    return results


# 사용 예시
urls = [
    "https://your-blog.tistory.com/1",
    "https://your-blog.tistory.com/2",
    "https://your-blog.tistory.com/3",
]

results = batch_summarize(urls)

for url, data in results.items():
    print(f"\n📌 {url}")
    if data["status"] == "success":
        print(data["summary"])
    else:
        print(f"에러: {data['message']}")

포인트: time.sleep(1)을 넣은 이유는 API를 너무 빠르게 연속 호출하면 rate limit에 걸리기 때문입니다. 1초 간격이면 충분합니다.

비용은 얼마나 드나

가장 궁금한 부분일 겁니다. 실제로 측정해봤습니다.

항목 수치
블로그 글 1개 평균 토큰 약 2,000~3,000 토큰 (입력)
요약 응답 평균 토큰 약 200~300 토큰 (출력)
글 1개 요약 비용 약 $0.01 이하 (Sonnet 기준)
글 100개 요약 비용 약 $1 미만

결론: 거의 공짜입니다. Sonnet 모델 기준으로 블로그 글 100개를 요약해도 1달러가 안 됩니다. 처음 가입하면 무료 크레딧도 제공하니, 부담 없이 시작할 수 있습니다.

자주 겪는 에러와 해결법

AuthenticationError: Invalid API Key

anthropic.AuthenticationError: Error code: 401

원인: API 키가 잘못되었거나 환경 변수가 설정되지 않음

해결: 환경 변수 확인 후 재설정. 또는 코드에서 직접 지정:

client = anthropic.Anthropic(api_key="sk-ant-...")

RateLimitError: Too many requests

anthropic.RateLimitError: Error code: 429

원인: 짧은 시간에 너무 많은 요청

해결: 요청 사이에 time.sleep(2)을 넣거나, 무료 tier의 경우 분당 요청 수 제한을 확인

크롤링 시 빈 텍스트가 반환될 때

원인: 블로그가 JavaScript로 렌더링되는 경우 requests로는 본문을 가져올 수 없음

해결: Selenium이나 Playwright를 사용하면 됩니다. 다만 대부분의 티스토리 블로그는 requests로 충분합니다.

더 발전시키려면

이 요약기를 기반으로 확장할 수 있는 아이디어들입니다:

  • 카테고리 자동 분류: 요약과 함께 글의 카테고리를 자동으로 판별
  • SEO 메타 설명 생성: 요약 결과를 블로그 메타 태그용 설명으로 변환
  • 키워드 추출: 글에서 핵심 키워드를 자동으로 뽑아내기
  • 다국어 요약: 한국어 글을 영어/일본어로 요약하여 해외 독자 확보

다음 글에서는 GPT API와 Claude API의 응답 품질을 동일한 프롬프트로 비교 테스트한 결과를 공유하겠습니다.

참고: 이 글의 코드는 Python 3.10 이상, anthropic 라이브러리 최신 버전 기준입니다. API 가격은 2026년 4월 기준이며 변동될 수 있으니, 정확한 가격은 공식 문서를 확인해주세요.