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("程序结束!")