日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

视频采集工具 youtube-dl 接口介绍

發(fā)布時(shí)間:2023/12/8 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视频采集工具 youtube-dl 接口介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

youtube-dl 接口簡(jiǎn)介

      • 0x00. youtube-dl
      • 0x01. 使用說(shuō)明
      • 0x02. python接口
      • 0x03. 開發(fā)注意事項(xiàng)

0x00. youtube-dl

youtube-dl 是一個(gè)通過(guò)命令行下載視頻的工具,其不僅支持 youtube 網(wǎng)站的視頻下載,還支持上百個(gè)不同的視頻網(wǎng)站。用戶可以在官方網(wǎng)站上下載 Windows(exe) 和 Linux(tar.gz) 的版本,之后解壓并使用對(duì)應(yīng)的命令即可。
對(duì)于部分需要使用 youtube-dl 進(jìn)行開發(fā)并且調(diào)用其接口為其他功能服務(wù)的用戶而言,可以在 Github 上找到源碼并且進(jìn)行二次開發(fā),也可以直接調(diào)用其 python 接口。關(guān)于如何在命令行直接使用打包好的 youtube-dl 工具有許多的文檔進(jìn)行介紹,這篇文章主要是對(duì) youtube-dl 提供的一些接口參數(shù)及其功能進(jìn)行說(shuō)明,如有錯(cuò)誤或不嚴(yán)謹(jǐn)?shù)牡胤綒g迎批評(píng)指正。

0x01. 使用說(shuō)明

Linux/Mac 用戶可以直接用 pip 安裝 youtube-dl 的最新版本:

sudo pip install youtube-dl sudo -H pip install --upgrade youtube-dl

或 ( Homebrew )

brew install youtube-dl

:youtube-dl 的庫(kù)版本更新很快,一定要將 youtube-dl 升級(jí)到最新版本,因?yàn)槠浣馕銎骱芸赡軙?huì)隨著版本更新發(fā)生變動(dòng),導(dǎo)致解析結(jié)果不正確或者程序崩潰 ( 在報(bào)錯(cuò)時(shí)可以試試更新能不能解決 ) 。

0x02. python接口

