본문 바로가기
코딩 연습

유튜브 영상 저장 - 한 번에 여러 영상 저장하는 방법

by good4me 2023. 2. 9.

goodthings4me.tistory.com

유튜브 영상 저장을 하는 파이썬 코드를 chatGPT에 물어보고 만들다 보니 예전에 만들어서 포스팅했던 글(유튜브 영상 다운로드)에 덧붙여서 여러 동영상을 저장하는 코드(selenium 모듈 사용)도 만들어봤다.

 

 

유튜브 영상 고화질 다운로드 - 다수의 영상을 저장하는 파이썬 코드

아래와 같은 유뷰트 영상 사이트(https://www.youtube.com/@kescotv)에서

창호 샷시 교체 전문회사인 케스코 유튜브
창호 샷시 교체 전문회사인 케스코 유튜브

"모두재생" 부분을 클릭하면, 우측에 유튜브 영상 리스트가 보인다. 이 리스트에 있는 영상 전체를 받는 파이썬 코드를 연습 삼아 작성해 보았다.

케스코TV 영상 리스트
케스코TV 영상 리스트

 

import os
from selenium import webdriver
import chromedriver_autoinstaller
from selenium.webdriver.common.by import By
from pytube import YouTube
from pytube.cli import on_progress
import time
import random


def chrome_driver():
    options = webdriver.ChromeOptions()
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
    options.add_argument(f'user-agent={user_agent}')
    options.add_argument("headless")  # 웹 브라우저를 시각적으로 띄우지 않는 headless chrome 옵션
    options.add_argument("lang=ko_KR")  # 언어 설정
    options.add_experimental_option('detach', True) # True는 창 안 사라지게 
    options.add_experimental_option("excludeSwitches", ["enable-logging"])  # DevTool 개발도구 로그 숨기기
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")

    # 크롬 브라우저 버전 확인하기
    chrome_ver = chromedriver_autoinstaller.get_chrome_version()
    print(chrome_ver)  # 108.0.5359.125

    # 크롬 드라이버 자동 설치
    chromedriver_autoinstaller.install(True)
    chromedriver_path = f'./{chrome_ver.split(".")[0]}/chromedriver.exe'
    if os.path.exists(chromedriver_path):
        print(f'크롬 드라이버 버전 {chrome_ver.split(".")[0]} 있음!')
    else:
        chromedriver_autoinstaller.install(True)  # 크롬 드라이버 다운로드
        print(f'크롬 드라이버 설치 완료!({chrome_ver.split(".")[0]} 버전)')

    driver = webdriver.Chrome(options=options)

    return driver


def youtube_download(url):
    # 저장 폴더 만들기
    save_folder = './youtube_download'
    if not os.path.exists(save_folder):
        os.mkdir(save_folder)
    else:
        pass
    
    try:
        # YouTube 객체 생성
        yt = YouTube(url, on_progress_callback=on_progress)
        # print(yt.streams)  # streams 처리 전체 정보
        print(f'영상제목: {yt.title}')
        print(f'영상 설명: {yt.description}')
        print(f'영상 조회수: {yt.views}')
        print(f'영상 길이: {yt.length} sec. [{str(yt.length // 60).zfill(2)}:{str(yt.length % 60).zfill(2)}]')
        print(f'영상 채널 URL: {yt.channel_url}')
        print(f'영상 URL: {yt.watch_url}')
        print(f'영상 등록일: {yt.publish_date}')

        # 영상 다운로드
        yt.streams.get_highest_resolution().download(save_folder)
        print(f'\n\n유튜브 영상 "{yt.title}"\n다운로드 완료!')
        return True
    except Exception as e:
        print(f'Error: {e}')
        return False


def main():
    driver = chrome_driver()
    url = 'https://www.youtube.com/watch?v=UKdV7PdZOLQ&list=UULF4mflJiSnz2YD0NyEFjRLAQ'
    driver.get(url)
    driver.implicitly_wait(5)
    time.sleep(random.uniform(0.5, 1.5))
    get_url = driver.current_url
    print(get_url)
    a_tags = driver.find_elements(By.CSS_SELECTOR, 'div#columns div#container div#items a#wc-endpoint')
    print(len(a_tags))

    play_list = []
    for a_tag in a_tags:
        play_list.append(a_tag.get_attribute('href'))

    return play_list, len(a_tags)


if __name__ == '__main__':
    movie_url_list, total = main()
    print(movie_url_list)
    for cnt, url in enumerate(movie_url_list, 1):
        youtube_download(url)
        print(f'\n{cnt}/{total} 다운로드 완료!')
        time.sleep(3)
  • "모두재생" 부분을 클릭해서 전환된 웹페이지의 URL을 main() 함수의 url 값으로 입력함
  • chrome webdriver를 자동으로 설치하는 함수를 호출해서 셀레니움으로 유튜브 영상의 URL을 모두 추출하여 리스트(play_list)로 저장
  • 반환받은 리스트를 for문으로 순환시키며 youtube_download() 함수 호출
  • 다운로드한 파일은 youtube_download 폴더에 저장됨

 

good4me.co.kr

 

[실행결과]

40
['https://www.youtube.com/watch?v=UKdV7PdZOLQ&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=1', 'https://www.youtube.com/watch?v=zFyLYlnIkd8&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=2', 'https://www.youtube.com/watch?v=sa-w0LlcFSw&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=3', 'https://www.youtube.com/watch?v=Mpv4qQf9G-g&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=4', 'https://www.youtube.com/watch?v=B-k11Hai5q8&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=5', 'https://www.youtube.com/watch?v=kcGfpF8DwtU&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=6', 'https://www.youtube.com/watch?v=I_6HlgSS1E4&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=7', 'https://www.youtube.com/watch?v=fIY3YnjN5Ds&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=8', 'https://www.youtube.com/watch?v=OMWWSGj8is8&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=9', 'https://www.youtube.com/watch?v=aOhvWHz4KoU&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=10', 'https://www.youtube.com/watch?v=UVay8f3e5tk&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=11', 'https://www.youtube.com/watch?v=13I-FsDg560&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=12', 'https://www.youtube.com/watch?v=ebxmxMX1xFw&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=13', 'https://www.youtube.com/watch?v=FW4I5kQcZ7M&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=14', 'https://www.youtube.com/watch?v=1U33V7-U67Q&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=15', 'https://www.youtube.com/watch?v=gID695INC7s&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=16', 'https://www.youtube.com/watch?v=fsEdx4J8WOI&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=17', 'https://www.youtube.com/watch?v=pxZ-2SqlHZc&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=18', 'https://www.youtube.com/watch?v=zwhZa6i-tq4&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=19', 'https://www.youtube.com/watch?v=mff12EyFrmo&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=20', 'https://www.youtube.com/watch?v=QaACO69DQUw&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=21', 'https://www.youtube.com/watch?v=fu9tiwGOdRs&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=22', 'https://www.youtube.com/watch?v=ystAMDyLUes&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=23', 'https://www.youtube.com/watch?v=2Ex4BSh9Jw4&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=24', 'https://www.youtube.com/watch?v=o92pAlMCtvA&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=25', 'https://www.youtube.com/watch?v=Ak1IFREK7zM&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=26', 'https://www.youtube.com/watch?v=j2DMmY3C238&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=27', 'https://www.youtube.com/watch?v=-gPQnmP9cjc&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=28', 'https://www.youtube.com/watch?v=3gZKCYTPB8o&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=29', 'https://www.youtube.com/watch?v=hIJXPnaC9tg&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=30', 'https://www.youtube.com/watch?v=izUrK_MsbOA&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=31', 'https://www.youtube.com/watch?v=h5X5eeaT3KQ&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=32', 'https://www.youtube.com/watch?v=PR-pT2_mlVY&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=33', 'https://www.youtube.com/watch?v=y3f1UenHWEI&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=34', 'https://www.youtube.com/watch?v=qq2tGHRDesw&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=35', 'https://www.youtube.com/watch?v=HwBhnVp-1aQ&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=36', 'https://www.youtube.com/watch?v=811q8lrUmfM&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=37', 'https://www.youtube.com/watch?v=HOecxXsUXOc&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=38', 'https://www.youtube.com/watch?v=N6GRi8UNQFY&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=39', 'https://www.youtube.com/watch?v=owYz2mHWf8w&list=UULF4mflJiSnz2YD0NyEFjRLAQ&index=40']
영상제목: [케스코TV] 시공현장을 찾아서 1화
영상 설명: [ 창호 교체 문의 ]
. 1588-0730
. 5초견적 받아보기 https://bit.ly/3ZIqbhE

[ 관련SNS ]
. 홈페이지 http://k-esco.kr/
. 블로그 https://blog.naver.com/k-esco
. 인스타그램 https://www.instagram.com/kesco_kr/       

영상 조회수: 245
영상 길이: 295 sec. [04:55]
영상 채널 URL: https://www.youtube.com/channel/UC4mflJiSnz2YD0NyEFjRLAQ
영상 URL: https://youtube.com/watch?v=UKdV7PdZOLQ      
영상 등록일: 2023-01-18 00:00:00
 ↳ |██████████████████████████████| 100.0%

유튜브 영상 "[케스코TV] 시공현장을 찾아서 1화"
다운로드 완료!
영상제목: 샷시교체, 1등 업체에서 손쉽게 견적을 받아보세요!
영상 설명: [ 창호 교체 문의 ]
. 1588-0730
. 5초견적 받아보기 https://bit.ly/3jLtswp

영상 조회수: 54078
영상 길이: 42 sec. [00:42]
영상 채널 URL: https://www.youtube.com/channel/UC4mflJiSnz2YD0NyEFjRLAQ
영상 URL: https://youtube.com/watch?v=zFyLYlnIkd8      
영상 등록일: 2023-01-02 00:00:00
 ↳ |██████████████████████████████| 100.0%

유튜브 영상 "샷시교체, 1등 업체에서 손쉽게 견적을 받아 보세요!"
다운로드 완료!
영상제목: 그린리모델링 통영
영상 설명:
영상 조회수: 73
영상 길이: 82 sec. [01:22]
영상 채널 URL: https://www.youtube.com/channel/UC4mflJiSnz2YD0NyEFjRLAQ
영상 URL: https://youtube.com/watch?v=sa-w0LlcFSw      
영상 등록일: 2022-12-23 00:00:00
 ↳ |██████████████████████████████| 100.0%

유튜브 영상 "그린리모델링 통영"
다운로드 완료!
영상제목: [케스코X그린리모델링] 부산광역시 노후단독주택 시공
영상 설명:
영상 조회수: 118
영상 길이: 82 sec. [01:22]
영상 채널 URL: https://www.youtube.com/channel/UC4mflJiSnz2YD0NyEFjRLAQ
영상 URL: https://youtube.com/watch?v=Mpv4qQf9G-g      
영상 등록일: 2022-12-23 00:00:00
 ↳ |██████████████████████████████| 100.0%

유튜브 영상 "[케스코X그린리모델링] 부산광역시 노후단독 주택 시공"
다운로드 완료!
영상제목: [케스코X그린리모델링] 강원도 원주시 노후단독
주택시공
영상 설명:
영상 조회수: 144
영상 길이: 82 sec. [01:22]
영상 채널 URL: https://www.youtube.com/channel/UC4mflJiSnz2YD0NyEFjRLAQ
영상 URL: https://youtube.com/watch?v=B-k11Hai5q8      
영상 등록일: 2022-12-19 00:00:00
 ↳ |██████████████████████████████| 100.0%

- 이하 생략 -

 

 

댓글