python自動下載視頻(B站、優酷、愛奇藝......)

近日旁邊IOS同學請假在家嘿嘿嘿,徒留朕一個人孤零零的在牆角瑟瑟發抖,雖然公司空調開到28℃,還是融化不了朕冰冷的心
在這裏插入圖片描述

到這兒你可能會問,你們公司就兩個人嗎?
哈哈哈哈,人倒是多,不過對於開口香奈兒,閉口法拉利的話題,朕實在是尬不進去。
在這裏插入圖片描述
閒來無事,一個人寂寞的上網看小姐姐們跳舞。轉眼間,一小時的悠悠歲月已如同手中緊抓的沙子,無聲無息的流失,可是孤獨卻如同跗骨之蛆,依然倔強的縈繞在朕的周圍。
怎麼辦呢?孤獨是不可能孤獨的,只有寫BUG ,啊呸,寫代碼才能維持生活這樣子。

今天來聊聊Python下載視頻那些事兒
下載視頻嘛,無非就是文件 I/O。
在這裏插入圖片描述
python下載視頻文件三步驟拿到視頻url,請求鏈接獲取視頻流,寫入本地文件保存
先寫個demo:

import requests
 
print("開始下載")
url = 'https://vdept.bdstatic.com/65796c493957364e51574e65504b757a/474c6d4464633277/37715aae880a70427da12d5d682d3a534b3947470869ecc29530cc310a944c1ac684c3ab83e07d18f65784748120987a.mp4?auth_key=1578908333-0-0-a70ed19862afa01935265e5a32906867'
r = requests.get(url, stream=True)
 
with open('test.mp4', "wb") as mp4:
    for chunk in r.iter_content(chunk_size=1024 * 1024):
        if chunk:
            mp4.write(chunk)
 
print("下載結束")
 

點擊運行,等待一會兒
在這裏插入圖片描述
然後點擊打開保存的mp4文件,就可以愉快的看小姐姐跳舞了。
(當然,這段代碼也適用於大多數有色網站,嘿嘿嘿,你懂的)
在這裏插入圖片描述
不得不感嘆一聲:呵,朕真是個天才
在這裏插入圖片描述

grils技術哪家強,嗶哩嗶哩幫你忙。
可萌可御可撒嬌,偶爾還能下個腰。
借問妹子何處有,司機遙指 bilibili…

正當我準備掏空B站的時候,發現B站的視頻鏈接並不能夠直接下載視頻。要麼複製出來單獨訪問就403,要麼異於常人
在這裏插入圖片描述
我一驚,此時必有蹊蹺。
把這個鏈接複製出來一訪問,呵,事情果然沒有這麼簡單
在這裏插入圖片描述
這是爲什麼,難道是B站混入了奸細?我趕緊打開騰訊視頻,愛奇藝看了一下,發現都存在這種情況。
在這裏插入圖片描述
最後發現鏈接前面的blob有點面生,google了一圈,得出結論:
Blob URL / Object URL是一種僞協議,允許Blob和File對象用作圖像,下載二進制數據鏈接等的URL源。生產場景往往是對切片格式的視頻 m3u8 地址進行 blob 格式處理,其實並不是爲了加密,因爲瀏覽器還是會解析 blob 並去 get 請求對應的 m3u8 地址,使用 blob uri 的好處在於可以在一定層度上干擾爬蟲。

簡單的說,就是不能F12直接拿到視頻的真實地址了

## 有點東西表情包
python下載視頻文件三步驟,第一步就卡死了。當朕抓耳撓腮之際,一個叫you-get的東西出現在了朕的視野中。

當然,來路不明的東西朕肯定是不會輕易使用的。秉持 ‘大家好纔是真的好’ 的理念,朕查了查它的 git地址。喲,star還挺多
在這裏插入圖片描述
抱着試一試的心態閱讀了you-get的文檔,發現簡單的令人髮指

第一步:安裝you-get,命令:pip3 install you-get,正常情況下,這樣就已經安裝好了,如果出現特殊情況,請查閱官方文檔:https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E
第二步:沒有第二步了

使用起來也非常簡單,以B站小姐姐跳舞視頻爲例:
鏈接:https://www.bilibili.com/video/av82238119?spm_id_from=333.5.b_64616e63655f73746172.3
頁面大概是這樣:
在這裏插入圖片描述
要保存這個舞蹈視頻,只需要python命令行輸入命令:

you-get -o D:\python\video https://www.bilibili.com/video/av82238119?spm_id_from=333.5.b_64616e63655f73746172.3

在這裏插入圖片描述
等待進度條完成,你就可以在目錄 D:\python\video下找到你的小姐姐,就連彈幕也沒有放過。呵呵呵,真香。(xml文件保存該視頻彈幕,另外一個是視頻文件)
在這裏插入圖片描述
當然,你也可以將你下載的視頻保存在隱藏文件夾或者學習資料目錄下,嘿嘿。【you-get還有很多有趣的命令,支持國內外很多大型視頻網站,如B站,優酷等,具體可查閱官方文檔】
在這裏插入圖片描述
當然,這種半自動的方式必然不能夠滿足朕旺盛的精力,這種方式的話,搬空B站得到何年何月啊。再說了,一個一個去複製視頻頁面的鏈接,好像也不太符合朕的身份
在這裏插入圖片描述
想了想,還是寫個python文件吧。那麼問題來了,python文件裏怎麼調用you-get呢?各大搜索引擎搜索了個遍,都沒有找到朕想要的。最後,朕也記不清在哪裏看到了一行命令,恍惚之中覺得此命令大有可爲。