在下載 youtube-dl 源碼后,可以看到 /docs/module_guide.rst 是一個(gè)簡(jiǎn)單的接口介紹文檔,但只有最簡(jiǎn)單的三四個(gè) api 的使用說(shuō)明,本文會(huì)在這個(gè)的基礎(chǔ)上加上作者在使用過(guò)程中自己用到的接口和參數(shù)。

  • 初始化接口
    在進(jìn)行下載之前,youtube-dl 需要初始化一個(gè)可以看作是下載器的類,可以在初始化時(shí)指定之后使用的解析器、解析格式、是否需要使用代理等。
    文檔中只給出了使用 YoutubeDL() 進(jìn)行初始化的方式,但這個(gè)函數(shù)還可以有一個(gè)字典形式的輸入?yún)?shù),如第2行所示。

    >>> from youtube_dl import YoutubeDL >>> opts = { 'outtmpl': u'%(id)s.%(ext)s' , 'ignoreerrors': True, 'proxy' : PROXY_URL} >>> ydl = YoutubeDL(opts) >>> ydl.add_default_info_extractors()

    這個(gè)參數(shù)決定了在之后的下載過(guò)程中下載器將會(huì)遵循的某些規(guī)則,在源碼中的 /youtube-dl/YoutubeDL.py 文件里有詳細(xì)的注釋說(shuō)明,這里只將常用的幾個(gè)參數(shù)列出來(lái)以供參考。

    參數(shù)名稱參數(shù)類型參數(shù)含義
    outtmplstring下載視頻文件的文件名格式
    ignoreerrorsbool是否忽略下載過(guò)程中的錯(cuò)誤(不忽略則遇到錯(cuò)誤就程序停止)
    usernamestring用戶名 (如果當(dāng)前網(wǎng)站需要登錄)
    passwordstring密碼 (同用戶名)
    nocheckcertificatebool是否驗(yàn)證SSL證書 (對(duì)于某些網(wǎng)站有用)
    proxystring指定代理
    extract_flatstring如果指定 ‘in_playlist’, 則只下載播放列表而不嘗試解析視頻

    其實(shí)這一部分的第四行代碼,add_default_info_extractors 函數(shù)是指添加一個(gè)默認(rèn)的提取器,但實(shí)際上這個(gè)提取器用戶是可以自定義的,但作者暫時(shí)沒有用到這個(gè)功能,所以這里不會(huì)細(xì)講,但對(duì)于一些 youtube-dl 本身不支持的網(wǎng)站,根據(jù)其框架再編寫一個(gè)新的提取器,應(yīng)該可以適應(yīng)大部分視頻網(wǎng)站的需求。

  • 提取視頻信息與下載視頻
    在初始化完畢后,提取信息的接口調(diào)用就比較簡(jiǎn)單了。通過(guò)之前創(chuàng)建的下載器對(duì)象,調(diào)用 extract_info() 函數(shù)。
    函數(shù)有兩個(gè)參數(shù),第一個(gè)是 url,如果是視頻 url,會(huì)直接解析視頻信息,而如果是播放列表類型的 url,則會(huì)先解析播放列表,再去解析播放列表中的每個(gè)視頻 (這個(gè)過(guò)程中是不可打斷的,一旦打斷會(huì)從頭開始)。
    第二個(gè)參數(shù)是一個(gè)布爾值,True 代表同時(shí)解析視頻詳細(xì)信息和下載視頻,False則不下載視頻,只解析視頻信息。
    而這個(gè)函數(shù)的返回值是一個(gè)字典類型的數(shù)據(jù),里面包含了視頻相關(guān)的信息,比如清晰度、上傳者、上傳時(shí)間等等,要了解每一個(gè)參數(shù)的意義可以看這里。

    >>> info = ydl.extract_info('http://www.youtube.com/watch?v=BaW_jenozKc', download=False) [youtube] Setting language [youtube] BaW_jenozKc: Downloading webpage [youtube] BaW_jenozKc: Downloading video info webpage [youtube] BaW_jenozKc: Extracting video information >>> info['title'] 'youtube-dl test video "\'/\\??𝕐' >>> info['height'], info['width'] (720, 1280)
  • 提取播放列表信息
    官方文檔中給出的提取播放列表 (playlist) 的方法如下所示,只是將 extract_info 的第二個(gè)參數(shù)改為 False,但作者在實(shí)際開發(fā)過(guò)程中發(fā)現(xiàn),這樣的方式有很大的弊端。
    在整個(gè) extract_info 函數(shù)執(zhí)行的過(guò)程中是不允許被打斷的, youtube-dl 本身也沒有實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能,這就導(dǎo)致一旦 playlist 過(guò)長(zhǎng)、視頻太大,程序很可能就因?yàn)榫W(wǎng)絡(luò)波動(dòng)而導(dǎo)致前面的工作白費(fèi)。

    >>> playlist = ydl.extract_info('http://www.ted.com/playlists/13/open_source_open_world', download=False) [TED] open_source_open_world: Downloading playlist webpage ...>>> for video in playlist['entries']: ... print('Video #%d: %s' % (video['playlist_index'], video['title'])) Video #1: How Arduino is open-sourcing imagination Video #2: The year open data went worldwide Video #3: Massive-scale online collaboration

    因此另一種方案就是先將 playlist 中的所有視頻 url 提取出來(lái) ( 只提取url不下載視頻速度會(huì)很快 ),再逐個(gè)的去下載視頻,并且配合數(shù)據(jù)庫(kù)記錄下載進(jìn)度,能最大程度下規(guī)避網(wǎng)絡(luò)波動(dòng)帶來(lái)的風(fēng)險(xiǎn)。其中的關(guān)鍵代碼如下。

    >>> playlist_ydl_opts = {'extract_flat':'in_playlist', 'ignoreerrors': True, 'nocheckcertificate':True} >>> playlist_ydl = YoutubeDL(playlist_ydl_opts) >>> playlist_ydl.add_default_info_extractors() >>> playlist = playlist_ydl.extract_info(playlist_path, download = False) >>> if playlist.has_key('entries') and playlist['entries'] != None: >>> ......
  • 0x03. 開發(fā)注意事項(xiàng)

    • 在把 youtube-dl 和數(shù)據(jù)庫(kù)結(jié)合在一起的時(shí)候需要注意斷點(diǎn)續(xù)傳的問(wèn)題,如何判斷是否重復(fù)下載、確認(rèn)下載進(jìn)度等等。
    • 在下載頻率過(guò)快的時(shí)候有極大幾率被封,尤其是類似于 youtube 之類的大型視頻網(wǎng)站,但一般而言如果是下載視頻的話,速度不會(huì)過(guò)快。但如果只提取信息不下載視頻,那就需要注意這個(gè)問(wèn)題 ( 會(huì)直接封IP幾個(gè)小時(shí)到十幾個(gè)小時(shí) )。
    • 可能會(huì)碰到下載到一定數(shù)量,要求提供驗(yàn)證碼的問(wèn)題 (比如 youtube 在下載到200個(gè)左右視頻時(shí)會(huì)出現(xiàn)圖片驗(yàn)證碼)。

    本文為作者原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處

    總結(jié)

    以上是生活随笔為你收集整理的视频采集工具 youtube-dl 接口介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。