1. 程式人生 > 實用技巧 >神器,GitHub2.5萬星:視訊網站一行Python程式碼爬

神器,GitHub2.5萬星:視訊網站一行Python程式碼爬

在進入主題之前,先來吐槽下現在的視訊網站。各個視訊網站內容越來越多,平臺強大了就會有諸多的限制,比如超長的廣告等待時間、部分內容不允許快取等,另外對於經常坐飛機或長期處於弱訊號條件下的人來說也是個比較頭疼的問題。


在這裡還是要推薦下我自己建的Python開發學習群:1156465813,群裡都是學Python開發的,如果你正在學習Python ,歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有Python軟體開發相關的),包括我自己整理的一份2020最新的Python進階資料和高階開發教程,歡迎進階中和進想深入Python的小夥伴!

對於上述問題,今天介紹的這個專案提供了一個很好的解決方案——只需要1行命令就能夠從各大視訊網站中下載想要的視訊,而且不必安裝視訊網站專用APP或者第三方快取工具。

1.專案介紹

1).神器庫you-get

You-Get是GitHub上一個評分很高的python專案,作為一款精巧的命令列應用程式,可以很方便地從web網站下載視訊。其下載的視訊檔案可以直接開啟播放,不需要安裝特定的網路瀏覽器,也免去了線上觀看廣告太長的煩惱。

事實上,you-get不僅能夠下載視訊檔案,還能下載音樂、圖片等其他媒體檔案,只要你能提供目標資源的URL。只不過,you-get用於下載音樂和圖片的功能並不十分完善,而且意義也沒有視訊下載那樣明顯,因此本文僅以視訊下載為例進行介紹演示。

2).支援的網站

you-get的優勢之一就是支援包括優酷、愛奇藝、Bilibili、YouTube等幾十個國內外知名視訊網站(下圖只是其中一部分),對於每一個想要下載的視訊,都能夠使用同一條命令進行直接下載,需要調整的只有目標視訊的URL而已。

2020最新python學習資源分享:1156465813

當然,you-get的使用也有一些注意事項,比如受網頁格式調整或反爬措施更改等因素影響,可能會出現部分網站或部分視訊源無法下載的問題,對於已經發現的問題會在這裡列出,在使用前可以提前查閱;還有就是各視訊網站的VIP視訊通過you-get是沒有辦法下載的。

更重要的是,千萬不要使用you-get去做一些可能構成侵犯版權等違法行為的事,對於這一點,you-get已經專門做出了說明。

2.初級應用


1).安裝與試用

you-get的安裝也是老套路了,直接使用"pip install you-get"。

you-get的使用同樣簡單,只要在終端輸入形如"you-get URL(目標視訊的url)"的命令就能夠自動下載對應的視訊。當然,you-get命令還有一些功能引數,其中最為常用的有兩個:

  • --info/-i:加了這個引數,you-get命令僅會顯示目標視訊的基本資訊,而不會開始下載視訊。
  • --output-dir/-o:用於指定下載視訊的儲存路徑。

另外還有其他一些引數,用於實現諸如設定代理、載入cookie、提取目標源URL等功能,詳情參見官方文件。下面我們找一段視訊試驗下you-get的效果,視訊網址如下:

首先使用“-i”引數獲取視訊的基本資訊,按照文件中的示例,在終端中輸入:

you-get -i 'https://www.bilibili.com/bangumi/play/ss26284'

  

回車後卻出現了下圖中的提示,很明顯是發生了錯誤,那麼該如何解決呢?我們接著往下看。

2).問題與除錯

按照you-get給出的提示,當下載視訊遇到問題時應該分四步來解決:一是排除網路問題;二是確保you-get更新到最新版本;三是檢查目標視訊是否已經確認無法爬取。很遺憾,這次的問題並不是上面三個原因造成的,所以只能使用第四個方法--debug引數進行除錯,除錯結果如下圖:

