본문 바로가기
DEVLOG/Python

유튜브 API로 썸네일부터 구독자 수까지 가져오는 방법

2025. 3. 10.
반응형
 
안녕하세요! 최근 유튜브 API를 활용해 데이터를 수집하고 분석하는 방법에 대해 고민하던 중, 몇 가지 흥미로운 질문이 떠올랐습니다. 그래서 직접 조사하고 정리한 내용을 블로그에 담아보기로 했습니다. 이 글에서는 유튜브 API로 과거 구독자 수를 알 수 있는지, 평균 조회수를 구하는 법, 그리고 특정 데이터를 DB에 저장했을 때 얼마나 쌓을 수 있는지까지 다뤄볼게요. 개발자나 데이터 분석에 관심 있는 분들께 도움이 되기를 바랍니다!

1. 유튜브 API로 과거 구독자 수를 알 수 있을까?

먼저 궁금했던 건 "과거 특정 시점의 구독자 수를 유튜브 API로 알 수 있는가"였습니다. 결론부터 말하자면, 안타깝게도 불가능합니다.

 
유튜브 Data API의 Channels.list 엔드포인트를 사용하면 현재 시점의 구독자 수는 쉽게 가져올 수 있습니다.
 
예를 들어:

plaintext

 
GET https://www.googleapis.com/youtube/v3/channels?part=statistics&id={CHANNEL_ID}&key={API_KEY}
 

이 요청은 subscriberCount로 최신 구독자 수를 반환하지만, 과거 데이터(예: 2023년 5월 1일의 구독자 수)는 제공하지 않습니다. 이유는 유튜브가 API 사용자에게 과거 기록을 공식적으로 열어주지 않기 때문이죠.

대안은?

  • YouTube Analytics API: 본인 채널이라면 일별 구독자 수 변화를 확인할 수 있지만, 타인의 채널에는 적용 불가.
  • Social Blade: 서드파티 서비스로 과거 데이터를 추정할 수 있지만, 정확도가 완벽하지 않음.
  • 직접 수집: 매일 API로 데이터를 저장하면 미래에 과거 데이터를 만들 수 있죠(지금 시작해야 한다는 점!).


2. 특정 채널의 평균 조회수와 롱폼/숏폼 분리 가능?

다음 질문은 "특정 채널의 평균 조회수를 구할 수 있는가"와 "롱폼과 숏폼을 나눠서 계산할 수 있는가"였습니다. 이건 가능합니다, 하지만 약간의 작업이 필요합니다.

 

평균 조회수 구하기

  1. Search.list로 채널의 동영상 목록을 가져옵니다.
  2. Videos.list로 각 동영상의 statistics.viewCount를 수집합니다.
  3. 조회수를 합산하고 동영상 수로 나누면 끝!

롱폼 vs 숏폼 나누기

유튜브 API는 Shorts와 일반 동영상을 명시적으로 구분하지 않지만, contentDetails.duration을 활용하면 됩니다.

예를 들어:

  • 60초 이하: 숏폼(Shorts)
  • 60초 초과: 롱폼

Python 코드로 구현하면:

longform_views = [video["statistics"]["viewCount"] for video in videos if parse_duration(video["contentDetails"]["duration"]).total_seconds() > 60]
shorts_views = [video["statistics"]["viewCount"] for video in videos if parse_duration(video["contentDetails"]["duration"]).total_seconds() <= 60]
avg_longform = sum(longform_views) / len(longform_views)
avg_shorts = sum(shorts_views) / len(shorts_views)

 

주의점: 60초 기준은 근사치일 뿐, 일부 예외가 있을 수 있습니다.


3. 1GB에 얼마나 많은 영상 정보를 저장할 수 있을까?

이제 데이터를 DB에 저장한다고 가정하고, [썸네일이미지] [영상길이] [영상제목] [조회수] [구독자수] [채널명] [게시일]를 포함한 레코드 1개당 크기를 계산해봤습니다.

크기 추정

  • 썸네일 이미지: 평균 30KB (URL 대신 이미지 자체 저장 가정).
  • 영상 길이: 4바이트 (초 단위 정수).
  • 영상 제목: 50바이트 (평균 40자).
  • 조회수: 4바이트.
  • 구독자수: 4바이트.
  • 채널명: 30바이트 (평균 20자).
  • 게시일: 8바이트 (타임스탬프).

총합: 약 30,820 바이트. DB 오버헤드(10%)를 추가하면 33,902 바이트.

1GB 계산
1GB(1,073,741,824 바이트) ÷ 33,902 바이트 ≈ 31,665 개.
 
썸네일 크기를 줄이면(예: 10KB) 최대 8만 개 이상도 가능합니다!

4. 유튜브 API로 모든 데이터 가져오기

마지막으로, 위 항목들을 API로 수집할 수 있는지 확인해봤습니다. 네, 가능합니다!
필요한 엔드포인트는 두 가지:

  • Videos.list: [썸네일이미지] [영상길이] [영상제목] [조회수] [채널명] [게시일] 제공.
  • Channels.list: [구독자수] 제공.
예시 코드:
python
 
video = youtube.videos().list(part="snippet,contentDetails,statistics", id="VIDEO_ID").execute()["items"][0]
channel = youtube.channels().list(part="statistics", id=video["snippet"]["channelId"]).execute()["items"][0]

data = {
    "thumbnail": video["snippet"]["thumbnails"]["high"]["url"],
    "duration": video["contentDetails"]["duration"],
    "title": video["snippet"]["title"],
    "views": video["statistics"]["viewCount"],
    "subscribers": channel["statistics"]["subscriberCount"],
    "channel_name": video["snippet"]["channelTitle"],
    "published": video["snippet"]["publishedAt"]
}

 

유튜브 API는 강력한 도구지만, 과거 데이터를 얻는 데는 한계가 있고, 원하는 정보를 얻으려면 약간의 창의성과 추가 작업이 필요합니다. 평균 조회수를 구하거나 DB에 데이터를 쌓는 건 충분히 가능하고, 이를 통해 재미있는 분석도 해볼 수 있을 것 같아요. 다음에는 실제로 데이터를 수집해서 간단한 분석 프로젝트를 진행해볼까 고민 중입니다. 

반응형

댓글