Published on

파이썬 코드로 유튜브 영상 자동으로 다운받는 방법

Authors
  • 테크버킷
    Name
    테크버킷
    Twitter

Intro

파이썬 코드를 사용하여 유튜브 Shorts 영상을 일괄적으로 다운받는 방법을 소개합니다. youtube api 및 pytube 라이브러리를 이용합니다. 영상 한개를 다운받는 방법과 채널의 영상을 다운받는 방법으로 나누어 코드 예시와 함께 설명합니다.

이 방법으로 별도로 유료 영상 다운로드 툴을 사용하지 않고도 영상을 다운받을 수 있으며 자동화 등 수단으로 활용할 수 있습니다. (주의)개인 소장 용도의 영상 다운로드는 자유롭게 해도 되지만 저작권이 있는 영상을 사용시에는 해당 영상의 라이센스에 반드시 주의하여 사용하기 바랍니다.

사용 기술(라이브러리)


영상 한개 다운받기

1. pytube 설치

pytube 라이브러리를 사용하여 간단하게 YouTube 동영상을 다운로드할 수 있습니다. 터미널에 다음과같이 실행하여 라이브러리를 설치합니다.

pip3 pytube

2. 코드 작성

아래와 같이 코드를 쓸 수 있습니다. 코드를 모듈로 활용하거나 직접 실행하여 특정 영상을 받을 수 있습니다.

직접 실행시에는 video_url 변수에 다운로드하려는 동영상의 URL을 입력하면 됩니다.

download_video() 함수에 다운로드하고자 하는 동영상의 URL을 전달하면, 해당 동영상이 다운로드됩니다.


from pytube import YouTube

def download_video(video_url):
    yt = YouTube(video_url)
    yt.streams.filter(adaptive=True, file_extension='mp4').first().download()

if __name__ == '__main__':
    video_url = 'https://www.youtube.com/watch?v=VIDEO_ID_HERE'
    download_video(video_url)

확장자 및 화질 옵션

yt.streams.filter() 메소드를 수정하여 다른 확장자나 화질로 다운로드할 수도 있습니다.

예를 들어, 다음 코드는 720p 해상도의 MP4 형식 동영상을 다운로드합니다.

from pytube import YouTube

def download_video(video_url):
    yt = YouTube(video_url)
    yt.streams.filter(res='720p', file_extension='mp4').first().download()

if __name__ == '__main__':
    video_url = 'https://www.youtube.com/watch?v=VIDEO_ID_HERE'
    download_video(video_url)

아래는 자주 사용되는 filter() 메소드의 파라미터들입니다.

  • resolution (str): 동영상 해상도 ('144p', '240p', '360p', '480p', '720p', '1080p', ...)
  • file_extension (str): 동영상 파일 형식 ('mp4', 'webm', ...)
  • progressive (bool): 다운로드 가능한 전체 동영상 파일에 대한 스트림 필터링
  • adaptive (bool): 세그먼트화 된 스트리밍 동영상에 대한 스트림 필터링
  • only_audio (bool): 오디오 파일에 대한 스트림 필터링
  • mime_type (str): 파일의 MIME 유형

3. 코드 실행

위 코드를 video_download.py로 저장하고, 터미널에 다음과 같이 실행하면 영상이 받아집니다.

cd {파일이 저장된 디렉토리}
python3 ./video_downlaod.py

module import

혹은 위의 코드를 다음과 같이 분리하여 여러 파일에서 download video()를 재사용하도록 할 수 있습니다.

download.py

from pytube import YouTube

def download_video(video_url):
    yt = YouTube(video_url)
    yt.streams.filter(res='720p', file_extension='mp4').first().download()

download_video.py

from download import download_video

if __name__ == '__main__':
    video_url = 'https://www.youtube.com/watch?v=VIDEO_ID_HERE'
    download_video(video_url)

한 채널의 영상 모두 다운받기

1. YOUTUBE DATA API KEY 발급

채널에 포함된 영상의 리스트를 얻기 위해서 YouTube Data API v3 를 사용합니다. 이 API를 사용하려면 API Key가 필요하므로 API Key가 없다면 다음과 같이 YouTube API를 받을 수 있습니다.

  1. Google 개발자 콘솔로 이동합니다.
  2. 상단 탐색 모음에서 "프로젝트 선택" 드롭다운 메뉴를 클릭한 다음 "새 프로젝트" 버튼을 클릭하여 새 프로젝트를 만듭니다.
  3. 프로젝트 이름을 입력하고 "만들기"를 클릭합니다.
  4. 프로젝트가 생성되면 "프로젝트 선택" 드롭다운 메뉴에서 프로젝트를 선택합니다.
  5. "API 및 서비스 활성화" 버튼을 클릭하고 "YouTube 데이터 API"를 검색하여 YouTube 데이터 API를 활성화합니다. API를 클릭한 다음 "활성화" 버튼을 클릭합니다.
  6. "자격증명 만들기" 버튼을 클릭하고 "API 키"를 선택하여 프로젝트에 대한 자격 증명을 만듭니다. 프롬프트에 따라 API 키를 생성합니다.
  7. 경우에 따라 YouTube Data API를 사용하려면 OAuth 2.0 자격 증명을 설정해야 할 수 있습니다. 이렇게 하려면 "자격증명 만들기" 버튼을 클릭하고 "OAuth 클라이언트 ID"를 선택합니다. 안내에 따라 OAuth 클라이언트 ID를 만듭니다.
  8. API 키 및/또는 OAuth 2.0 자격 증명이 있으면 이를 사용하여 YouTube API에 대한 요청을 인증할 수 있습니다.