根據debug的除錯結果,出現問題的原因是<urlopen error [Errno 11001] getaddrinfo failed>,這個問題通常是由單引號引起的,我們嘗試把上面you-get指令中的單引號替換為雙引號,輸入:

you-get -i "https://www.bilibili.com/bangumi/play/ss26284"

結果成功獲取了目標視訊的基本資訊:

可見,目標視訊有4種清晰度的格式,接著去掉-i引數正式下載視訊(預設會採用第一種視訊格式),結果如下:

只用了十幾秒,300多M的視訊就下載完畢,速度還是很快的。

3.高階用法

上面這種方法一次只能下載一個視訊,文件中並沒有說明如何批量下載視訊,按照目前的方法如果想要批量下載需要多次操作,有點不方便,另外文件中也沒有講如何在程式碼中以函式的形式呼叫you-get介面,不過由於專案是開源的,我們可以通過閱讀原始碼來尋找答案。

1).查閱原始碼

通過查閱專案檔案,我們發現在tests目錄下有幾個py檔案:

閱讀test.py中的程式碼(下圖),初步判定you-get的核心功能存在於“you_get.extractors”之中,形如XXXX.download的函式就是下載介面函式。

進入到extractors目錄,發現裡面有很多py檔案,每個檔案的名稱都是一個網站,由此可以推測每個檔案中的程式碼所實現的功能是對應網站中視訊/音樂/圖片的爬取和下載。

隨便開啟一個檔案(比如bilibili.py),看一下程式碼內容。雖然程式碼內容很多,但結構還是很清晰的,具體細節暫且略過,直接看程式碼底部,bilibili.py共定義了兩個函式介面——download和download_playlist,通過閱讀程式碼可以得知這兩個函式分別用於單個視訊下載和批量視訊下載。

2).批量下載

you-get的命令列引數中並沒有對單個視訊或者批量視訊的甄別,可以推測you-get在封裝時已經添加了對單個視訊和多個視訊進行識別的功能。為了驗證,還是用《盾勇》這部動畫來進行試驗,下圖是動畫的列表頁。

在終端輸入下面的下載指令:

you-get "https://www.bilibili.com/bangumi/media/md4316482/?from=search&seid=6151030679368490778"

you-get會逐個下載列表中的視訊,而且對於目錄中已經存在的視訊還會自動跳過(下圖),原來批量下載視訊如此簡單。

3).函式呼叫

雖然順利找到了批量下載的方法,不過總是在命令列中使用you-get還是感覺有點受限,基於我們前面已經找到了函式介面,不妨試試在python程式碼中呼叫you-get的下載函式。

還是以bilibili模組為例,在bilibili.py檔案中並沒有發現相關的引數設定部分,但是在程式碼的開頭呼叫了extractor.VideoExtractor函式(下圖)。我們順藤摸瓜,在這個函式中找到了引數設定的相關內容,比如info_only對應的是命令列引數-i,outpath_dir對應的是命令列引數-o,另外在呼叫函式下載時merge引數是必須設定的(這個引數決定了下載後的媒體檔案是否合併,例如有些網站下載的視訊檔案和音訊檔案是分開的,merge為True時,下載後會自動將兩個檔案合併)。

將下面幾行程式碼儲存為python指令碼進行執行測試,發現其效果和在終端使用you-get命令列幾乎一模一樣。

from you_get.extractors import bilibili
bilibili.download('https://www.bilibili.com/bangumi/play/ep259692', info_only=True)
bilibili.download('https://www.bilibili.com/bangumi/play/ep259692', merge=True, output_dir='your dir')

現在,我們可以在自己的程式中使用you-get了,感覺靈活性一下子提升了好多。you-get中還有很多神器的功能和設定,就有待於大家自己去挖掘了。

在這裡還是要推薦下我自己建的Python開發學習群:1156465813,群裡都是學Python開發的,如果你正在學習Python ,歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有Python軟體開發相關的),包括我自己整理的一份2020最新的Python進階資料和高階開發教程,歡迎進階中和進想深入Python的小夥伴!