python 下載 b站視頻 和音頻

video_bvid:在這里插入圖片描述

import os
import requests
import json
import re
from bs4 import BeautifulSoup
import subprocess
# from detail_video import video_bvid# video_bvid 是一個從外部得到的單個視頻ID
video_bvid = 'BV1cx421Q7ve'class BilibiliVideoAudio:def __init__(self, bvid):"""初始化方法,接收一個bvid作為視頻的唯一標識符。"""self.bvid = bvid# 設置請求頭,用于模擬瀏覽器訪問Bilibili網站self.headers = {"referer": "https://search.bilibili.com/all?keyword=%E4%B8%BB%E6%92%AD%E8%AF%B4%E8%81%94%E6%92%AD&from_source=webtop_search&spm_id_from=333.1007&search_source=5&page=4&o=90","origin": "https://search.bilibili.com",'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0','Accept-Encoding': 'gzip, deflate, br'}def get_video_audio(self):"""獲取視頻和音頻的鏈接以及視頻標題。"""# 構造視頻鏈接并發送請求獲取頁面內容url = f'https://www.bilibili.com/video/{self.bvid}/?spm_id_from=333.337.search-card.all.click&vd_source=14378ecd144bed421affe1fe0ddd8981'content = requests.get(url, headers=self.headers).content.decode('utf-8')# 使用BeautifulSoup解析HTML內容soup = BeautifulSoup(content, 'html.parser')# 獲取視頻標題meta_tag = soup.head.find('meta', attrs={'name': 'title'})title = meta_tag['content']# 獲取視頻和音頻鏈接的正則表達式pattern = r'window\.__playinfo__=({.*?})\s*</script>'# 提取并解析JSON數據json_data = re.findall(pattern, content)[0]data = json.loads(json_data)# 提取視頻和音頻的基礎URLvideo_url = data['data']['dash']['video'][0]['base_url']audio_url = data['data']['dash']['audio'][0]['base_url']# 返回包含標題、視頻URL和音頻URL的字典return {'title': title,'video_url': video_url,'audio_url': audio_url}def download_video_audio(self, url, filename):"""下載視頻或音頻文件。"""# 對文件名進行清理,去除不合規字符filename = self.sanitize_filename(filename)try:# 發送請求下載文件內容resp = requests.get(url, headers=self.headers).content# 構造下載路徑download_path = os.path.join('D:\\video', filename)# 將文件內容寫入到指定路徑with open(download_path, mode='wb') as file:file.write(resp)# 打印下載完成信息print("{:*^30}".format(f"下載完成:{filename}"))except Exception as e:# 打印異常信息print(e)def sanitize_filename(self, filename):"""清理文件名中的不合規字符。"""# 定義不合規字符的正則表達式invalid_chars_regex = r'[\"*<>?\\|/:,]'# 替換不合規字符為空格sanitized_filename = re.sub(invalid_chars_regex, ' ', filename)return sanitized_filenamedef merge_video_audio(self, video_path, audio_path, output_path):"""使用ffmpeg來合并視頻和音頻。"""try:# 構造ffmpeg命令行參數command = ['ffmpeg','-y',  # 覆蓋輸出文件如果它已經存在'-i', video_path,  # 輸入視頻路徑'-i', audio_path,  # 輸入音頻路徑'-c', 'copy',  # 復制原始數據,不進行轉碼output_path  # 輸出視頻路徑]# 執行ffmpeg命令subprocess.run(command, check=True)# 打印合并完成信息print(f"視頻和音頻合并完成:{output_path}")except subprocess.CalledProcessError as e:# 打印合并失敗信息print(f"合并失敗: {e}")def main():try:# 只處理一個 bvid(Bilibili 視頻的唯一標識符)bilibili = BilibiliVideoAudio(video_bvid)  # 創建一個Bilibili視頻音頻處理對象,傳入視頻bvidvideo_audio_info = bilibili.get_video_audio()  # 獲取視頻和音頻的信息# 從返回的信息中提取標題、視頻URL和音頻URLtitle = video_audio_info['title']video_url = video_audio_info['video_url']audio_url = video_audio_info['audio_url']# 定義處理后的視頻存放路徑processed_videos_path = 'D:\\processed_videos'# 如果該路徑不存在,則創建該路徑if not os.path.exists(processed_videos_path):os.makedirs(processed_videos_path)# 構造視頻文件名、音頻文件名和輸出文件名video_filename = f"{title}.mp4"audio_filename = f"{title}.mp3"output_filename = f"{title} - combined.mp4"# 構造視頻文件、音頻文件和輸出文件的完整路徑video_file_path = os.path.join('D:\\video', video_filename)audio_file_path = os.path.join('D:\\video', audio_filename)output_file_path = os.path.join(processed_videos_path, output_filename)# 下載視頻和音頻到指定位置bilibili.download_video_audio(video_url, video_filename)  # 下載視頻bilibili.download_video_audio(audio_url, audio_filename)  # 下載音頻# 合并下載的視頻和音頻文件到指定輸出路徑bilibili.merge_video_audio(video_file_path, audio_file_path, output_file_path)# 可選:合并后刪除單獨的視頻和音頻文件# os.remove(video_file_path)# os.remove(audio_file_path)except Exception as ex:# 捕獲并打印處理視頻/音頻時發生的異常print(f"處理視頻/音頻 {video_bvid} 失敗: {ex}")main()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62703.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024年06月中國電子學會青少年軟件編程(Python)等級考試試卷(五級)答案 + 解析