2. 코드

아래는 YouTube 채널의 모든 shorts 동영상을 다운로드받는 코드입니다. 채널 ID를 인수로 사용하고 채널의 업로드 재생 목록을 검색한 다음 "Shorts" 동영상으로 분류된 동영상을 다운로드하는 샘플 코드입니다.

아래 예시에서는 다운받을 영상을 채널 및 shorts 영상으로 제한했지만 코드를 응용하면 다른 조건의 영상들도 한번에 받을 수 있습니다.

yt.streams.filter()를 사용하여 영상 퀄리티를 조정할 수 있습니다. 아래에서는 최상의 품질로 다운받습니다.

import os
import google.auth
from googleapiclient.discovery import build
from pytube import YouTube

def download_shorts(channel_id):
    # Authenticate with YouTube Data API
    credentials, project = google.auth.default()
    youtube = build('youtube', 'v3', credentials=credentials)

    # Retrieve channel's uploads playlist
    channel_response = youtube.channels().list(part='contentDetails', id=channel_id).execute()
    uploads_playlist_id = channel_response['items'][0]['contentDetails']['relatedPlaylists']['uploads']

    # Retrieve playlist items and download "short" videos
    playlistitems_request = youtube.playlistItems().list(part='snippet', playlistId=uploads_playlist_id, maxResults=50)
    while playlistitems_request is not None:
        playlistitems_response = playlistitems_request.execute()
        for playlist_item in playlistitems_response['items']:
            video_id = playlist_item['snippet']['resourceId']['videoId']
            video_response = youtube.videos().list(part='snippet', id=video_id).execute()
            video_tags = video_response['items'][0]['snippet']['tags']
            if 'Shorts' in video_tags: # 쇼츠만 다운르드
                print(f'Downloading {video_id}')
                video_url = f'https://www.youtube.com/watch?v={video_id}'
                yt = YouTube(video_url)
                yt.streams.filter(adaptive=True, file_extension='mp4').first().download()
        playlistitems_request = youtube.playlistItems().list_next(playlistitems_request, playlistitems_response)

if __name__ == '__main__':
    channel_id = 'INSERT_YOUTUBE_CHANNEL_ID_HERE'
    download_shorts(channel_id)

3. 코드 실행

위 코드를 video_download.py로 저장하고, 터미널에 다음과 같이 실행하면 영상이 받아집니다.

cd {파일이 저장된 디렉토리}
python3 ./video_downlaod.py {채널ID}

저작권

유튜브 영상을 다운로드할 때에는 저작권 및 라이센스와 관련된 문제를 항상 염두에 두어야 합니다. 상업적인 목적으로 사용할 경우에는 저작권자와 사전 협의를 하여야 하며, 다운로드한 영상을 편집하거나 재배포할 경우 원저작자의 허락을 받아야 합니다.

유튜브 영상 다운로드 시에는 다음과 같은 주의사항을 지켜야 합니다.

1. 저작권 및 라이센스 확인:

유튜브에 올라온 모든 동영상은 저작권이 있으며, 해당 동영상을 사용할 때는 원저작자의 허락을 받아야 합니다. 유튜브 동영상의 라이센스는 동영상 제목 아래의 "더보기" 버튼을 클릭하여 확인할 수 있습니다.

2. 비상업적 용도로만 사용:

대부분의 경우 유튜브 동영상은 비상업적 용도로만 사용할 수 있습니다. 따라서, 상업적인 목적으로 동영상을 사용할 경우 저작권자와 사전 협의를 해야 합니다.

3. 영상 편집의 적법성 확인:

유튜브 동영상을 다운로드하여 편집할 때는 편집 내용이 원저작자의 의도와 일치하는지 확인해야 합니다. 또한, 편집된 동영상을 다시 유튜브에 업로드할 경우 원저작자의 동의를 얻어야 합니다.

4. 영상의 출처 표시:

유튜브에서 다운로드한 동영상을 사용할 경우, 출처를 명시해야 합니다. 출처를 명시하지 않을 경우, 저작권자가 해당 동영상을 삭제하거나 소송을 제기할 수 있습니다.

마무리

이상으로 유튜브 영상을 코드로 다운받는 방법을 소개했습니다. 이 방법으로 별도로 유료 영상 다운로드 툴을 사용하지 않고도 영상을 다운받을 수 있으니 많이 활용하길 바랍니다. 감사합니다.

이 글은 chatGPT의 도움을 받아 작성되었습니다.