推荐软件产品
twitter,facebook,ins,youtube视频下载
磨针音视频转文字
磨针免费pdf转word
磨针微信定时发文件和消息
磨针c盘清理,任何场景都能释放几十G的空间

这篇文章会介绍使用Python 的pytube 第三方函式库,输入Youtube 网址后就会自动下载为影片档mp4,单纯下载为声音档mp3,甚至可以进一步下载有字幕影片的字幕,储存为srt 或txt,最后还会读取Youtube 清单内容,并将清单里的所有影片下载为mp4。。

安装pytube

输入下列指令,安装pytube ( 根据个人环境使用pip、pip3 )

!pip install pytube

读取Youtube 影片资讯

参考「pytube - YouTube Object」说明,使用pytube 读取Youtube 网址后,就能取得关于该影片的各种资讯,下方的例子会取出标题、作者、作者频道网址、影片缩图网址、影片长度、观看次数等资讯。

from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=R93ce4FZGbc')   # baby shark 的音樂
print(yt.title)           # 影片標題
print(yt.length)          # 影片長度 ( 秒 )
print(yt.author)          # 影片作者
print(yt.channel_url)     # 影片作者頻道網址
print(yt.thumbnail_url)   # 影片縮圖網址
print(yt.views)           # 影片觀看數

下载Youtube 影片为mp4

参考「pytube - StreamQuery Object」说明,可以使用get_highest_resolution() 方法,下载最高画质的影片

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=R93ce4FZGbc')
print('download...')
yt.streams.filter().get_highest_resolution().download(filename='baby_shart.mp4')
# 下載最高畫質影片,如果沒有設定 filename,則以原本影片的 title 作為檔名
print('ok!')

如果要指定下载影片的画质,可以透过get_by_resolution() 方法,填入像是720p、480p、360p、240p 等标准影像解析度格式,就能下载对应的画质( 注意,画质会必须取决于该影片实际大小是否支援)

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=R93ce4FZGbc')
print('download...')
yt.streams.filter().get_by_resolution('360p').download(filename='oxxostudio_360p.mp4')
# 下載 480p 的影片畫質
print('ok!')

如果想知道影片支援哪些画质,可印出streams.all() 来查看。

from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=R93ce4FZGbc')
print(yt.streams.all())

Python 教学- 下载Youtube 影片( mp4、mp3、字幕 )

透过宣告yt 时的参数on_progress_callback,可以回传目前下载影片的进度( 可显示下载进度)。

from pytube import YouTube

def onProgress(stream, chunk, remains):
    total = stream.filesize                     # 取得完整尺寸
    percent = (total-remains) / total * 100     # 減去剩餘尺寸 ( 剩餘尺寸會抓取存取的檔案大小 )
    print(f'下載中… {percent:05.2f}', end='\r')  # 顯示進度,\r 表示不換行,在同一行更新

print('download...')
yt = YouTube('https://www.youtube.com/watch?v=R93ce4FZGbc', on_progress_callback=onProgress)
yt.streams.filter().get_highest_resolution().download(filename='oxxostudio.mp4')
# on_progress_callback 參數等於 onProgress 函式
print()
print('ok!')

下载Youtube 影片为mp3

使用get_audio_only() 方法,能单独取出Youtube 的音轨储存为mp3 档案( 预设为mp4,存档时改档名为mp3 就会变成mp3 )。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=R93ce4FZGbc')
print('download...')
yt.streams.filter().get_audio_only().download(filename='oxxostudio.mp3')
# 儲存為 mp3
print('ok!')

下载Youtube 影片字幕为srt 或txt

使用yt.captions 方法,可以取得该Youtube 影片全部的字幕( 如果是auto 自动产生,字幕语系前方会出现a. 标示),取得字幕后,透过xml_captions 就能将指定语系的字幕转换成xml 档案

由于pytube 内建的generate_srt_captions() 方法会发生KeyError: 'start' 错误,因此直接使用BeautifulSoup 套件读取xml 的内容,再透过数学计算和字串格式化的方法,转换成字幕档案格式,最后输出成为srt 或txt。

