Coding

유튜브 다운 받는 파이썬 프로그램

이번 프로그램은 파이썬을 이용하여 유튜브 동영상을 다운로드 하는 프로그램으로 프로그램 실행 시  다운로드 진행율 을 표시해 주고, 다운로드가 완료되면 해당 동영상의 다운로드가 완료 되었다고 보여주는

간단한 프로그램입니다.

파이썬을 처음 실행하는 것이라면 아래 포스팅 먼저 확인해보세요

파이썬을 위한 HTML 기초

유튜브 다운 완성된 프로그램 실행 화면

유튜브 다운 받는 파이썬 프로그램

최종 완성된 프로그 램의 결과화면은 아래와 같습니다.

(1) 프로그램 실행시 다운로드 진행율을 알려주고, 지정된 폴더에 유튜브 동영상을 다운로드 해줍니다.

유튜브 다운 프로그램 세부 내용

O 완성된 소스
from pytube import YouTube
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

url = input ('주소를 주세요: ')

yt = YouTube(url)
title = yt.title

print("[영상 제목]", yt.title) # 영상제목
print("[영상 게시자]", yt.author) # 영상 게시자
print("[조회수]", yt.views)
print("[평균평점]", yt.rating) # 평균 평점
print("[영상길이(초)]", yt.length)
print("[연령제한여부]", yt.age_restricted)
print("[영상 설명]", yt.description) # 영상 설명
print("[썸네일URL]", yt.thumbnail_url,"\n\n") # 썸네일 url 주소


def on_progress(vid, chunk, bytes_remaining):
total_size = vid.filesize
bytes_downloaded = total_size - bytes_remaining
percentage_of_completion = bytes_downloaded / total_size * 100
totalsz = (total_size/1024)/1024
totalsz = round(totalsz,1)
remain = (bytes_remaining / 1024) / 1024
remain = round(remain, 1)
dwnd = (bytes_downloaded / 1024) / 1024
dwnd = round(dwnd, 1)
percentage_of_completion = round(percentage_of_completion,2)

#print(f'Total Size: {totalsz} MB')
print(f'Download Progress: {percentage_of_completion}%, Total Size:{totalsz} MB, Downloaded: {dwnd} MB, Remaining:{remain} MB')

yt = YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download('./imsi')

print(title,"(",url,")", " 가 다운로드 완료 되었습니다.\n")
print("#############################################################\n")
O 소스 다운로드
– 소스파일 다운로드 후 cmd 또는 파워쉘, 비주얼스튜디오코드 등에서 아래와 같이 실행하시기 바랍니다.
# pytube 모듈 설치
> python -m pip install pytube
# 소스(소스명:pytube3.py) 실행
> python pytube3.py

O 핵심 내용

1. from pytube import YouTube <– ‘pytube 패키지에서 YouTube 모듈부분을 사용하겠다’ 라는의미

2. yt = YouTube(url) <– 유튜브 영상의 정보를 뽑아내서 yt변수에 저장

3. title = yt.title <– 하단의 다운로드 완료 메시지를 뿌리는데 사용하기 위해 keep해 둠

4. print(“[영상 제목]”, yt.title)  <– 영상의 각종 정보를 보여줌

5. def on_progress() <– 영상의 다운로드 진행율을 표시하기 위해 사용자 정의 함수로 만들어 둠

6. on_progress_callback=on_progress <– 콜백에 내가 만든 사용자 정의 함수(on_progress)를 지정, 만일 사용자 정의 함수가 없는 경우 디폴드 함수(on_progress로 이름이 동일함)가 실행됨

7. streams.filter(res=”720p”) <– 영상의 화질을 지정

8. download(‘./imsi’) <– 다운로드 폴더를 지정


O 기본 내용

아래 세부 설명을 위해 단계별(Part I, Part II, Part III)로 나누어서 설명드리겠습니다.

Part I. 기본

-기본적인 유튜브 동영상 다운로드 버전입니다.

from pytube import YouTube
from pytube.cli import on_progress


link = 'https://?'

# link=input('enter url:')
yt=YouTube(link,on_progress_callback=on_progress) # on_progress_callback 으로 on_progress를 지정하거나, 사용자 정의 함수를 지정할 수 있음

