溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python怎么實現(xiàn)視頻下載與合成

發(fā)布時間:2022-04-16 10:36:26 來源:億速云 閱讀:107 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細介紹“Python怎么實現(xiàn)視頻下載與合成”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“Python怎么實現(xiàn)視頻下載與合成”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    模塊使用

    requests >>> pip install requests (數(shù)據(jù)請求 第三方模塊)

    re # 正則表達式 去匹配提取數(shù)據(jù)

    json

    開發(fā)環(huán)境

    Python 3.8 解釋器

    Pycharm 2021.2 版本 建議

    win + R 輸入cmd 輸入安裝命令 pip install 模塊名 如果出現(xiàn)爆紅 可能是因為 網(wǎng)絡(luò)連接超時 切換國內(nèi)鏡像源

    案例實現(xiàn)

    1.明確需求

    采集內(nèi)容, 先分析一個視頻是從哪里獲取

    通過開發(fā)者工具進行抓包分析, 分析視頻數(shù)據(jù)可以從哪里獲取內(nèi)容 格式 m3u8視頻內(nèi)容

    當我們網(wǎng)站視頻格式 是m3u8的時候, 有一個專門存放所有ts視頻片段的文件

    2.代碼實現(xiàn)步驟

    • 發(fā)送請求

    • 獲取數(shù)據(jù)

    • 解析數(shù)據(jù)

    • 保存數(shù)據(jù)

    1. 發(fā)送請求, 對于視頻播放頁面url地址發(fā)送請求

    2. 獲取數(shù)據(jù), 獲取服務(wù)器返回response響應(yīng)數(shù)據(jù)

    3. 解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內(nèi)容 視頻標題 以及 m3u8 鏈接

    4. 發(fā)送請求, 對于 m3u8 鏈接 發(fā)送請求

    5. 獲取數(shù)據(jù), 獲取服務(wù)器返回response響應(yīng)數(shù)據(jù)

    6. 解析數(shù)據(jù), 提取所有ts文件url [視頻片段]

    7. 保存數(shù)據(jù), 把所有視頻保存下來, 然后合成為一個整體視頻內(nèi)容

    實現(xiàn)代碼

    import requests  # 數(shù)據(jù)請求模塊 pip install requests  在cmd里面 輸入命令
    import re  # 導入正則表達式模塊 內(nèi)置模塊
    import json
    import pprint  # 格式化輸出模塊
    
    for page in range(1, 17):
        print(f'--------------------正在采集第{page}頁的數(shù)據(jù)內(nèi)容--------------------')
        list_url = 'https://www.acfun.cn/u/45321802'
        # 批量 ctrl + R 選中目標
        data = {
            'quickViewId': 'ac-space-video-list',
            'reqID': page + 1,
            'ajaxpipe': '1',
            'type': 'video',
            'order': 'newest',
            'page': page,
            'pageSize': '20',
            't': '1649944573765',
        }
        headers = {
            # 'cookies': '你的cookie',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
        }
        # get請求 有一個params參數(shù)
        # post請求 data 參數(shù)
        response = requests.get(url=list_url, params=data, headers=headers)
        # print(response.text)
        id_list = re.findall('a href=.*?ac(.*?)"', response.text)
        for index in id_list:
            video_id = index.replace('\\', '')
            """
            1. 發(fā)送請求, 對于視頻播放頁面url地址發(fā)送請求
                用python代碼去模擬瀏覽器 對于 url地址發(fā)送請求
            video 
            """
            url = f'https://www.acfun.cn/v/ac{video_id}'  # 確定請求url地址
            # 請求頭 用偽裝python代碼, 為了被服務(wù)器識別出來 是爬蟲程序 一種簡單反反爬手段 當你加ua 得到數(shù)據(jù)的時候, 可能要cookie
            # 需要登陸才能獲得數(shù)據(jù)的, 需要加cookie 用戶信息, 常用于檢測是否登陸賬號
            headers = {
                # 'cookies': '你的cookie',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
            }
            # 通過requests模塊里面get請求方式, 對于url地址發(fā)送請求, 并且攜帶上headers請求頭偽裝, 最后用response自定義變量接收返回數(shù)據(jù)
            response = requests.get(url=url, headers=headers)
            # 2. 獲取數(shù)據(jù)
            # print(response.text)
            # 3. 解析數(shù)據(jù) 通過re模塊里面findall的方法 在response.text里面去找尋 標題數(shù)據(jù) re.S 匹配換行
            # 正則表達式提取出來的數(shù)據(jù)返回都是列表數(shù)據(jù)類型  實現(xiàn)過程不重要, 方式方法很多, 你喜歡用哪個都可以 只要可以取到數(shù)據(jù)都OK
            title = re.findall('<title >(.*?) - AcFun彈幕視頻網(wǎng) - 認真你就輸啦 \(\?ω\?\)ノ- \( ゜- ゜\)つロ</title>', response.text)[0]
            video_info = re.findall('window.pageInfo = window.videoInfo = (.*?);', response.text)[0]
    
            # print(video_info) # 字符串轉(zhuǎn)成字典 怎么轉(zhuǎn)  最穩(wěn)妥查看數(shù)據(jù)類型 直接用 type() 這個函數(shù)去查看
            json_data = json.loads(video_info)
            # pprint.pprint(json_data)
            # 字典取值 根據(jù)冒號左邊的內(nèi)容(鍵) 提取冒號右邊的內(nèi)容(值)
            m3u8_url = \
            json.loads(json_data['currentVideoInfo']['ksPlayJson'])['adaptationSet'][0]['representation'][0]['backupUrl'][0]
            # print(title)
            # print(m3u8_url)
            # 通過requests模塊里面get請求方式, 對于m3u8_url地址發(fā)送請求, 并且攜帶上headers請求頭偽裝, 獲取響應(yīng)體文本數(shù)據(jù), 用m3u8_data自定義變量接收數(shù)據(jù)
            m3u8_data = requests.get(url=m3u8_url, headers=headers).text
            # split() 字符串分割
            m3u8_data = re.sub('#E.*', '', m3u8_data).split()
            # print(m3u8_data)
            for ts in m3u8_data:
                ts_url = 'https://ali-safety-video.acfun.cn/mediacloud/acfun/acfun_video/' + ts
                ts_content = requests.get(url=ts_url, headers=headers).content
                # ab 是什么意思 a追加保存, b 二進制數(shù)據(jù) ab 以二進制數(shù)據(jù)追加保存
                with open('video\\' + title + '.mp4', mode='ab') as f:
                    f.write(ts_content)
            print('視頻保存完成: ', title)

    讀到這里,這篇“Python怎么實現(xiàn)視頻下載與合成”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI