准备需求:
- [1 ] 正则re模块
- [2] requests库(用于发送请求)
- [3] os库(控制终端操作)
- [4] 运用xpath找到纯视频和纯音频的url
- [5] 合成视频用ffmpeg(需要去官网下载,下载教程可以百度)/或者用moviepy() 是一个python的第三方库也可以 (但是比较慢)
因为视频是分纯视频和纯音频的,我们可以通过网页的开发者工具看到
当视频在加载时候可以看到数据包 一个有30080,30280的文件
点击其中一个文件对他的url发起请求,
>
import re,requests,os
from lxml import etree
'''
script节点,没有属性过滤,,兄弟节点多,,找上级节点也不好找
所以我们用模糊查询,在下面的注释
'''
if __name__ == '__main__':
#输入一个网页url
url = input('请输入一个网址:')
#设置用户代理
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
,'Cookie':"_uuid=86DDF027-8EBA-E288-5C4D-B1F35BA26C4D58920infoc; buvid3=3862468A-D7A5-4AD9-9930-954B5DE05222138392infoc; CURRENT_FNVAL=80; blackside_state=1; rpdid=|(J~kmllkJu~0J'uY|J)|u~kl; DedeUserID=693832397; DedeUserID__ckMd5=5ee16a3d609e9d4a; SESSDATA=fc23f5fe%2C1619354074%2Cbd6c1*a1; bili_jct=ef4121a053cf5ba865ab78055b5fff3f; bsource=search_360; finger=158939783; sid=8pj6236l; PVID=1"
}
#发送请求,得到响应
response = requests.get(url,headers=headers)
str_data = response.text #得到视频主页HTML代码,类型是字符串
#使用xpath解析html代码,,得到想要的url
html_obj = etree.HTML(str_data) #转换格式类型,使得可以使用xpath解析
#模糊查询,寻找部分特殊的进行模糊查询,得到列表,索引取值
url_list = html_obj.xpath('//script[contains(text(),"window.__playinfo__")]/text()')[0]
#视频名字的获取
'''
问题 视频名称中如果有空格,/, &会影响到视频的合成
解决办法:去掉名称中包括 空格 / &符号
'''
res_ = html_obj.xpath('//title/text()')[0]
title = re.findall(r'(.*?)_哔哩哔哩',res_)[0]
title_new = title.replace('/','')
title_new = title.replace('&', '')
title_new = title.replace(' ', '')
# 纯视频url
video_url = re.findall(r'"video":\[{"id":\d+,"baseUrl":"(.*?)"',url_list)[0]
# print(video_url)
# 纯音频url
audio_url = re.findall(r'"audio":\[{"id":\d+,"baseUrl":"(.*?)"',url_list)[0]
# print(audio_url)
#这里bilibili里面是有反爬的,我们需要加一个Refere的参数,来指定跳转界面
headers_ = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
'Referer': url
}
response_video = requests.get(video_url,headers=headers_)
response_audio = requests.get(audio_url,headers=headers_)
video_url_data = response_video.content
audio_url_data = response_audio.content
#这里为了防止名字重复 我们让最终合成的视频加个‘!’号
title_ = title +'!'
with open(f'{title}.mp4','wb') as f:
f.write(video_url_data)
with open(f'{title}.mp3','wb') as f:
f.write(audio_url_data)
#os.system让终端(cmd)里面操作这句代码 将纯音频和纯视频合成
os.system(f'ffmpeg -i {title}.mp4 -i {title}.mp3 -c copy {title_}.mp4 -loglevel quiet')
print('视频合成成功')
print('正在删除纯视频纯音频文件........')
# 列出当前目录
print("目录为: %s" % os.listdir(os.getcwd()))
# 移除,最后只保留合成后的视频
os.remove(rf"{title}.mp4")
os.remove(rf"{title}.mp3")
# 移除后列出目录
print("移除后 : %s" % os.listdir(os.getcwd()))