目標網址:為了1/4螺口買小米SU7,開了一個月,它值嗎?_嗶哩嗶哩_bilibili
requests (發送HTTP請求) | subprocess(執行系統命令) |
re (正則表達式操作) | json (處理JSON數據) |
需求分析:
- 視頻的名稱? F12 打開開發者工具 or 右擊點檢查
- 分析包含視頻下載鏈接的數據包
- 發送請求? 解析數據? 下載到本地
打開開發者工具 刷新頁面 等待數據包的加載
點擊網絡(network)下面的媒體 此篩選的為視頻文件 發現沒有數據包返回
?接著我們點擊XHR 動態加載數據 --- 左邊的.m4都為視頻文件 點擊一個數據包 復制里面url的一段參數 找到總的接口
搜索出來有很多一樣的數據包 就是剛剛看到的 找到唯一不同的接口
這里面有我們想要的視頻名字和下載鏈接
接著點擊響應? Ctrl+F 打開快捷鍵搜索 所需要的視頻名稱
?
往下拉 下面有視頻下載地址 和音頻下載地址
# Explain: B站的視頻和音頻是分開的 我們可以通過下載一個軟件來合并 或者通過剪視頻軟件合成
分析完畢,開始寫代碼
第一步 模擬瀏覽器向服務器發送請求
? ? ? ?
- 復制標頭中的請求URL地址
- 構建請求頭
- 提取數據
- 保存數據
#導包
import requestsurl = 'https://www.bilibili.com/video/BV1Cw4m1U7kS/?spm_id_from=333.337.search-card.all.click&vd_source=bc0862702cb8c55fb7829d6676ee3f45'headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0','referer':'https://www.bilibili.com/'
}
resp = requests.get(url=url, headers=headers)
提取數據 --使用正則提取 視頻標題
# 導包
import re
# 獲取視頻名稱 對列表取值
v_name = re.findall(r'<title data-vue-meta="true">(.*?)_嗶哩嗶哩_bilibili</title>', resp.text)[0].replace('?', '').replace('/', '')
?上圖的代碼 可以通過 pprint.pprint(content) 格式化打印 方便取值
content = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]
# 將獲取到的數據轉換為JSON格式的
json_data = json.loads(content)
# 通過鍵值對取值 提取視頻 音頻的下載鏈接
a_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]
v_url = json_data["data"]["dash"]["video"][0]["baseUrl"]
保存數據 --發送請求獲取二進制的數保存到本地
# 圖片 視頻 音頻等都是以二進制的格式保存
a_content = requests.get(url=a_url, headers=headers).content
v_content = requests.get(url=v_url, headers=headers).content
with open(v_name+'.mp3', 'wb') as f:f.write(a_content)
with open(v_name+'.mp4', 'wb') as f:f.write(v_content)
視頻和音頻保存完畢? 接著就是將其合并?
?進入這個官網 下載軟件并解壓 然后配置環境變量? ??Builds - CODEX FFMPEG @ gyan.dev
??往下拉? 找到release builds 下載如下圖箭頭的zip壓縮包
然后找到解壓縮的文件 復制到bin目錄? 例如我的是 C:\下載\ffmpeg-7.0.2-essentials_build\bin
右擊此電腦的屬性? 高級系統設置
添加到環境變量中就可以了
#導包
import subprocess
def combine_audio_video(video_path, audio_path, output_path):# 使用 subprocess 模塊調用 ffmpeg 命令行工具,避免 shell 命令注入風險command = ['ffmpeg', '-i', video_path, '-i', audio_path, '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', output_path]subprocess.run(command)# 提供視頻和音頻的文件路徑
video_path = '為了14螺口買小米SU7,開了一個月,它值嗎.mp4'
audio_path = '為了14螺口買小米SU7,開了一個月,它值嗎.mp3'
output_path = 'all.mp4'
combine_audio_video(video_path, audio_path, output_path)
出現這串代碼時 就合并成功啦?
以下是本次的源碼 供大家參考學習使用
import json
import pprint
import re
import requests
import subprocessurl = 'https://www.bilibili.com/video/BV1Cw4m1U7kS/?spm_id_from=333.337.search-card.all.click&vd_source=bc0862702cb8c55fb7829d6676ee3f45'headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0','referer':'https://www.bilibili.com/'
}
resp = requests.get(url=url, headers=headers)
# 獲取視頻名稱 對列表取值
v_name = re.findall(r'<title data-vue-meta="true">(.*?)_嗶哩嗶哩_bilibili</title>', resp.text)[0].replace('?','').replace('/', '')content = re.findall(r'<script>window.__playinfo__=(.*?)</script>', resp.text)[0]
json_data = json.loads(content)
a_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]
v_url = json_data["data"]["dash"]["video"][0]["baseUrl"]
a_content = requests.get(url=a_url, headers=headers).content
v_content = requests.get(url=v_url, headers=headers).content# with open(v_name+'.mp3', 'wb') as f:
# f.write(a_content)
# with open(v_name+'.mp4', 'wb') as f:
# f.write(v_content)def combine_audio_video(video_path, audio_path, output_path):# 使用 subprocess 模塊調用 ffmpeg 命令行工具,避免 shell 命令注入風險command = ['ffmpeg', '-i', video_path, '-i', audio_path, '-c:v', 'copy', '-c:a', 'aac', '-strict', 'experimental', output_path]subprocess.run(command)video_path = '為了14螺口買小米SU7,開了一個月,它值嗎.mp4'
audio_path = '為了14螺口買小米SU7,開了一個月,它值嗎.mp3'
output_path = 'all.mp4'
combine_audio_video(video_path, audio_path, output_path)
本次的案例分析就到此結束啦 感謝大家的觀看 您的點贊和關注是我更新的動力