공식 API 없이 YouTube 데이터 스크래핑하는 방법 (쿼터 제한 없음)
Source: Dev.to
소개
YouTube Data API는 엄격한 할당량 제한을 두고 있습니다(하루 10 000 단위, 단일 검색당 100 단위). 이는 하루에 대략 100번의 검색 또는 10 000개의 댓글만 조회할 수 있음을 의미합니다. YouTube의 내부 Innertube API와 직접 페이지 파싱을 이용하면 이러한 제한 없이 동일한 데이터를 가져올 수 있습니다.
Innertube API를 사용한 동영상 데이터 접근
동영상 페이지 가져오기
// Fetch the video page HTML
const html = await fetch(`https://www.youtube.com/watch?v=${videoId}`)
.then(r => r.text());
초기 데이터 추출
// Parse the ytInitialData JSON object from the page source
const ytData = JSON.parse(
html.match(/ytInitialData\s*=\s*({.*?});/)[1]
);
댓글 섹션 찾기
// Navigate to the comments section within the parsed data
const contents = ytData.contents.twoColumnWatchNextResults
.results.results.contents;
const commentSection = contents.find(
c => c.itemSectionRenderer?.targetId === "comments-section"
);
스크레이퍼는 페이지네이션을 자동으로 처리하여 모든 댓글을 다음 정보와 함께 추출합니다:
- 작성자 이름 및 채널
- 댓글 텍스트
- 좋아요 수
- 답글 수
- 게시 날짜
- 작성자 인증 여부
전체 채널 데이터 가져오기
같은 방법으로 다음 정보를 얻을 수 있습니다:
- 구독자 수
- 전체 동영상 수
- 채널 설명 및 외부 링크
- 조회수와 함께 제공되는 최신 동영상 목록
- 채널 생성 날짜
YouTube 검색 및 구조화된 결과 얻기
검색을 수행하면 스크레이퍼는 각 결과에 대해 구조화된 정보를 반환합니다:
- 동영상 제목, URL 및 썸네일
- 조회수 및 게시 날짜
- 채널 이름
- 재생 시간
- 설명 스니펫
동영상 캡션 및 자막 추출
// Get caption tracks from the player response
const captionMatch = html.match(/"captionTracks":\[(.+?)\]/);
const tracks = JSON.parse(`[${captionMatch[1]}]`);
// Fetch the transcript XML for a specific track
const transcript = await fetch(tracks[0].baseUrl)
.then(r => r.text());
특징
- 다국어 지원
- 타임스탬프 포함
- 자동 생성 캡션 지원
- YouTube Shorts 처리
실용적인 활용 사례
- 콘텐츠 리서치 – 어떤 주제가 가장 많은 조회수를 얻는지 분석합니다.
- 감성 분석 – 대규모 댓글을 처리해 시청자 반응을 파악합니다.
- 경쟁사 모니터링 – 경쟁 채널의 성장 지표를 추적합니다.
- AI 학습 데이터 – 동영상 전사본으로 데이터셋을 구축합니다.
- 마케팅 분석 – 채널 전반의 참여도를 측정합니다.
도구
언급된 네 가지 도구 모두 Apify Store에서 제공되며, 소스 코드와 문서는 GitHub에 있습니다. 추가 리소스로는 60개 이상의 웹 스크래핑 도구, AI 에이전트를 위한 15개의 MCP 서버, 그리고 무료 시장 조사 보고서가 포함됩니다.