중복 파일 삭제 스크립트를 돌렸다가 식은땀 흘린 날
"경쟁 채널의 인기 영상 제목과 조회수를 주기적으로 모니터링하고 싶다", "우리 채널 영상 목록을 엑셀로 정리해서 콘텐츠 현황을 파악하고 싶다", "특정 키워드로 검색되는 영상들의 조회수 추이를 추적하고 싶다"…
유튜브 스튜디오에서 데이터를 확인할 수 있지만 경쟁 채널을 비교하거나 이력을 누적 저장하기는 어렵습니다. 구글에서 제공하는 유튜브 데이터 API v3를 활용하면 파이썬으로 채널 정보, 영상 목록, 조회수, 좋아요 수, 댓글 수를 자동으로 수집할 수 있습니다. 하루 10,000 유닛까지 무료로 사용할 수 있습니다.
구글 클라우드 콘솔에서 API 키를 발급받아야 합니다. 아래 순서대로 진행하세요.
⚠️ API 사용량 주의: 유튜브 API는 하루 10,000 유닛 무료 한도가 있습니다. 영상 목록 조회는 100 유닛, 영상 상세 정보는 1 유닛 소비합니다. 대량 수집 시 한도를 초과할 수 있으니 주의하세요.
터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install google-api-python-client pandas openpyxl
google-api-python-client는 구글 API를 파이썬에서 쉽게 호출하는 공식 라이브러리입니다. pandas와 openpyxl은 수집한 데이터를 엑셀로 저장하는 데 사용합니다.
수집할 유튜브 채널의 채널 ID를 먼저 확인해야 합니다. 채널 페이지 주소에서 확인할 수 있습니다.
채널 주소가 youtube.com/channel/UC... 형태라면 UC... 부분이 채널 ID입니다. youtube.com/@채널이름 형태라면 채널 페이지에서 "소개" 탭 → 하단 "채널 공유" → 링크에서 채널 ID를 확인할 수 있습니다.
아래 코드를 그대로 복사해서 메모장에 붙여넣고, youtube_collect.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
from googleapiclient.discovery import build
import pandas as pd
from datetime import datetime
from pathlib import Path
# ① 설정
API_KEY = "여기에_API_키_입력" # ← 1단계에서 발급받은 키
CHANNEL_ID = "여기에_채널_ID_입력" # ← 수집할 채널 ID
OUTPUT_PATH = r"C:\Users\내이름\Desktop\유튜브_영상목록.xlsx" # ← 저장 경로
MAX_VIDEOS = 50 # ← 최대 수집 영상 수 (최대 50개씩 페이지 처리)
# ② API 연결
youtube = build("youtube", "v3", developerKey=API_KEY)
print(" ✔ 유튜브 API 연결 완료")
# ③ 채널 기본 정보 수집
ch_res = youtube.channels().list(
part="snippet,statistics",
id=CHANNEL_ID
).execute()
ch_info = ch_res["items"][0]
ch_name = ch_info["snippet"]["title"]
ch_subs = int(ch_info["statistics"].get("subscriberCount", 0))
ch_videos = int(ch_info["statistics"].get("videoCount", 0))
ch_views = int(ch_info["statistics"].get("viewCount", 0))
uploads_id = ch_info["snippet"].get("country", "")
print(f" ✔ 채널명: {ch_name}")
print(f" ✔ 구독자: {ch_subs:,}명")
print(f" ✔ 총 영상: {ch_videos:,}개")
print(f" ✔ 총 조회수: {ch_views:,}회")
# ④ 업로드 재생목록 ID 가져오기
pl_res = youtube.channels().list(
part="contentDetails",
id=CHANNEL_ID
).execute()
uploads_pl = pl_res["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"]
# ⑤ 영상 목록 수집
video_ids = []
next_page = None
while len(video_ids) < MAX_VIDEOS:
pl_items = youtube.playlistItems().list(
part="contentDetails",
playlistId=uploads_pl,
maxResults=min(50, MAX_VIDEOS - len(video_ids)),
pageToken=next_page
).execute()
for item in pl_items["items"]:
video_ids.append(item["contentDetails"]["videoId"])
next_page = pl_items.get("nextPageToken")
if not next_page:
break
print(f" ✔ 영상 ID 수집: {len(video_ids)}개")
# ⑥ 영상별 상세 정보 수집 (50개씩 묶어서 처리)
results = []
for i in range(0, len(video_ids), 50):
chunk = video_ids[i:i+50]
v_res = youtube.videos().list(
part="snippet,statistics",
id=",".join(chunk)
).execute()
for item in v_res["items"]:
snippet = item["snippet"]
stats = item.get("statistics", {})
results.append({
"수집일시": datetime.now().strftime("%Y-%m-%d %H:%M"),
"채널명": ch_name,
"영상제목": snippet["title"],
"게시일": snippet["publishedAt"][:10],
"조회수": int(stats.get("viewCount", 0)),
"좋아요수": int(stats.get("likeCount", 0)),
"댓글수": int(stats.get("commentCount", 0)),
"영상URL": f"https://youtu.be/{item['id']}",
})
# ⑦ 조회수 내림차순 정렬
df = pd.DataFrame(results).sort_values("조회수", ascending=False).reset_index(drop=True)
# ⑧ 엑셀 저장
output = Path(OUTPUT_PATH)
df.to_excel(output, index=False)
print(f"\n ✔ 영상 {len(df)}개 수집 완료")
print(f" ✔ 조회수 TOP 3:")
for _, row in df.head(3).iterrows():
print(f" {row['영상제목'][:30]}... ({row['조회수']:,}회)")
print(f"\n✅ 완료! 저장 → {OUTPUT_PATH}")
API_KEY에 발급받은 키를 입력합니다.CHANNEL_ID에 수집할 채널 ID를 입력합니다.MAX_VIDEOS에 수집할 최대 영상 수를 입력합니다. 처음에는 10~20개로 테스트하는 것을 권장합니다.python youtube_collect.py
정상 실행 시 터미널에 이렇게 출력됩니다:
✔ 유튜브 API 연결 완료
✔ 채널명: IT꿀팁 연구소
✔ 구독자: 12,500명
✔ 총 영상: 84개
✔ 총 조회수: 1,230,400회
✔ 영상 ID 수집: 50개
✔ 영상 50개 수집 완료
✔ 조회수 TOP 3:
파이썬으로 엑셀 자동화하는 방법... (48,200회)
카카오톡 자동 발송 완성 코드 공개... (32,100회)
중복 파일 자동 삭제 꿀팁... (21,500회)
✅ 완료! 저장 → C:\Users\내이름\Desktop\유튜브_영상목록.xlsx
오류 1: HttpError 403 — The caller does not have permission
API 키가 YouTube Data API v3에 대한 권한이 없는 경우입니다. 구글 클라우드 콘솔에서 YouTube Data API v3가 "사용 설정" 상태인지 다시 확인하세요.
오류 2: HttpError 400 — Channel not found
CHANNEL_ID가 잘못 입력된 경우입니다. 채널 ID는 반드시 UC로 시작하는 24자리 문자열이어야 합니다. @채널이름 형태는 채널 ID가 아닙니다.
오류 3: quotaExceeded — 일일 한도 초과
하루 10,000 유닛 무료 한도를 초과한 경우입니다. 다음 날 자정(태평양 표준시 기준)에 한도가 초기화됩니다. MAX_VIDEOS 값을 줄이거나 수집 주기를 늘려 사용량을 조절하세요.
경쟁 채널 여러 개를 동시에 수집해 비교 분석할 수 있습니다. 코드 ① 설정의 CHANNEL_ID를 리스트로 교체하세요.
CHANNEL_IDS = [
"UC채널ID_1",
"UC채널ID_2",
"UC채널ID_3",
]
all_results = []
for channel_id in CHANNEL_IDS:
CHANNEL_ID = channel_id
# ... 기존 수집 코드 실행 후 all_results에 추가
all_results.extend(results)
df = pd.DataFrame(all_results).sort_values(["채널명", "조회수"], ascending=[True, False])
💡 이전 게시글과 결합하면: 차트 자동 저장 편과 결합하면 채널별 조회수 비교 차트를 자동으로 생성할 수 있고, 텔레그램 자동 발송 편과 결합하면 주간 채널 현황 리포트를 자동으로 받는 것도 가능합니다.
이 코드를 응용하면 특정 키워드로 영상을 검색하거나, 영상 댓글을 수집해 감성 분석하는 것도 가능합니다.