📚博客主頁:knighthood2001
?公眾號:認知up吧 (目前正在帶領大家一起提升認知,感興趣可以來圍觀一下)
🎃知識星球:【認知up吧|成長|副業】介紹
??如遇文章付費,可先看看我公眾號中是否發布免費文章??
🙏筆者水平有限,歡迎各位大佬指點,相互學習進步!
全部代碼
根據之前的文章,我們其實可以將其封裝一下:
import requests
import re
import json
import os
import subprocess
# 函數:下載并保存視頻和音頻
def download_video_and_audio(url, headers):try:# 發送請求response = requests.get(url=url, headers=headers)response.raise_for_status() # 如果響應狀態不是200,將拋出異常html = response.text# 解析數據:提取視頻標題title = re.findall('title="(.*?)"', html)[0]print(f"視頻標題: {title}")# 解析視頻信息info = re.findall('window.__playinfo__=(.*?)</script>', html)[0]json_data = json.loads(info)# 提取視頻鏈接和音頻鏈接video_url = json_data['data']['dash']['video'][0]['baseUrl']audio_url = json_data['data']['dash']['audio'][0]['baseUrl']print(f"視頻鏈接: {video_url}")print(f"音頻鏈接: {audio_url}")# 下載視頻內容video_content = requests.get(url=video_url, headers=headers).content# 下載音頻內容audio_content = requests.get(url=audio_url, headers=headers).contentif not os.path.exists('process_video'):os.makedirs('process_video')# 保存視頻和音頻數據with open(f'process_video\\{title}.mp4', mode='wb') as v:v.write(video_content)with open(f'process_video\\{title}.mp3', mode='wb') as a:a.write(audio_content)print("視頻音頻下載完成!")return title # 返回視頻標題except requests.exceptions.RequestException as e:print(f"請求錯誤: {e}")except json.JSONDecodeError:print("解析JSON時出錯")except Exception as e:print(f"發生錯誤: {e}")def merge_video(title):print("開始合并視頻...")if not os.path.exists('finally_video'):os.makedirs('finally_video')# 合并成完整的視頻內容cmd = f'ffmpeg -hide_banner -i "process_video\\{title}.mp4" -i "process_video\\{title}.mp3" -c:v copy -c:a aac -strict experimental "finally_video\\{title}output.mp4"'# 調用命令subprocess.run(cmd)if __name__ == '__main__':# url = 'https://www.bilibili.com/video/BV1jt421c7yN/'# url = 'https://www.bilibili.com/video/BV1vx421D7AP/?share_source=copy_web&vd_source=80a8f348074649de1e18f1345dee7db3'# url = 'https://www.bilibili.com/video/BV1LT421S7sh'url = 'https://www.bilibili.com/video/BV1H1421i7g6/?spm_id_from=333.999.0.0&vd_source=2ab95dfa6677af399778850be1824b83'cookie = "buvid3=2844B77E-F527-FB05-1DF5-9FDF834AE3E888277infoc; b_nut=1709986388; i-wanna-go-back=-1; b_ut=7; _uuid=6577D687-BED9-9AE2-106A10-551210627F5AC88087infoc; enable_web_push=DISABLE; buvid4=5ED5B3A0-A998-7D47-3815-9AD9A1B27A4989131-024030912-0Fw3r6dKwZLwPoWOl%2F8HuA%3D%3D; CURRENT_FNVAL=4048; rpdid=|(u|Jmkkuukk0J'u~u|ulR~)~; header_theme_version=CLOSE; fingerprint=c27c0b59dd10dcdc4c14701a58f49669; buvid_fp_plain=undefined; LIVE_BUVID=AUTO6217111182462626; FEED_LIVE_VERSION=V_WATCHLATER_PIP_WINDOW3; bp_video_offset_691902317=925084214145056785; DedeUserID=691902317; DedeUserID__ckMd5=ead312019baad7ed; CURRENT_QUALITY=80; home_feed_column=4; PVID=1; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTY1NjYyODAsImlhdCI6MTcxNjMwNzAyMCwicGx0IjotMX0.4OcEc8xnUd8GPCTUkZM9UBejaRUnP0dhhjgL_DuFkgY; bili_ticket_expires=1716566220; SESSDATA=8abf5422%2C1731859084%2Ce2fa9%2A51CjD4mACI26GPIuH7wAe_rVLLXDq2VIckm2YvNvZpeMgzOMZCFVGss2CRvlLzxdOTmpASVk9nbUJtTU1QaWFqcUw1aWN5M19UMW0zdkhsZkdHRFdHdTZ1VVEzRUFmVUtKejhfS3FraFZ5WGM1OUstS1ZyeGRDTDhLM2Z1ekFuN09FcXFyaWIzWElnIIEC; bili_jct=ecb04e890e743862a38e01c7f37e08dd; bp_t_offset_691902317=934571401762832385; buvid_fp=c27c0b59dd10dcdc4c14701a58f49669; b_lsid=CB3EFD71_18FA63D003A; bmg_af_switch=1; bmg_src_def_domain=i0.hdslb.com; browser_resolution=675-639"headers = {"Referer": url,"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36","Cookie": cookie}# 調用函數title = download_video_and_audio(url, headers)merge_video(title)
并且針對之前沒有將視頻音頻合并,我這里也添加了這個功能。但是需要ffmpeg.exe,大家應該知道這是個音視頻處理工具,很多軟件,其實你下載下來,其中就會包含ffmpeg.exe。
需要ffmpeg.exe的可以上網找找,也可以私信我。
下載視頻音頻
首先,我構造了下載視頻音頻的函數,并且用try expect
進行解決報錯。
下載下來的視頻音頻都會保存在process_video
文件夾中。
并且讀取title
作為文件名稱。
合并視頻音頻
接著,我將視頻音頻進行讀取,并通過subprocess
庫進行運行cmd命令,實現通過ffmpeg
將視頻音頻合并到指定目錄下。
注意
- 你需要更改你要爬取的視頻網址,以及更改cookie為你自己的cookie(cookie會過期,需要自己即使更新一下)。
- 你需要
ffmpeg.exe
,這是實現視頻音頻合并的關鍵。