参考:BeautifulSoupdivmod(x, y)字串格式化

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from pytube import YouTube
from bs4 import BeautifulSoup

yt = YouTube('https://www.youtube.com/watch?v=R93ce4FZGbc')
print(yt.captions)                                 # 取得所有語系
caption = yt.captions.get_by_language_code('en')   # 取得英文語系
xml = caption.xml_captions                         # 將語系轉換成 xml
#print(xml)

def xml2srt(text):
    soup = BeautifulSoup(text)                     # 使用 BeautifulSoup 轉換 xml
    ps = soup.findAll('p')                         # 取出所有 p tag 內容

    output = ''                                    # 輸出的內容
    num = 0                                        # 每段字幕編號
    for i, p in enumerate(ps):
        try:
            a = p['a']                             # 如果是自動字幕,濾掉有 a 屬性的 p tag
        except:
            try:
                num = num + 1                      # 每段字幕編號加 1
                text = p.text                      # 取出每段文字
                t = int(p['t'])                    # 開始時間
                d = int(p['d'])                    # 持續時間

                h, tm = divmod(t,(60*60*1000))     # 轉換取得小時、剩下的毫秒數
                m, ts = divmod(tm,(60*1000))       # 轉換取得分鐘、剩下的毫秒數
                s, ms = divmod(ts,1000)            # 轉換取得秒數、毫秒

                t2 = t+d                           # 根據持續時間,計算結束時間
                if t2 > int(ps[i+1]['t']): t2 = int(ps[i+1]['t'])  # 如果時間算出來比下一段長,採用下一段的時間
                h2, tm = divmod(t2,(60*60*1000))   # 轉換取得小時、剩下的毫秒數
                m2, ts = divmod(tm,(60*1000))      # 轉換取得分鐘、剩下的毫秒數
                s2, ms2 = divmod(ts,1000)          # 轉換取得秒數、毫秒


                output = output + str(num) + '\n'  # 產生輸出的檔案,\n 表示換行
                output = output + f'{h:02d}:{m:02d}:{s:02d},{ms:03d} --> {h2:02d}:{m2:02d}:{s2:02d},{ms2:03d}' + '\n'
                output = output + text + '\n'
                output = output + '\n'
            except:
                pass

    return output

#print(xml2srt(xml))
with open('oxxostudio.srt','w') as f1:
    f1.write(xml2srt(xml))    # 儲存為 srt

print('ok!')

Python 教学- 下载Youtube 影片( mp4、mp3、字幕 )

读取Youtube 清单资讯

参考「pytube - Using Playlists」说明,使用pytube 读取Youtube 清单网址后,就能将该影片清单的所有影片网址,输出成为串列。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from pytube import Playlist
playlist = Playlist('https://www.youtube.com/watch?v=mOPRaLPh-YU&list=PL9ACDjBMkp9wViVmgpYweGkNqh62pHspF')
# 讀取影片清單
print(playlist.video_urls)   # 印出清單結果
'''
['https://www.youtube.com/watch?v=mOPRaLPh-YU',
 'https://www.youtube.com/watch?v=wARhTJH1fJI',
 'https://www.youtube.com/watch?v=WLjePGUCRqc']
'''

下载Youtube 清单中所有影片为mp4

读取到影片清单中所有影片网址后,透过for 回圈,就能将所有影片下载为mp4。

import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')  # 使用 Colab 要換路徑使用

from pytube import Playlist, YouTube
playlist = Playlist('https://www.youtube.com/watch?v=mOPRaLPh-YU&list=PL9ACDjBMkp9wViVmgpYweGkNqh62pHspF')
print('download...')
for i in playlist.video_urls:
    print(i)
    yt = YouTube(i)                                           # 讀取影片
    yt.streams.filter().get_highest_resolution().download()   # 下載為最高畫質影片
print('ok!')