上一篇「YT RSS 失效後,如何取得各種播放清單資料」,說明了如何操作官方 YouTube Data API 來取得播放清單資訊,不過有這些麻煩之處:
- 需要先建立專案、申請 API 金鑰等流程
- 有每日額度限制
- 一個播放清單最多取得 50 筆資料,當數量很多時,還要寫 Loop 迴圈取得下一頁 token,比較麻煩
- 詳細的影片資訊取得比較麻煩,需要跑兩次流程(先取得所有影片 ID,再查詢影片資訊)
一、YT-DLP 介紹
1. 運作原理 為何 YT-DLP 會比官方 API 還好用,需要先了解其運作原理。根據這個 Reddit 討論串「Does ylp-dlp Use YouTube API?」,有 YT-DLP 官方開發人員 pukkandan 出來回覆:We don't use their developer API. We use a combination of extracting from the webpage and their undocumented internal API, called InnerTube原來 YT-DLP 使用了 YouTube 非公開的內部 API,叫做 InnerTube。也可參考這篇「YouTube Private API 套件」的說明,因為這是 YouTube 自己使用的 API,所以不需要 API KEY,自然方便很多。 2. 更新快速 因為 YT-DLP 使用了 YT 非公開、沒有文件說明的 API,代表隨時會有變更、某些功能會無預警失效。 不過因為是免費開源工具, YT-DLP 社群相當活躍,通常 YouTube 改版後幾天內就會修正,所以 YT-DLP 算是維護得很好,開發團隊在更新上相當用心。
二、YT-DLP 安裝
1. 官網下載- 官網:Github
- 下載頁面:Github release
- Windows 下載檔案連結:目前最新版 yt-dlp.exe
- 將
yt-dlp.exe 放在指定資料夾,例如 D:\YtDlp - 點擊工作列「搜尋」功能,搜尋 "編輯系統環境變數" 並執行
- 「環境變數」→「系統變數」→編輯「Path」
- 新增剛剛設定的資料夾,例如 D:\YtDlp 即可
yt-dlp --version
3. 操作說明書
最簡單的方式,可以執行以下命令看操作說明:
yt-dlp --help | more
也可參考官網說明:
三、YT-DLP 操作
1. 常用參數 以下列出取得 YouTube 影片資訊的相關常用參數:- --flat-playlist:只取得清單資料,不下載影片
- --playlist-end n:取得清單最多 n 筆資料
- --playlist-items 1-50:取得清單指定區間編號的資料,1-50 代表取得前 50 筆
- --match-filters "duration>60":使用特定條件篩選影片,例如 duration>60 可篩選大於 60 秒的影片
- -s:只模擬執行,不下載
- --print "%(title)s":顯示特定資訊,例如這裡的範例參數會顯示標題
- -J:取得的資料返回 json 格式。如果要存成檔案,後面可加參數
> 檔名.json
- 單一影片網址:https://www.youtube.com/watch?v=影片ID
- 播放清單網址:https://www.youtube.com/playlist?list=播放清單 ID
- 頻道影片:https://www.youtube.com/@頻道名稱/videos
- 頻道直播影片:https://www.youtube.com/@頻道名稱/streams
- 影片基本欄位:id(影片 ID)、title(標題)、webpage_url(影片網址)、description(影片描述)
- 頻道欄位:channel(頻道名稱)、channel_id(頻道 ID)
- 直播狀態:live_status,數值可能為 is_upcoming(即將直播)、is_live(正在直播)、was_live(已直播完畢)、not_live(非直播影片)
- 時間欄位:upload_date(上傳時間)、release_timestamp(發布時間,可為即將直播的時間)、duration(影片長度,以秒計)、duration_string(影片長度,格式為 HH:mm:ss)
- 統計欄位:view_count(觀看次數)、like_count(按讚數)、dislike_count(討厭數)
yt-dlp --flat-playlist --playlist-end 10 --print "%(title)s %(webpage_url)s" "https://www.youtube.com/channel/UCoLrcjPV5PbUrUyXq5mjc_A/videos"
B. 取得某播放清單序號 5~10 的影片,以 json 格式顯示:
yt-dlp --flat-playlist --playlist-items 5-10 -J "https://www.youtube.com/playlist?list=PLL-lmlkrmJal2ned-dCINmltnpbnc7KvG"
四、搜尋 YT 影片
額外說明一個強大功能,yt-dlp 內建一個搜尋功能,可以藉由搜尋取得需要的影片資訊。 1. 基本語法ytsearchN:關鍵字
- N:填入的數字代表返回資料筆數,若是沒填寫 N 則預設只返回 1 筆
- 關鍵字:填入搜尋字串即可
yt-dlp "ytsearch3:大谷翔平" --flat-playlist -J
2. 過濾功能
搭配過濾參數的話,可以搜尋出更精確的結果,例如執行以下指令,可取得 10 筆直播中的新聞影片 json 資訊:
yt-dlp "ytsearch10:新聞直播" --match-filter "live_status=is_live" --flat-playlist -J
五、爬蟲程式範例
yt-dlp 是命令列工具,無法直接用來寫程式,所以要寫爬蟲程式的話,須另外使用自己習慣的框架,本篇以 NodeJs 環境來舉例,如何取得播放清單中的影片 ID 及影片標題:const { exec } = require('child_process');
// 要抓取的 YT 網址
const ytUrl = 'https://www.youtube.com/playlist?list=PLL-lmlkrmJal2ned-dCINmltnpbnc7KvG';
/*
使用 --print 輸出為 json 格式可減少輸出資訊量
若使用 -J 輸出 json,內容太多可能導致記憶體崩潰
%(title)j 本身就會自帶雙引號,所以它的前後不需要再加上 \\"
*/
const command = `yt-dlp --flat-playlist --playlist-end 3 --print "{\\"id\\": \\"%(id)s\\", \\"title\\": %(title)j}" "${ytUrl}"`;
exec(command, (error, stdout, stderr) => {
if (error) {
console.error(`執行指令失敗: ${error.message}`);
return;
}
const lines = stdout.trim().split('\n');
const playlistJson = [];
lines.forEach((line) => {
if (line) {
try {
const videoObject = JSON.parse(line);
playlistJson.push(videoObject);
} catch (e) {
console.error(`解析單行 JSON 失敗: ${line}, 錯誤: ${e.message}`);
}
}
});
console.log(`\n--- 成功取得輕量化 JSON 資料 (總共 ${playlistJson.length} 筆) ---`);
playlistJson.forEach((video, index) => {
console.log(`[影片 ${index + 1}]`);
console.log(`ID: ${video.id}`);
console.log(`Title: ${video.title}`);
console.log('-----------------------------------');
});
});
簡單說明重點:
- 先載入 NodeJs 內建模組 child_process
- 利用 exec 執行 yt-dlp 命令
- yt-dlp 如果用
-J 返回 json,由於資料量太大,有可能超出緩存記憶體限制導致崩潰 - 所以建議改用
--print ,將返回資料組合成類似 json 的格式 - %(title)j 這裡前後沒使用雙引號,而是使用參數 j,是防止標題字串可能包含雙引號,導致 js 解析錯誤。參數 j 會自動將標題字串的雙引號加上斜線 "\",同時將整個標題字串的前後自動補上雙引號。
更多爬蟲相關技巧:
沒有留言:
張貼留言注意事項:
◎ 勾選「通知我」可收到後續回覆的mail!
◎ 請在相關文章留言,與文章無關的主題可至「Blogger 社團」提問。
◎ 請避免使用 Safari 瀏覽器,否則無法登入 Google 帳號留言(只能匿名留言)!
◎ 提問若無法提供足夠的資訊供判斷,可能會被無視。建議先參考這篇「Blogger 提問技巧及注意事項」。
◎ CSS 相關問題非免費諮詢,建議使用「Chrome 開發人員工具」尋找答案。
◎ 手機版相關問題請參考「Blogger 行動版範本的特質」→「三、行動版範本不一定能執行網頁版工具」;或參考「Blogger 行動版範本修改技巧 」,或本站 Blogger 行動版標籤相關文章。
◎ 非官方範本問題、或貴站為商業網站,請參考「Blogger 免費諮詢 + 付費諮詢」
◎ 若是使用官方 RWD 範本,請參考「Blogger 推出全新自適應 RWD 官方範本及佈景主題」→ 不建議對範本進行修改!
◎ 若留言要輸入語法,"<"、">"這兩個符號請用其他符號代替,否則語法會消失!
◎ 為了過濾垃圾留言,所有留言不會即時發佈,請稍待片刻。
◎ 本站「已關閉自刪留言功能」。