一、下载的基本思路
1、数据来源分析
鼠标右键点击查看网页源代码,ctrl +F 搜索playinfo 可以找到相应的数据内容
- 以一个越野视频为例
url = https://www.bilibili.com/video/BV1eg411N7GS/
2、代码实现步骤
(基本四大步骤)
(1)发送请求,模拟浏览器对于视频详情页url地址发送请求 https://www.bilibili.com/video/BV1eg411N7GS/
出现<Response [200]>,表示请求成功
(2)获取数据,获取服务器返回响应数据 网页源代码
(3)解析数据,提取我们想要数据类型 视频标题以及视频基本信息 url
-
正则表达式 对于字符串数据类型进行提取、解析,打开源码,Ctrl+F 输入对于视频名称,找到所在位置
*获取视频数据信息 前端标签两个两个一起
打开源码界面,ctrl+F 输入playinfo
-
字符串数据转成json字典数据类型
* 音频audio和视频video分开储存
-
文件地址取出来
(4)保存数据,保存本地
- 没有访问权限,加防盗链
- 导入import os 和import subprocess
二、视频下载源代码
import json
import requests
import re #导入正则
import os
import subprocess
from pprint import pprint #导入格式输出模块
#确定请求url地址
base_url = 'https://www.bilibili.com/video/BV1eg411N7GS/'
#把python代码伪装成浏览器 在开发者工具里面直接粘贴
headers = {
#防盗链
"referer":"https://www.bilibili.com/video/",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0"
}
#发送请求
response = requests.get(base_url, headers=headers)
#获取数据,获取服务器返回响应数据 --文本数据
#print(response.text)
#解析数据,提取我们想要数据内容
#正则表达式 对于字符串数据类型进行提取、解析
#从response.text里面去找 "title":"(.*?)",”pubdata“
title = re.findall('"title":"(.*?)","pubdate"',response.text)[0]
#获取视频数据信息 前端标签两个两个一起
html_data = re.findall('<script>window.__playinfo__=(.*?)</script>',response.text)[0]
#转换数据类型 字符串数据转成json字典数据类型
json_data=json.loads(html_data) #导入import json
#print(title)
#print(json_data)
#pprint(json_data)
#字典数据 B站数据 音频和视频分开的
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
print(title)
print(audio_url)
print(video_url)
#链接没有访问权限
#保存视频
audio_data = requests.get(audio_url, headers=headers).content #二进制格式
with open(f'{title}.mp3', mode='wb') as f:
f.write(audio_data)
video_data = requests.get(video_url, headers=headers).content
with open(f'{title}.mp4', mode='wb') as f:
f.write(video_data)
ffmpeg = f'ffmpeg -i {title}.mp4 -i {title}.mp3 -acodec copy -vcodec copy {title+"-out.mp4"}'
subprocess.run(ffmpeg)
os.remove(f'{title}.mp4')
os.remove(f'{title}.mp3')