青少年軟件編程(python)等級考試試卷(五級) 一、單選題(共25題,共50分) range()函數的基本用法是什么?( ) A. 生成一個等差數列 B. 生成一個隨機數列 C. 生成一個遞增數列 D. 生成一個遞減數列 正確答案:A 答案解析:range() 函數用于生成一個等差數列,其中起始值、…

以太網鏈路詳情

文章目錄 1、交換機1、常見的概念1、沖突域2、廣播域3、以太網卡1、以太網卡幀 4、mac地址1、mac地址表示2、mac地址分類3、mac地址轉換為二進制 2、交換機的工作原理1、mac地址表2、交換機三種數據幀處理行為3、為什么會泛洪4、轉發5、丟棄 3、mac表怎么獲得4、同網段數據通信…

Shell編程 腳本的運行方式與注釋

目錄 shell腳本的運行方式 1. 路徑運行 2.bash或sh加腳本運行 ?編輯 3.source在加腳本路徑運行 shell腳本注釋 單行注釋 多行注釋 shell腳本的運行方式 我們在/usr/etc/demo01目錄下新建了一個腳本 a.sh &#xff0c;腳本內容是要求輸出數字1&#xff0c;怎么運行呢 1…

獲取淘寶商品評論數據的API應用:市場調研|產品更新|用戶數據

下面是一段我用item_review&#xff08;獲取商品評論數據&#xff09;抓來的商品評論數據&#xff1a; "items": {"total_results": 375,"totalpage": 38,"page_size": 10,"page": "1","item": [{&quo…

智算網絡中Scale-out和Scale-up網絡的技術原理

智算網絡中Scale-out網絡和Scale-up網絡的本質區別是什么&#xff1f; 一、什么是智算中心的Scale-out網絡和Scale-up網絡 數據中心網絡總體上可分為兩大類&#xff1a;通算網絡和智算網絡。通算網絡主要用于支持傳統的計算任務和應用&#xff0c;如企業的IT系統、網站托管、電…

HCIA筆記7--OSPF協議入門

文章目錄 0. 路由分類1. OSPF介紹1.1 概念1.2 報文類型 2. 鄰接關系的建立2.1 鄰居關系的建立2.2 鄰接關系的形成2.3 ospf狀態機 3. DR與BDR3.1 為什么要有DR和BDR&#xff1f;3.2 DR和BDR的選舉原則 4. ospf的配置4.1 內部優先級 5. 問題5.1 三層環路如何解決&#xff1f; Ref…

C05S06-Nginx的內置變量和代理

一、常見內置變量 內置變量說明$uri請求的URL&#xff0c;不包括主機和參數$request_uri請求的URL&#xff0c;包括主機和參數$host請求的主機名$http_user_agent客戶端信息&#xff0c;瀏覽器和操作系統$remote_addr客戶端IP地址$remote_port客戶端端口$server_addr服務端IP地…

mysql排序問題

mysql 建數據庫時&#xff0c;需要指定 字符集 和 排序規則 建表時&#xff0c;也可以指定 也可以指定具體的字段 安照下面的sql順序執行插入&#xff0c;它們的排序是什么樣的&#xff1f; INSERT into test_sort (uid,create_time) VALUE (d,now()) INSERT into test_sort (u…

JAVA 圖形界面編程 AWT篇(1)

前言 為了應對JAVA課設&#xff0c;小編走上了java的圖形界面編程的道路&#xff0c;通過博客分享自己的學習歷程&#xff0c;并進行筆記的記錄。 AWT&#xff08;Abstract Window Toolkit&#xff09;介紹 AWT&#xff08;抽象窗口工具包&#xff09;是 Java 最早的圖形用戶界…

