파이썬 pytube로 유튜브 영상과 음원 추출하기

최근에 중국 노래를 즐겨 듣는데 멜론 스트리밍에 없는 곡이 많았습니다. 그래서 유튜브로 듣곤 하는데 프리미엄 결제를 하기 싫어 파이썬으로 음원을 추출하기로 했습니다. 인터넷 상에 음원을 받아주는 사이트도 많지만, 개수 제한이 있거나 하나하나 올리기 귀찮은 문제가 있습니다. 파이썬 pytube라는 라이브러리를 이용하면 유튜브의 영상과 음원을 쉽게 받을 수 있는데 사용한 김에 정리해 보았습니다.




pytube 라이브러리 설치

1. 터미널에서 pytube 라이브러리를 설치합니다.

pip install pytube



단일 영상/음원 다운로드

1
2
3
4
5
6
7
8
9
from pytube import YouTube
 
yt = YouTube(‘http://youtube.com/watch?v=2lAe1cqCOXo’)
 
stream_video = yt.streams.get_by_itag(137)
 
stream_audio = yt.streams.get_by_itag(140)
 
stream_video.download()
cs

5와 7의 스트림 설정은 아래에서 좀 더 자세히 다루겠습니다. 추출된 mp4 파일을 mp3로 변환해 본 결과 용량이 감소하는 등의 장점이 없어 확장자가 상관 없다면 그냥 사용하는 게 좋을 것 같습니다.

1 – pytube 라이브러리의 YouTube 포함.
3 – 유튜브 영상 주소 입력.
5 – 1080p 비디오로 다운로드 설정.
7 – 128kbps 음원으로 다운로드 설정.
9 – 영상을 추출하는 함수.




플레이리스트 영상/음원 다운로드

1
2
3
4
5
6
from pytube import Playlist
 
= Playlist(‘https://www.youtube.com/playlist?list=리스트ID’)
 
for video in p.videos:
    video.streams.get_by_itag(140).download()
cs

1 – pytube 라이브러리의 Playlist 포함.
3 – 플레이리스트 주소 입력.
5:6 – 리스트의 영상을 128kbps 음원으로 추출.




채널 영상/음원 다운로드

1
2
3
4
5
6
from pytube import Channel
 
= Channel(‘https://www.youtube.com/c/%ED%96%89%EC%84%B1’)
 
for video in c.videos:
    video.streams.get_by_itag(140).download()
cs

1 – pytube 라이브러리의 Channel 포함.
3 – 채널의 주소 입력.
5:6 – 채널의 영상을 128kbps 음원으로 추출.




예외처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from pytube import Playlist, YouTube
 
playlist_url = ‘https://www.youtube.com/playlist?list=리스트ID’
 
= Playlist(playlist_url)
 
downloade_count = 0
 
for url in p.video_urls:
    try:
        yt = YouTube(url)
    except:
        print(f‘Video {url} is unavaialable, skipping.’)
    else:
        print(f‘Downloading video: {url}’)
        yt.streams.first().download()
    finally:
        downloade_count += 1
        print(f‘Downloading Process: {downloade_count}/{p.length}’)
cs

예외처리를 하면 여러 영상/음원을 다운로드하는 중에 오류가 발생해도 그 부분만 건너뛰고 나머지를 받을 수 있습니다. try는 실행 될 코드, except는 오류 발생 시, else는 오류가 발생하지 않았을 때, finally는 오류와 상관없이 무조건 실행됩니다.

7 – 다운로드 횟수를 표시할 때 사용.
10:11 – 실행되는 코드 부분.
12:13 – 11의 코드에서 오류가 발생하면 메시지 띄우고 PASS.
14:16 – 오류가 발생하지 않았다면 다운로드 실행.
17:19 – 오류 발생과 상관없이 몇 번째 다운로드인지 표시.




스트림 필터링

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pytube import YouTube
 
yt = YouTube(‘http://youtube.com/watch?v=2lAe1cqCOXo’)
 
print(yt.streams)
 
[<Stream: itag=”137″ mime_type=”video/mp4″ res=”1080p” fps=”30fps” vcodec=”avc1.640028″ progressive=”False” type=”video”>,
<Stream: itag=”248″ mime_type=”video/webm” res=”1080p” fps=”30fps” vcodec=”vp9″ progressive=”False” type=”video”>,
<Stream: itag=”399″ mime_type=”video/mp4″ res=”None” fps=”30fps” vcodec=”av01.0.08M.08″ progressive=”False” type=”video”>,
<Stream: itag=”250″ mime_type=”audio/webm” abr=”70kbps” acodec=”opus” progressive=”False” type=”audio”>,
<Stream: itag=”251″ mime_type=”audio/webm” abr=”160kbps” acodec=”opus” progressive=”False” type=”audio”>]
 
yt.streams.filter(only_audio=True)
 
yt.streams.filter(file_extension=‘mp4’)
cs

5 – 스트림에 따라 확장자, 화질, 음질이 다름.
15 – 오디오인 스트림만 추출.
17 – mp4인 스트림만 추출.




파이썬 pytube API

유튜브 개체

.title영상의 제목
.thumbnail_url영상의 썸네일 주소
.streams영상의 스트림 목록
.author영상의 게시자
.description영상의 설명
.length영상의 길이(초)
.publish_date영상의 배포 날짜
.views조회수


플레이리스트 개체

.title리스트의 제목
.length동영상의 개수
.videos동영상의 url 리스트
.owner리스트 소유자
.owner_id소유자의 채널 id


채널 개체

.channel_name채널의 이름
.length동영상의 개수
.videos동영상의 url 리스트
.owner채널 소유자
.channel_id채널 id




참조 사이트

[Pytube 문서]
Pytube document



관련글

guest
0 Comments
Inline Feedbacks
모든 댓글 보기