videos=yt.streams.first() # 첫번째 스트림을 가져옴
videos.download()
print("################# 다운로드 완료 #############################")

1.아래 사이트에서 pytube 모듈의 전반적인 사용방법을 보실 수 있으며, 자세한 내용은 pytube.io 에서 확인 가능합니다.

먼저, 모듈을 pip로 설치하셔야 합니다.

https://github.com/pytube/pytube

 

 

2. 아래와 같이 소스를 작성합니다.

from pytube.cli import on_progress <– 디폴트 함수 on_progress 을 사용해야 하므로 모듈을 선언해 줍니다.

그리고, 다운로드 받을 유튜브 주소를 복사하여 link변수에 할당 후 유튜브 모듈(YouTube(link, on_progress_callback=on_progress) )을 yt변수에 할당합니다. 그리고 스트림을 가져와서 다운로드 합니다.

 

 

3. 실제 실행하면 아래와 같이 진행상태 bar가 나타나고 완료됩니다.

 

 

 4. 폴더에 가서 확인한 결과 프로그램을 실행한 폴더에 잘 다운로드 된 것을 확인할 수 있습니다.

 

 

 5. 그런데, 문제가 있습니다. 실제 동영상을 확인해 보니 화질이 너무 좋지 않아 내용을 확인하기가 어렵습니다.

아래에서 우리는 이문제를 해결할 것입니다.

 

 


 Part II. 응용

-기본적인 유튜브 동영상 다운로드 버전을 응용한 버전입니다.

from pytube import YouTube
# from pytube.cli import on_progress #this module contains the built in progress bar.


def on_progress(vid, chunk, bytes_remaining):
    total_size = vid.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = bytes_downloaded / total_size * 100
    totalsz = (total_size/1024)/1024
    totalsz = round(totalsz,1)
    remain = (bytes_remaining / 1024) / 1024
    remain = round(remain, 1)
    dwnd = (bytes_downloaded / 1024) / 1024
    dwnd = round(dwnd, 1)
    percentage_of_completion = round(percentage_of_completion,2)

    #print(f'Total Size: {totalsz} MB')
    print(f'Download Progress: {percentage_of_completion}%, Total Size:{totalsz} MB, Downloaded: {dwnd} MB, Remaining:{remain} MB')
#
url = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&t=9s'

# yt = YouTube(url, on_progress_callback=on_progress)
yt = YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download()

 1. def on_progress(vid, chunk, bytes_remaining): <– 사용자 정의 함수를 지정하였습니다. 사실 이 함수는 없어도 무방합니다. 만일 이 함수가 없으면 pytube의 내장 기본 함수인 on_progress(함수 이름이 동일함)가 실행됩니다.

아래에서는 내가 만든 사용자정의 함수인 on_progress()를 만들어 지정하였고(따라서 from pytube.cli import on_progress <– 모듈을 임포트할 필요가 없음), 화질도 720p(streams.filter(res=”720p”))로 올려 줬습니다.

 

 

2. 실제 실행 결과 다운로드 시 파일이 얼마나 받아졌는지 진행율과 전체크기, 다운로드된 사이즈 및 남은 사이즈를 보여주고 있습니다.

 

 

3. 최종 완료 이후 프로그램을 실행한 폴더에 가서 확인한 결과 해당 경로에 잘 받아진 것을 확인할 수 있습니다. 화질을 높였더니 ‘.mp4’ 확장자로 받아진 것으로 알 수 있습니다.

 

4. 영상을 실행해 보니 이전보다 화질이 많이 좋아진 것을 확인할 수 있습니다.

 

 

Part III. 응용2

-기본적인 유튜브 동영상 다운로드 버전을 응용한 버전을 다시 몇가지 기능을 추가한 버전입니다.

from pytube import YouTube

url = '?'

yt = YouTube(url)
title = yt.title

print("[영상 제목]", yt.title)  # 영상제목
print("[영상 게시자]", yt.author) # 영상 게시자
print("[조회수]", yt.views)
print("[평균평점]", yt.rating) # 평균 평점
print("[영상길이(초)]", yt.length)
print("[연령제한여부]", yt.age_restricted)
print("[영상 설명]", yt.description) # 영상 설명
print("[썸네일URL]", yt.thumbnail_url,"\n\n") # 썸네일 url 주소


