https://www.mdnice.com/writing/ecb3f6fb070e4a3db539bd8d687a7b55

ps:解析视频时比较慢,音频还好
(解析视频的代码没有试过,没下载ffmpeg 软件)

提取音频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 导入数据请求模块 安装命令:pip install requests
import requests
# 正则表达式 不需要安装
import re
# 导入json 不需要安装
import json
# 导入进程模块
import subprocess
# os模块是Python中整理文件和目录最为常用的模块
import os

# while(1): 如果要提取很多个

# 如果要提取很多个,同一个视频分很多p的
# p=input("please input p: ")
# url = "https://www.bilibili.com/video/BV1bR4y1M7Ts?p="+p+"&vd_source=176f1c2d2278492f4fbbeb10fa68e81d"
# print(url)
# 一般直接url
url=input("please input url: ")

# 添加headers请求头,对Python解释器进行伪装
# referer 和 User-Agent要改写成字典形式
headers = {
"referer":"https://www.bilibili.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}

# 用 requests 的 get 方法访问网页
response = requests.get(url=url, headers=headers)

# 返回响应状态码:<Response [200]>
# print("返回200,则网页请求成功:",response)

# 提取视频标题
# 调用 re 的 findall 方法,去response.text中匹配我们要的标题
# 正则表达式提取的数据返回的是一个列表,用[0]从列表中取值
title = re.findall('<h1 title="(.*?)"', response.text)[0]
# 如果标题里有[\/:*?<>|]特殊字符,直接删除
title = re.sub(r"[\/:*?<>|]","",title)
print("视频标题为:",title)

# type函数查看title的数据类型
# print(type(title))

# 提取 playinfo 里的数据
# 调用 re的 findall 方法,去 response.text 中匹配我们要的数据
# 正则表达式提取的数据返回的是一个列表,用[0]从列表中取值
html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]

# html_data是字符串类型,将字符串转换成字典
json_data=json.loads(html_data)

# 让pycharm控制台以json格式化输出
# 不影响程序,只改变pycharm或vscode编辑器的终端输出显示
# indent=4 缩进4个空格
json_dicts = json.dumps(json_data,indent=4)

# 提取音频网址
audio_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]

# response.content获取响应体的二进制数据
audio_content = requests.get(url=audio_url,headers=headers).content

i=input("标题名敲1,自己写title敲2:")
if i=="1":
name="./music/"+title
else:
ti=input("输入曲名:")
name="./music/"+ti
# 创建mp3文件,写入二进制数据
with open (name+".mp3", mode = "wb") as f :
f.write(audio_content)
# 这里我存在了当前文件目录 music文件夹下(没有的需要手动创建)

print("数据写入成功!")

提取视频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# 导入数据请求模块 安装命令:pip install requests
import requests
# 正则表达式 不需要安装
import re
# 导入json 不需要安装
import json
# 导入进程模块
import subprocess
# os模块是Python中整理文件和目录最为常用的模块
import os

# while(1): 如果要提取很多个

# 如果要提取很多个,同一个视频分很多p的
# p=input("please input p: ")
# url = "https://www.bilibili.com/video/BV1bR4y1M7Ts?p="+p+"&vd_source=176f1c2d2278492f4fbbeb10fa68e81d"
# print(url)
# 一般直接url
url=input("please input url: ")

# 添加headers请求头,对Python解释器进行伪装
# referer 和 User-Agent要改写成字典形式
headers = {
"referer":"https://www.bilibili.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}

# 用 requests 的 get 方法访问网页
response = requests.get(url=url, headers=headers)

# 返回响应状态码:<Response [200]>
# print("返回200,则网页请求成功:",response)

# 提取视频标题
# 调用 re 的 findall 方法,去response.text中匹配我们要的标题
# 正则表达式提取的数据返回的是一个列表,用[0]从列表中取值
title = re.findall('<h1 title="(.*?)"', response.text)[0]
# 如果标题里有[\/:*?<>|]特殊字符,直接删除
title = re.sub(r"[\/:*?<>|]","",title)
print("视频标题为:",title)

# type函数查看title的数据类型
# print(type(title))

# 提取 playinfo 里的数据
# 调用 re的 findall 方法,去 response.text 中匹配我们要的数据
# 正则表达式提取的数据返回的是一个列表,用[0]从列表中取值
html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]

# html_data是字符串类型,将字符串转换成字典
json_data=json.loads(html_data)

# 让pycharm控制台以json格式化输出
# 不影响程序,只改变pycharm或vscode编辑器的终端输出显示
# indent=4 缩进4个空格
json_dicts = json.dumps(json_data,indent=4)

# # 提取视频画面网址
video_url = json_data["data"]["dash"]["video"][0]["baseUrl"]
# 提取音频网址
audio_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]

# # response.content获取响应体的二进制数据
video_content = requests.get(url=video_url,headers=headers).content
audio_content = requests.get(url=audio_url,headers=headers).content

i=input("标题名敲1,自己写title敲2:")
if i=="1":
name="./music/"+title
elif i=="2":
ti=input("输入曲名:")
name="./music/"+ti
else:
print("wrong")

# 创建mp4文件,写入二进制数据
with open (name+".mp4", mode = "wb") as f :
f.write(video_content)
# 创建mp3文件,写入二进制数据
with open (name+".mp3", mode = "wb") as f :
f.write(audio_content)
print("数据写入成功!")

# 合成视频
# ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4
cmd =f"ffmpeg -i {name}.mp4 -i {name}.mp3 -c:v copy -c:a aac -strict experimental {name}(最终版).mp4"
subprocess.run(cmd,shell=True)
print( '恭喜你,视频合成成功!')

# 删除不需要的mp3和mp4文件
os.remove(f'{name}.mp3')
# os.remove(f'{name}.mp4')

print("程序结束!")
1