유튜브 채널을 분석하거나 콘텐츠 트렌드를 파악할 때, 매번 수동으로 영상 목록을 정리하는 작업은 생각보다 손이 많이 갑니다. YouTube Data API와 Python을 조합하면 이 과정을 자동화할 수 있습니다. 채널 ID 하나만 있으면 인기 영상 데이터를 수십 개씩 한 번에 수집할 수 있습니다.
YouTube Data API란 무엇인가

YouTube Data API(유튜브 데이터 API)는 구글이 공식 제공하는 인터페이스로, 유튜브의 채널·영상·댓글 등 다양한 데이터를 프로그래밍 방식으로 가져올 수 있습니다. 직접 유튜브 페이지를 크롤링하는 방식과 달리, API를 통해 요청하면 구조화된 JSON 형태로 데이터가 반환됩니다.
무료 할당량(quota)은 하루 10,000유닛입니다. 영상 목록 조회 한 번에 소모되는 유닛은 100단위 수준이므로, 소규모 수집 작업에서는 무료 범위 안에서 충분히 운용 가능합니다. 공식 문서는 Google Developers — YouTube Data API v3에서 확인할 수 있습니다.
사전 준비: API 키 발급과 환경 설정
코드를 작성하기 전에 두 가지를 먼저 준비해야 합니다.
1. Google Cloud Console에서 API 키 발급
- Google Cloud Console에 접속합니다.
- 새 프로젝트를 생성합니다. (예:
youtube-data-collector) - 왼쪽 메뉴에서 API 및 서비스 > 라이브러리로 이동합니다.
- YouTube Data API v3를 검색하고 사용 설정합니다.
- 사용자 인증 정보 > API 키를 생성합니다.
발급된 API 키는 외부에 노출되지 않도록 주의해야 합니다. 코드에 직접 하드코딩하는 대신, 환경 변수나 별도 설정 파일로 관리하는 것이 안전합니다.
2. Python 라이브러리 설치
터미널에서 아래 명령어를 실행합니다.
pip install google-api-python-client
google-api-python-client는 구글이 공식 제공하는 Python 클라이언트 라이브러리입니다. YouTube Data API를 포함해 다양한 구글 서비스에 접근할 수 있습니다.
Google Cloud Console에서 API 키를 발급하는 화면
Python 코드 작성: 채널 인기 영상 자동 수집
아래는 특정 채널의 인기 영상을 최대 50개까지 수집하고 CSV 파일로 저장하는 기본 코드입니다.
import os
import csv
from googleapiclient.discovery import build
# API 키와 채널 ID 설정
API_KEY = os.environ.get("YOUTUBE_API_KEY") # 환경 변수에서 불러오기
CHANNEL_ID = "여기에_채널_ID_입력" # 예: UCxxxxxxxxxxxxxx
MAX_RESULTS = 50
# API 클라이언트 초기화
youtube = build("youtube", "v3", developerKey=API_KEY)
# 채널의 업로드 재생목록 ID 가져오기
channel_response = youtube.channels().list(
part="contentDetails",
id=CHANNEL_ID
).execute()
uploads_playlist_id = channel_response["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"]
# 재생목록에서 영상 ID 수집
video_ids = []
next_page_token = None
while len(video_ids) < MAX_RESULTS:
playlist_response = youtube.playlistItems().list(
part="contentDetails",
playlistId=uploads_playlist_id,
maxResults=min(50, MAX_RESULTS - len(video_ids)),
pageToken=next_page_token
).execute()
for item in playlist_response["items"]:
video_ids.append(item["contentDetails"]["videoId"])
next_page_token = playlist_response.get("nextPageToken")
if not next_page_token:
break
# 영상 상세 정보 수집 (조회수, 좋아요, 제목 등)
videos_data = []
for i in range(0, len(video_ids), 50):
chunk = video_ids[i:i+50]
video_response = youtube.videos().list(
part="snippet,statistics",
id=",".join(chunk)
).execute()
for item in video_response["items"]:
snippet = item["snippet"]
stats = item.get("statistics", {})
videos_data.append({
"video_id": item["id"],
"title": snippet["title"],
"published_at": snippet["publishedAt"],
"view_count": stats.get("viewCount", "0"),
"like_count": stats.get("likeCount", "0"),
"comment_count": stats.get("commentCount", "0"),
"url": f"https://www.youtube.com/watch?v={item['id']}"
})
# 조회수 기준 정렬
videos_data.sort(key=lambda x: int(x["view_count"]), reverse=True)
# CSV로 저장
with open("popular_videos.csv", "w", newline="", encoding="utf-8-sig") as f:
fieldnames = ["video_id", "title", "published_at", "view_count", "like_count", "comment_count", "url"]
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(videos_data)
print(f"수집 완료: 총 {len(videos_data)}개 영상이 popular_videos.csv에 저장되었습니다.")
코드를 실행하면 popular_videos.csv 파일이 생성됩니다. 제목, 조회수, 좋아요 수, 댓글 수, 게시일, URL이 컬럼별로 정리된 형태입니다. Excel이나 Google Sheets에서 바로 열 수 있습니다.
수집 완료 후 CSV 파일 출력 예시
채널 ID 확인하는 방법
채널 ID는 유튜브 채널 페이지 URL에서 확인할 수 있습니다. 채널 URL 형태에 따라 확인 방법이 다릅니다.
| URL 형태 | 채널 ID 확인 방법 |
|---|---|
youtube.com/channel/UCxxxxxx |
URL의 channel/ 뒤 문자열이 채널 ID |
youtube.com/@핸들명 |
채널 페이지 소스에서 "channelId" 검색 또는 API의 forHandle 파라미터 사용 |
youtube.com/c/채널명 |
채널 소개 페이지 HTML 소스에서 "externalId" 검색 |
핸들 방식(@핸들명)을 사용하는 채널이라면 아래처럼 API로 채널 ID를 먼저 조회할 수 있습니다.
handle_response = youtube.channels().list(
part="id",
forHandle="핸들명" # @ 제외하고 입력
).execute()
channel_id = handle_response["items"][0]["id"]
print(channel_id)
자주 발생하는 오류와 해결 방법
실제 실행 과정에서 만날 수 있는 오류들을 정리했습니다.
① 403 quotaExceeded 오류 — 하루 무료 할당량(10,000유닛)을 초과한 경우입니다. 다음 날 자정(태평양 표준시 기준) 이후 재시도하거나, Google Cloud Console에서 결제 계정을 연결해 유료 할당량을 추가하면 됩니다.
② 403 forbidden / API not enabled — Google Cloud Console에서 YouTube Data API v3 사용 설정을 누락한 경우입니다. 라이브러리 메뉴에서 해당 API를 찾아 사용 설정하면 해결됩니다.
③ KeyError: 'items' — 채널 ID가 잘못되었거나 비공개 채널인 경우 응답 데이터에 items 키가 없어 발생합니다. 채널 ID를 재확인하거나 response.get("items", [])로 방어 코드를 추가하면 됩니다.
④ statistics 키 없음 오류 — 일부 채널은 좋아요 수나 댓글 수를 비공개로 설정합니다. stats.get("likeCount", "0")처럼 기본값을 지정해두면 오류 없이 처리됩니다. 위 코드에는 이미 반영되어 있습니다.
터미널에서 코드 실행 완료 메시지 확인
수집 데이터 활용 방법
CSV로 저장된 데이터는 다양한 방식으로 활용할 수 있습니다.
| 활용 목적 | 방법 | 도구 |
|---|---|---|
| 인기 영상 트렌드 파악 | 조회수·좋아요 기준 필터링 | Excel, Google Sheets |
| 경쟁 채널 콘텐츠 분석 | 제목 키워드 빈도 분석 | Python pandas |
| 정기 자동 수집 | 스케줄러로 주기적 실행 | cron, Windows 작업 스케줄러 |
| 시각화 보고서 | 차트 생성 | matplotlib, Looker Studio |
수집 주기를 일별로 설정하면 채널의 조회수 증가 추이를 시계열로 추적하는 것도 가능합니다. 다만 이 경우 누적 데이터 관리 로직을 별도로 추가해야 합니다.
자주 묻는 질문
Q. API 키 없이 유튜브 데이터를 수집할 수 있습니까?
yt-dlp 같은 도구로 일부 공개 정보를 수집할 수 있지만, 구조화된 통계 데이터(조회수, 좋아요 등)를 안정적으로 가져오려면 YouTube Data API 사용이 사실상 필수입니다. 무료 할당량 범위 내에서는 비용이 발생하지 않습니다.
Q. 하루에 수집할 수 있는 영상 수에 제한이 있습니까?
무료 할당량은 하루 10,000유닛입니다. 영상 50개 수집 기준으로 playlistItems 조회(약 100유닛)와 videos 상세 정보 조회(약 100유닛)를 합산하면 약 200유닛 수준입니다. 경험상 소규모 채널 분석 작업은 무료 범위 안에서 충분합니다.
Q. 수집한 데이터를 데이터베이스에 저장하려면 어떻게 합니까?
CSV 저장 부분을 SQLite나 PostgreSQL 연동 코드로 교체하면 됩니다. Python의 sqlite3 모듈은 별도 설치 없이 사용 가능하므로 로컬 환경에서 빠르게 테스트하기 적합합니다.
YouTube Data API를 활용한 채널 인기 영상 자동 수집은 API 키 발급부터 CSV 저장까지 코드 구조 자체는 단순한 편입니다. 처음에는 오류 메시지가 낯설게 느껴질 수 있지만, 위에서 정리한 오류 유형 4가지를 참고하면 대부분의 상황은 해결됩니다. 수집 자체보다 이후 데이터를 어떻게 분류하고 활용할지 설계하는 단계가 더 중요합니다.
썸네일: Joshua Aragon on Unsplash