def on_progress(vid, chunk, bytes_remaining):
    total_size = vid.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = bytes_downloaded / total_size * 100
    totalsz = (total_size/1024)/1024
    totalsz = round(totalsz,1)
    remain = (bytes_remaining / 1024) / 1024
    remain = round(remain, 1)
    dwnd = (bytes_downloaded / 1024) / 1024
    dwnd = round(dwnd, 1)
    percentage_of_completion = round(percentage_of_completion,2)

    #print(f'Total Size: {totalsz} MB')
    print(f'Download Progress: {percentage_of_completion}%, Total Size:{totalsz} MB, Downloaded: {dwnd} MB, Remaining:{remain} MB')

yt = YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download('./imsi')

print(title,"(",url,")", " 가 다운로드 완료 되었습니다.\n")
print("#############################################################\n")

1. 다른 부분은 Part II와 동일하며, 다운로드 시 폴더를 지정할 수 있도록 download(‘./imsi’) 와 같이 imsi폴더를 지정해 주었습니다.

 

 

 2. 영상 다운로드 시 다운받은 영상의 기본적 정보를 표시해주고, 다운로드 상태를 보여준 다음 다운로드가 완료되었습니다.

 

 

완성된 프로그램 실행 화면
– 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

(1) 프로그램 실행시 재생목록의 전체 영상 개수를 보여주고, 순차적으로 하나씩 다운로드 진행율을 표시하면서 지정된 폴더로 영상 다운로드가 진행됩니다.

 

세부 내용
O 완성된 소스

from pytube import Playlist
url = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&list=PL-c3IMzE1Ofo3QFnr2bUYsELEz4wcgTx3'
playlist = Playlist(url)
print('동영상 재생목록 수: %s' % len(playlist.video_urls))
print('재생목록 제목: %s' % playlist.title)
num = len(playlist.video_urls)

def on_progress(vid, chunk, bytes_remaining):
    total_size = vid.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = bytes_downloaded / total_size * 100
    totalsz = (total_size/1024)/1024
    totalsz = round(totalsz,1)
    remain = (bytes_remaining / 1024) / 1024
    remain = round(remain, 1)
    dwnd = (bytes_downloaded / 1024) / 1024
    dwnd = round(dwnd, 1)
    percentage_of_completion = round(percentage_of_completion,2)

    #print(f'Total Size: {totalsz} MB')
    print(f'Download Progress: {percentage_of_completion}%, Total Size:{totalsz} MB, Downloaded: {dwnd} MB, Remaining:{remain} MB')

path = './imsi'
i = 1
for video in playlist.videos: # playlist의 영상을 하나씩 돌면서
    video.register_on_progress_callback(on_progress) # 다운로드 상태를 보여주기 위해 사용자 정의 함수(on_progress())를 호출하고,
    video.streams.filter(res="360p").first().download(path) # 화질과 다운로드 패스를 지정 후
    print(i," 번째 동영상이 다운로드 되었습니다.","(",video.title,")\n") # 영상이 다운로드 되면 안내 메시지를 보여줌
    i = i + 1

print(num, "개의 동영상이 모두 다우로드 완료되었습니다.")

완성 파일은 아래 링크에서도 다운 받을 수 있습니다.

O 소스 다운로드
– 소스파일 다운로드 후 cmd 또는 파워쉘, 비주얼스튜디오코드 등에서 아래와 같이 실행하시기 바랍니다.
# pytube 모듈 설치
> python -m pip install pytube
# 소스(소스명:pytube_playlist1.py) 실행 

> python pytube_playlist1.py

핵심 내용

1. from pytube import Playlist <– ‘pytube 패키지에서 Playlist 모듈부분을 사용하겠다’ 라는의미

2. len(playlist.video_urls) <– 재생목록의 영상의 개수 (갯수 확인을 위해 len()함수 사용)

3. playlist.title <– 재생목록의 제목(영상의 제목이 아님)

