이번 프로그램은 파이썬을 이용하여 유튜브 동영상을 다운로드 하는 프로그램으로 프로그램 실행 시 다운로드 진행율 을 표시해 주고, 다운로드가 완료되면 해당 동영상의 다운로드가 완료 되었다고 보여주는
간단한 프로그램입니다.
파이썬을 처음 실행하는 것이라면 아래 포스팅 먼저 확인해보세요
목차
(1) 프로그램 실행시 다운로드 진행율을 알려주고, 지정된 폴더에 유튜브 동영상을 다운로드 해줍니다.
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")
# pytube 모듈 설치
> python -m pip install pytube
# 소스(소스명:pytube3.py) 실행
> python pytube3.py
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’) <– 다운로드 폴더를 지정
아래 세부 설명을 위해 단계별(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) 프로그램 실행시 재생목록의 전체 영상 개수를 보여주고, 순차적으로 하나씩 다운로드 진행율을 표시하면서 지정된 폴더로 영상 다운로드가 진행됩니다.
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, "개의 동영상이 모두 다우로드 완료되었습니다.")
완성 파일은 아래 링크에서도 다운 받을 수 있습니다.
# 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)’와 같은 표현을 사용
1. 다른 부분은 이전 영상과 유사하며, for문을 이용하여 재생목록의 내의 영상을 하나씩 확인 후 다운로드 상태를 표시하기 위해 on_progress()함수를 호출하고, 스트림에 화질설정과 다운로드 경로를 지정 후, 영상이 다운로드 될때마다 안내 메시지를 뿌려줍니다.
2. 실제 프로그램 실행 시 재생목록 수, 다운로드 상태(진행율, 영상의 전체 크기/다운로드된 사이즈/남은사이즈)를 보여주고, 다운로드가 진행됩니다.
3. 지정된 폴더에 가서 확인한 결과 동영상이 모두 다운로드된 것을 확인 할 수 있습니다
>pip install --upgrade pytube
앤틱거울 양파 복면가왕 494-495회 2025년 5월 11일 방송된 MBC <복면가왕> 494회에서는 감미로운 목소리로 시청자들을 매료시킨…
챗GPT 뉴스 자동화 개인비서 만들기 튜토리얼 쉽게 가르쳐 드려요 | 아침마다 쏟아지는 뉴스, 빠르게 확인하고…
챗GPT 워터마크 이용해서 AI 글인지 감지할 수 있다고? 최근 인터넷에서 읽는 많은 글이 사람의 손이…