2026年6月6日

YT-DLP 不只是下載工具,也是超強 YouTube 爬蟲 API

YT-DLP 不只是下載工具,也是超強 YouTube 爬蟲 API

Wayne Fu 0 A+
上一篇「YT RSS 失效後,如何取得各種播放清單資料」,說明了如何操作官方 YouTube Data API 來取得播放清單資訊,不過有這些麻煩之處:
  • 需要先建立專案、申請 API 金鑰等流程
  • 有每日額度限制
  • 一個播放清單最多取得 50 筆資料,當數量很多時,還要寫 Loop 迴圈取得下一頁 token,比較麻煩
  • 詳細的影片資訊取得比較麻煩,需要跑兩次流程(先取得所有影片 ID,再查詢影片資訊)
而 YT-DLP 這個免費開源工具,原本主要用途是下載 YouTube 影片,過去曾在「免費穩定好用的 YT 影片下載開源工具推薦」介紹過。沒想到這工具用來取得 YT 影片資訊,比官方 API 更方便,沒有麻煩的前置流程,不須擔心額度限制,很輕易就能篩選、以及取得超詳細的影片資訊,完全可取代官方 API。 如果你也有 YouTube 影片資料的爬蟲需求,YT-DLP 可說是絕佳的工具,本篇會先介紹其運作原理、安裝使用說明,並提供常用指令、及爬蟲程式碼範例。 (圖片出處: chatGPT)

一、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. 官網下載 2. 設定環境變數 yt-dlp.exe 下載後就能直接執行,但如果想要在任何路徑都能呼叫,必須設定 Windows 環境變數,操作方式如下:
  • 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
特別提醒一下,yt-dlp 主要用途是下載影片,所以作為爬蟲用途的話,建議一定要加參數 --flat-playlist,以免不小心執行的指令會變成下載影片。 2. 常用 YouTube 網址 要取得影片資訊時,支援的 YouTube 網址形式大致如下:
  • 單一影片網址:https://www.youtube.com/watch?v=影片ID
  • 播放清單網址:https://www.youtube.com/playlist?list=播放清單 ID
  • 頻道影片:https://www.youtube.com/@頻道名稱/videos
  • 頻道直播影片:https://www.youtube.com/@頻道名稱/streams
YouTube 還有更多隱藏播放清單網址格式,可參考「YouTube RSS 失效後,如何取得各種播放清單資料」→「二、各種 YT 播放清單 ID 格式」,就能取得更多頻道長片、短片、直播、熱門影片等播放清單網址。 3. 取得 YT 影片資訊 如果使用 -J 參數返回 json 物件的話,可以取得大量影片資訊。所有的欄位(filed)資訊,可參考「官網文件 OUTPUT TEMPLATE」→「The available fields are:」,這裡有詳細列表,以下簡單列一些常用欄位:
  • 影片基本欄位: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(討厭數)
3. 使用範例 以下提供幾個簡單操作範例: A. 取得某頻道影片最新 10 個影片,顯示標題、網址: 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 筆
  • 關鍵字:填入搜尋字串即可
例如執行以下指令,可取得 3 筆「大谷翔平」影片 json 資訊: 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 會自動將標題字串的雙引號加上斜線 "\",同時將整個標題字串的前後自動補上雙引號。
能從範例程式碼成功取得影片 ID、標題的話,自然也能取得其他欄位資料,將爬蟲程式依照自己需求進行修改。
更多爬蟲相關技巧:
0 0
如這篇文章對你有幫助,歡迎「分享」到 FB、「追蹤」粉絲團、「訂閱」最新文章

沒有留言:

張貼留言注意事項:

◎ 勾選「通知我」可收到後續回覆的mail!
◎ 請在相關文章留言,與文章無關的主題可至「Blogger 社團」提問。
◎ 請避免使用 Safari 瀏覽器,否則無法登入 Google 帳號留言(只能匿名留言)!
◎ 提問若無法提供足夠的資訊供判斷,可能會被無視。建議先參考這篇「Blogger 提問技巧及注意事項」。
◎ CSS 相關問題非免費諮詢,建議使用「Chrome 開發人員工具」尋找答案。
◎ 手機版相關問題請參考「Blogger 行動版範本的特質」→「三、行動版範本不一定能執行網頁版工具」;或參考「Blogger 行動版範本修改技巧 」,或本站 Blogger 行動版標籤相關文章。
◎ 非官方範本問題、或貴站為商業網站,請參考「Blogger 免費諮詢 + 付費諮詢
◎ 若是使用官方 RWD 範本,請參考「Blogger 推出全新自適應 RWD 官方範本及佈景主題」→ 不建議對範本進行修改!
◎ 若留言要輸入語法,"<"、">"這兩個符號請用其他符號代替,否則語法會消失!
◎ 為了過濾垃圾留言,所有留言不會即時發佈,請稍待片刻。
◎ 本站「已關閉自刪留言功能」。

TOP