27. yt-dlp로 유튜브 영상 리서치 자동화¶
콘텐츠 만들기 전에 "유튜브에 이런 영상이 이미 있는지" 11개를 한번에 보고 싶을 때. 하나씩 영상 보면 11편 = 5시간. yt-dlp로 자막만 뽑으면 30분이면 다 훑음.
yt-dlp가 뭐야?¶
유튜브, 트위치, 카카오TV 등 1500개+ 사이트의 영상/자막/메타데이터를 다운로드하는 명령줄 도구.
"유튜브 영상 도둑질"이 아니라 공개된 자막을 텍스트로 받아 분석용으로 쓰는 합법 도구.
설치: pip install yt-dlp 또는 winget install yt-dlp
비유로 이해하기¶
유튜브 = 도서관, 영상 = 책. 영상을 직접 보는 건 책을 처음부터 끝까지 읽는 것. yt-dlp 자막 추출 = "책 내용을 텍스트 파일로 받아서 Ctrl+F로 검색"하는 것. 11편 책을 다 읽지 않고도 "내가 다루려는 주제 키워드가 어디 나오는지" 즉시 잡힘.
실전 패턴¶
1. 자막만 일괄 다운로드 (영상 X)¶
yt-dlp --skip-download \
--write-auto-subs \
--sub-langs "ko,en" \
--sub-format vtt \
--sleep-requests 2 \
-o "%(id)s.%(ext)s" \
"URL1" "URL2" "URL3" ...
옵션 풀이:
- --skip-download: 영상 본체는 받지 마. 자막만.
- --write-auto-subs: 자동 생성 자막도 받아 (사용자가 단 자막 없을 때 대비).
- --sub-langs "ko,en": 한국어 + 영어 둘 다.
- --sleep-requests 2: 요청 사이 2초 쉬기. YouTube의 "너무 빨라" 차단(429 에러) 방지 ★
- -o "%(id)s.%(ext)s": 파일명을 영상 ID로 (제목에 한글/특수문자 있으면 에러 안 남)
2. 메타데이터만 따로 (조회수, 업로드 날짜, 채널 등)¶
→ JSON 한 덩어리로 모든 정보 출력. Python으로 파싱해서 필요한 필드만 추출.import subprocess, json
r = subprocess.run(["yt-dlp", "-j", "--skip-download", url],
capture_output=True, text=True, encoding="utf-8")
d = json.loads(r.stdout)
print(d["title"], d["upload_date"], d["view_count"])
3. VTT 자막을 깨끗한 텍스트로 변환¶
받은 .vtt 파일은 타임스탬프 + HTML 태그 + 같은 줄 중복 떡칠. 정리 필요:
import re
raw = open("video.ko.vtt", encoding="utf-8").read()
raw = re.sub(r"<[^>]+>", "", raw) # HTML 태그 제거
lines = []
for ln in raw.splitlines():
ln = ln.strip()
if not ln or "-->" in ln or ln.startswith(("WEBVTT", "Kind:", "Language:")) or ln.isdigit():
continue
if not lines or lines[-1] != ln: # 중복 제거
lines.append(ln)
text = " ".join(lines)
주의사항 (실제로 마주친 것)¶
429 Too Many Requests 에러¶
한 번에 11개 영상 자막을 두 언어씩 받으려고 하면 YouTube가 막음. 해결:
1. --sleep-requests 2 (요청 간격) + 영상 사이 sleep 8 추가
2. 한 언어씩 따로 받기 (ko 먼저, 5분 후 en)
3. 그래도 안 되면 영상 ID 단위로 하나씩 + sleep
Windows cp949 출력 에러¶
yt-dlp 출력에 이모지(✅ 등)가 있으면 콘솔에 그대로 print 시 cp949 에러. 해결:
- python -X utf8 script.py 로 실행 (Python UTF-8 모드)
- 또는 stdout 출력 안 하고 파일에 바로 저장
info.json 다운로드 실패 케이스¶
--write-info-json 옵션이 자막 다운 마지막에 실행되는데, 중간에 429 나면 info.json 못 받음.
→ 자막 따로 + -j로 메타 따로 두 번 받는 게 안정적.
콘텐츠 만들 때 활용 시나리오¶
시나리오 1: "이 주제 영상이 한국에 있나?" 조사¶
- 키워드로 검색 → 상위 5개 영상 URL 수집
- yt-dlp로 자막 일괄 추출
- 자막 텍스트에서 "내가 다룰 핵심 메시지"가 이미 있는지 grep
- 결론: 한국 0건이면 블루오션 = 영상 만들 가치
시나리오 2: 영상 시리즈 기획 전 사전 조사¶
- 영문권 11개 + 한국어 6개 = 17개 영상 자막 추출 (40분)
- 각 영상 description + 자막에서 언급된 도구·서비스 이름 모두 수집
- 공식 사이트로 팩트체크 → 영상 vs 공식 충돌 발견
- 차별화 메시지 = "직접 다 써보고 좋은 것만"
시나리오 3: 경쟁 채널 분석¶
- 경쟁 채널의 인기 영상 10개 자막 추출
- 30초마다 어떤 단어/패턴 나오는지 분석
- 인트로 후크 / 광고 시점 / 마무리 패턴 학습
yt-dlp의 한계¶
- 자동 자막은 음성 인식 결과라 오타 많음 (예: "Qwen"이 "Q&A"로 들림)
- 인용된 도구 이름이 헷갈리면 영상 description으로 보충 (description은 정확)
- 영상에서 보여준 화면 정보는 자막에 없음 → 핵심 영상은 결국 직접 봐야
더 나아가기¶
- 자막 텍스트를 Claude에게 던져 "이 영상에서 언급된 도구 다 정리해줘" 시키면 5분
- 11개 영상 동시 처리 시 자막 폴더 통째로 첨부하면 종합 분석 가능
- yt-dlp는 cookies 옵션으로 비공개/유료 영상도 받을 수 있음 (라이센스 주의)