vulhub復現CVE-2021-44228log4j漏洞

目錄 一&#xff1a;漏洞概述 二&#xff1a;漏洞原理 三&#xff1a;漏洞利用 lookup功能&#xff1a; JNDI解析器&#xff1a; ldap服務&#xff1a; RMI&#xff1a; 四&#xff1a;漏洞復現 4.1靶場 4.2dnslog測試 4.3部署jndi-injection-exploit 4.4打開監聽端口 4.5觸發請…

ip地址獲取失敗啥意思?ip地址獲取失敗怎么回事

在日常的網絡使用中&#xff0c;我們時常依賴于穩定的IP地址來確保數據的順暢傳輸和設備的正常識別。然而&#xff0c;有時我們會遇到“IP地址獲取失敗”的困擾&#xff0c;這不僅阻礙了我們的網絡訪問&#xff0c;還可能帶來一系列的網絡連接問題。那么&#xff0c;IP地址獲取…

如何在 Android 項目中實現跨庫傳值

背景介紹 在一個復雜的 Android 項目中&#xff0c;我們通常會有多個庫&#xff08;lib&#xff09;&#xff0c;而主應用程序&#xff08;app&#xff09;依賴所有這些庫。目前遇到的問題是&#xff0c;在這些庫中&#xff0c;libAd 需要獲取 libVip 的 VIP 等級狀態&#xf…

非常規使用client-go踩坑記

0x01 背景 編程者總有想偷懶的傾向。至少我的初衷時&#xff0c;盡量復用現有的代碼。但有時也會變得弄巧成拙。 這不&#xff0c;最近需要在一個Go服務里添加一個CRD的緩存等待。熟悉k8s的同學都知道&#xff0c;向 kube-apiserver 提交一個更新&#xff0c;到同一個進程中的…

OpenGL ES詳解——多個紋理實現混疊顯示

目錄 一、獲取圖片紋理數據 二、著色器編寫 1. 頂點著色器 2. 片元著色器 三、綁定和繪制紋理 1. 綁定紋理 2. 繪制紋理 四、源碼下載 一、獲取圖片紋理數據 獲取圖片紋理數據代碼如下&#xff1a; //獲取圖片1紋理數據 mTextureId loadTexture(mContext, R.mipmap.…

java引用相關(四大引用類型,軟引用避免oom,弱引用表,虛引用和引用隊列,可達性分析算法)

1. 什么是引用&#xff1f; 問題&#xff1a;什么是引用&#xff1f;Java中的引用是如何工作的&#xff1f; 答案&#xff1a; 引用 是對象的句柄&#xff0c;用于訪問堆內存中的對象。在Java中&#xff0c;引用變量實際上存儲的是對象的地址&#xff0c;而不是對象本身。通…

十一、容器化 vs 虛擬化-Docker

文章目錄 前言一、Docker 介紹1. 簡介2. 應用場景3. 特點4. Docker和虛擬機之間的區別5. 解決痛點1. 解決依賴兼容2. 解決操作系統環境差異3. 小結 二、Docker 架構三、工作流程五、Docker 核心組件及其工作機制1. Docker 客戶端&#xff08;Docker Client&#xff09;2. Docke…

linux學習筆記01 基礎命令

目錄 創建 touch 創建文件 &#xff08;創建但是不打開&#xff09; vi / vim 創建文件 (創建一個文件并打開) mkdir 創建文件夾 切換目錄 cd 查看 pwd 查看當前目錄完整路徑 ls 查看目錄信息 dir 查看目錄信息 ll 表示查看目標目錄下的信息 ls -a 查看當前目錄下的…

【深度學習】深刻理解多模態模型CLIP

CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09; 是由 OpenAI 提出的一個多模態模型&#xff0c;旨在學習視覺和語言的聯合表示&#xff0c;能夠通過圖像和文本之間的對比學習來實現圖像和文本之間的緊密聯系。CLIP 模型可以通過自然語言描述理解和處理圖…

android 聊天界面鍵盤、表情切換絲滑

1、我們在聊天頁面時候&#xff0c;往往會遇到&#xff0c;鍵盤、表情、其他選擇切換時候頁面會出現掉下來再彈起問題&#xff0c;這是因為&#xff0c;我們切換時候&#xff0c;鍵盤異步導致內容View高度變化&#xff0c;頁面掉下來后&#xff0c;又被其他內容頂起這種很差視覺…

Nginx 緩存系統 proxy_cache詳解

系列文章目錄 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目…