Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 pytube 라이브러리로 유튜브 영상 다운로드하는 방법

유튜브는 전 세계에서 가장 널리 쓰이는 동영상 공유 플랫폼입니다. 마음에 드는 영상을 나중에 보거나 오프라인 상태에서 시청하고 싶어 다운로드를 시도해 본 적이 있을 텐데요. 이럴 때 흔히 '유튜브 다운로더' 앱을 찾게 되지만, 무료 버전은 각종 제한이 있거나 유료 결제를 요구하는 경우가 많습니다.

그런데 한 번쯤 생각해 본 적이 있나요? 직접 만든 프로그램으로 유튜브 영상을 다운로드하는 방법 말입니다. 파이썬만 있다면 생각보다 아주 간단합니다. 파이썬은 웹에서 동영상을 내려받을 수 있는 pytube라는 경량 라이브러리를 제공하며, 몇 줄의 코드만으로 원하는 영상을 손쉽게 저장할 수 있습니다.

pytube 설치하기

pytube는 파이썬 기본(표준) 라이브러리가 아니므로 먼저 설치가 필요합니다. pip를 사용하면 명령어 한 줄로 간단히 설치할 수 있습니다.

pip install pytube
Collecting pytube
Downloading https://files.pythonhosted.org/packages/af/56/c9b484e93e1f3a4ef6aefbc1e68258121831007938556daf968ab4519c9c/pytube-9.3.5-py3-none-any.whl
Installing collected packages: pytube
Successfully installed pytube-9.3.5

유튜브 영상 다운로드하기

pytube를 사용하면 유튜브 영상 다운로드가 매우 직관적입니다. 단계별로 살펴보겠습니다.

1. YouTube 클래스 임포트

먼저 pytube 모듈에서 YouTube 클래스를 가져옵니다.

from pytube import YouTube

2. 영상 객체 생성

다운로드하려는 영상의 URL을 YouTube 클래스에 전달해 객체를 생성합니다.

yt = YouTube('https://www.youtube.com/watch?v=-KnAZcXzxRA')

3. 영상 정보 확인

pytube API는 영상 정보에 매우 직관적으로 접근할 수 있도록 설계되어 있습니다. 예를 들어 영상 제목은 다음과 같이 조회합니다.

>>> yt.title
'Redmi Note 7 Fake 48MP Camera? Explained \U0001f525\U0001f525\U0001f525'

썸네일 이미지 URL도 속성 하나로 바로 얻을 수 있습니다.

>>> yt.thumbnail_url
'https://i.ytimg.com/vi/-KnAZcXzxRA/default.jpg'

4. 다운로드 가능한 스트림(포맷) 목록 확인

다운로드할 미디어 포맷을 선택해야 합니다. pytube는 해상도·코덱·음질이 서로 다른 다양한 스트림을 제공하며, streams.all() 메서드로 전체 목록을 확인할 수 있습니다.

>>> yt.streams.all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">, <Stream: itag="43" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp8.0" acodec="vorbis">, <Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">, <Stream: itag="36" mime_type="video/3gpp" res="240p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">, <Stream: itag="17" mime_type="video/3gpp" res="144p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">, <Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028">, <Stream: itag="248" mime_type="video/webm" res="1080p" fps="30fps" vcodec="vp9">, <Stream: itag="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f">, <Stream: itag="247" mime_type="video/webm" res="720p" fps="30fps" vcodec="vp9">, <Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401f">, <Stream: itag="244" mime_type="video/webm" res="480p" fps="30fps" vcodec="vp9">, <Stream: itag="397" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.05M.08">, <Stream: itag="134" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.4d401e">, <Stream: itag="243" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp9">, <Stream: itag="396" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.05M.08">, <Stream: itag="133" mime_type="video/mp4" res="240p" fps="30fps" vcodec="avc1.4d400d">, <Stream: itag="242" mime_type="video/webm" res="240p" fps="30fps" vcodec="vp9">, <Stream: itag="395" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.05M.08">, <Stream: itag="160" mime_type="video/mp4" res="144p" fps="30fps" vcodec="avc1.4d400c">, <Stream: itag="278" mime_type="video/webm" res="144p" fps="30fps" vcodec="vp9">, <Stream: itag="394" mime_type="video/mp4" res="None" fps="30fps" vcodec="av01.0.05M.08">, <Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">, <Stream: itag="171" mime_type="audio/webm" abr="128kbps" acodec="vorbis">, <Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus">, <Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus">, <Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus">]

목록에는 MP4, WebM, 3GPP 등 다양한 컨테이너 형식과 144p부터 1080p까지의 해상도, 그리고 음원 추출용 오디오 전용 스트림까지 포함되어 있습니다. 참고로 고해상도(720p 이상) 스트림은 대부분 영상과 음성이 분리되어 있으므로, 필요에 따라 병합 작업이 추가될 수 있습니다.

5. 스트림 선택 후 다운로드

여기서는 첫 번째 스트림(720p MP4)을 선택해 보겠습니다.

>>> stream = yt.streams.first()
>>> stream
<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">

download() 메서드에 저장 경로를 지정하면 해당 위치에 파일이 저장됩니다.

>>> stream.download('f:/')
'f:/Redmi Note 7 Fake 48MP Camera Explained \U0001f525\U0001f525\U0001f525.mp4'

인자를 생략하면 현재 작업 디렉터리에 다운로드됩니다.

>>> stream.download()
'C:\\Python\\Python361\\Redmi Note 7 Fake 48MP Camera Explained \U0001f525\U0001f525\U0001f525.mp4'

실행이 끝나면 지정한 경로에 영상 파일이 정상적으로 저장된 것을 확인할 수 있습니다.

마무리

이처럼 pytube를 활용하면 외부 다운로더 프로그램이나 유료 서비스 없이도, 순수 파이썬 코드만으로 유튜브 영상의 정보 조회부터 포맷 선택, 파일 저장까지 자유롭게 처리할 수 있습니다. 반복적인 다운로드 작업을 자동화하고 싶다면 pytube는 훌륭한 출발점이 될 것입니다. 다만 유튜브 구조 변경에 따라 라이브러리가 동작하지 않을 수 있으니, 사용 전 최신 버전 업데이트 여부를 함께 확인해 보시기 바랍니다.