4. video.title <– 재생목록 내 영상의 제목

5. num = len(playlist.video_urls) <– 최종 다운로드 완료 시 받은 전체 개수를 표시하기 위해 num변수에 저장

6. def on_progress() <– 영상의 다운로드 진행율을 표시하기 위해 사용자 정의 함수로 만들어 둠

7. path = ‘./imsi’ <– 영상을 다운로드 받을 위치 지정

8. video.register_on_progress_callback(on_progress) <– 재생목록 내 영상의 다운로드 상태를 표시하기 위해 ‘register_on_progress_callback(on_progress)’와 같은 표현을 사용


O 기본 내용

1. 다른 부분은 이전 영상과 유사하며, for문을 이용하여 재생목록의 내의 영상을 하나씩 확인 후 다운로드 상태를 표시하기 위해 on_progress()함수를 호출하고, 스트림에 화질설정과 다운로드 경로를 지정 후, 영상이 다운로드 될때마다 안내 메시지를 뿌려줍니다.

 

 

2. 실제 프로그램 실행 시 재생목록 수, 다운로드 상태(진행율, 영상의 전체 크기/다운로드된 사이즈/남은사이즈)를 보여주고, 다운로드가 진행됩니다.

 

3. 지정된 폴더에 가서 확인한 결과 동영상이 모두 다운로드된 것을 확인 할 수 있습니다

ㅁ 정리
O 우리가 배운 내용
– 오늘은 파이썬으로 유튜브 동영상의 재생목록을 한꺼번에 다운로드하는 프로그램을 만들어 보았습니다.
– 오늘 우리가 배운 내용을 간단히 정리해 보면 다음과 같습니다.
> 1. ‘from pytube import Playlist’ 와 같이 모듈 임포트
> 2. 다운로드할 유튜브 동영상 url 주소 복사 후
> 3. on_progress()함수 사용자 정의(선택사항)
> 4. for문을 이용하여 재생목록 내 영상을 하나씩 확인 후
> 5. ‘video.register_on_progress_callback(on_progress)’ 구문을 이용하여 다운로드 상태를 보여주고,
> 6. 유튜브 영상 다운로드시 화질(예: 360p)과 다운로드 폴더를 설정(예: download(path) )
올려드린 프로그램이 간혹 작동되지 않는 경우가 있습니다. 이 문제의 대부분의 원인은 pytube 모듈이 업데이트 되었기 때문인데, 아래와 같이 해보시고 그래도 안되시면 댓글을 남겨주시기 바랍니다.
>pip install --upgrade pytube
urjent

Recent Posts

앤틱거울 양파 복면가왕 494-495회

앤틱거울 양파 복면가왕 494-495회 2025년 5월 11일 방송된 MBC <복면가왕> 494회에서는 감미로운 목소리로 시청자들을 매료시킨…

40 분 ago

챗GPT 뉴스 자동화 개인비서 만들기 튜토리얼 쉽게 가르쳐 드려요

챗GPT 뉴스 자동화 개인비서 만들기 튜토리얼 쉽게 가르쳐 드려요 |  아침마다 쏟아지는 뉴스, 빠르게 확인하고…

2시간 ago

챗GPT 워터마크 이용해서 AI 글인지 감지할 수 있다고?

챗GPT 워터마크 이용해서 AI 글인지 감지할 수 있다고? 최근 인터넷에서 읽는 많은 글이 사람의 손이…

14시간 ago

이경실 경매 나이 재산 매력 한 눈에 살펴보자

이경실 경매 나이 재산 매력 한 눈에 살펴보자 이경실은 대한민국을 대표하는 코미디언으로, 오랜 시간 많은…

14시간 ago

하트페어링 김수아 나이 직업 매력 포인트 알아봐요

하트페어링 김수아 나이 직업 매력 포인트 알아봐요 최근 채널A의 연애 예능 프로그램 ‘하트페어링’ 이 많은…

21시간 ago

탄금 뜻 원작 인물 줄거리 드라마 2025년 멜로 사극

탄금 뜻 원작 인물 줄거리 드라마 2025년 멜로 사극 | 넷플릭스 오리지널 드라마 탄금은 2025년…

22시간 ago