示例:

from you_get import common

common.any_download(url='https://www.bilibili.com/video/av82238119?spm_id_from=333.5.b_64616e63655f73746172.3',info_only=False,output_dir=r'D:\python\video',merge=True)

試運行一下,嘿嘿嘿,居然跑起來了。

那麼接下來的事情就好辦了,比如我要B站小姐姐跳舞視頻,示例步驟如下:
第一步:找到B站跳舞板塊url
第二部:拿到頁面,解析出每一個視頻頁面url
第三部:使用 you-get 獲取視頻
說搞就搞,只見朕以行雲流水、水底撈月、月朗星稀之勢,一氣呵成的完成了第一版
運行一下,呵,啥也沒有在這裏插入圖片描述
經過一番調試發現,B站的視頻列表是通過接口異步加載的,打開F12可以看到,也可以複製Xpath路徑,但是直接請求頁面是拿不到數據的。接口如下,返回數據格式是json,其中的arcurl就是咱們需要的視頻播放頁面url
在這裏插入圖片描述
明白了這些之後就好辦了,先試試宅舞板塊,視頻熱度排第一頁的舞蹈拿下來欣賞一下,代碼如下:

import requests
import random
import json
from you_get import common

#常用請求代理
header_list = [
    {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"},
    {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3676.400 QQBrowser/10.4.3469.400"},
    {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"},
    {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"}
]


# 主函數
if __name__ == "__main__":

    base_url = 'https://s.search.bilibili.com/cate/search?main_ver=v3&search_type=video&view_type=hot_rank&order=click&copy_right=-1&cate_id=20&page=1&pagesize=20&jsonp=jsonp&time_from=20200107&time_to=20200114&_=1578992689153'
    
    headers = random.choice(header_list)
    # 獲取頁面信息
    response = requests.get(url=base_url, headers=headers)
    # 獲取請求狀態碼
    code = response.status_code
    if code == 200:
        urls_json = json.loads(response.content)
        for i in urls_json['result']:
            print(i['arcurl'])
            common.any_download(url=i['arcurl'],info_only=False,output_dir=r'D:\python\video',merge=True)
        
    print('the end!')

運行文件,得如下結果:
在這裏插入圖片描述
打開保存目錄看看:
在這裏插入圖片描述
喲西,這誰頂得住啊
在這裏插入圖片描述
本着能搞它一頁宅舞,就能掏空它的原則。分析分析接口規律,簡單封裝幾個方法:

import queue
import requests
import re
import random
import time
import os
import json
from you_get import common

#常用請求代理
header_list = [
    {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"},
    {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3676.400 QQBrowser/10.4.3469.400"},
    {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"},
    {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"}
]

#獲取視頻播放頁url
def get_urls(base_url,start_page_num,queue):
    while True:
        #生成請求代理信息
        headers = random.choice(header_list)
        #組裝接口url
        page_url = base_url + str(start_page_num)
        # 獲取頁面信息
        response = requests.get(url=page_url, headers=headers)
        # 獲取請求狀態碼
        code = response.status_code
        if code == 200:
            urls_json = json.loads(response.content)
            if urls_json['result']:
                for i in urls_json['result']:
                    queue.put(i['arcurl'])
                    print(i['arcurl'])
            else:
                break
        start_page_num += 1
    print('Get url done!')
 
#下載視頻並保存 
def get_vedio(save_dir,queue):
    while not queue.empty():
        #休息一下,wo也不知道太快會發生什麼
        #time_num = 5
        #time.sleep(time_num)
        # Queue隊列的get方法用於從隊列中提取元素
        vedio_page_url = queue.get()
        queue.task_done()
        common.any_download(url=vedio_page_url,info_only=False,output_dir=save_dir,merge=True)

# 主函數
if __name__ == "__main__":
    # 小說章節基地址
    base_url = 'https://s.search.bilibili.com/cate/search?main_ver=v3&search_type=video&view_type=hot_rank&order=click&copy_right=-1&cate_id=20&pagesize=20&jsonp=jsonp&time_from=20200107&time_to=20200114&_=1578992689153&page='
    #從第幾頁開始
    start_page_num = 1
    #視頻保存目錄,請將目錄寫在引號裏面,第一個r不能省略
    save_dir = r'D:\python\video'

    # 用Queue構造一個先進先出隊列
    video_urls_queue = queue.Queue()
    #獲取視頻播放頁url
    get_urls(base_url,start_page_num,video_urls_queue)
    #下載視頻並保存
    get_vedio(save_dir,video_urls_queue)

    print('the end!')

看着自己的 ‘ 學習文件盤 ’ 慢慢被充滿,露出了猥瑣帥氣的笑容 。。。。
心想,B站之流也不過如此
在這裏插入圖片描述
呵呵

The end!

人最大的對手,往往不是別人,而是自己的懶惰。
別指望撞大運,運氣不可能永遠在你身上,任何時候都要靠本事喫飯。
你必須拼盡全力,纔有資格說自己的運氣不好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章