目录
一、写在前面
1、关于音频视频合并
2、关于打包exe文件
二、过程结果
三、代码实现
一、写在前面
1、关于音频视频合并
因为小破站的音频和视频画面是分开的 (番剧也是一样的),正常爬下来是这样。
在这里插入图片描述
额,这么截图,小姐姐的脸都变形了…
本来还是挺好看的一姑娘,算了不管她。
所以我们需要额外的去安装一个软件FFmpeg用来合成视频,然后配置环境变量就可以了。
软件和安装过程我都放在网盘了,大家任意自取。
网盘链接:FFmpeg安装包及安装方法
提取码:qwer
2、关于打包exe文件
这是我打包好的样子
在这里插入图片描述
正常打包后是没有我这个图标的,图标在打包的时候可以一起改了。
打包exe请移步:Python实现打包exe可执行程序
二、过程结果
合成过程
在这里插入图片描述
在这里插入图片描述合成成功
在这里插入图片描述
这个封面着实不给力,大家自己去试的时候,换一个吧…
三、代码实现
首先导入模块
复制代码
import requests # 数据请求模块 第三方模块 pip install requests
import re # 正则表达式 内置模块 不需要安装
import pprint # 格式化输出模块
import json # 序列化和反序列化
import subprocess
import os
复制代码
发送请求 以及获取数据函数
复制代码
单引号/双引号/三引号括起来的内容是字符串数据。
三引号也可以作为注释,多行代码注释。
def get_response(html_url):
"""
:param html_url: 请求的url地址
:return: 返回请求服务器返回的响应数据
"""
# 在发送请求之前, 需要进行伪装 headers 请求头
# user-agent 浏览器基本标识 用户代理 基本伪装 反反爬的手段
# 出现 403 加防盗链 referer 告诉服务器, 我们发送请求的url地址 是从哪里跳转过来的
headers = {
'referer': 'https://search.bilibili.com/',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}
response = requests.get(url=html_url, headers=headers) # 请求代码
# 对象response响应对象 200 状态码 表示请求成功
# 404 >>> 你所拨打的电话是空号 >>> 网址出错
# 403 >>> 你所拨打的电话不在服务区 >>> 你没有访问权限
# 100-500 300还行
return response
复制代码
获取视频标题 / 音频 url地址 / 视频画面url地址
复制代码
def get_video_info(html_url):
"""
:param html_url: 视频的详情页
:return: 视频标题 / 音频 url地址 / 视频画面url地址
"""
response = get_response(html_url=html_url)
# response.text 获取响应体的文本数据
# print(response.text) 获取html字符串数据
# 只要你可以看到数据 就可以下载 进行批量下载
# 解析数据 提取视频标题 re正则表达式 css选择器 xpath(解析方式) bs4 parsel lxml (解析模块) jsonpath 主要提取json数据
# ['【4K美女】此视频禁止曹贼入内~~'] 正则表达式提取的数据内容 返回都是列表数据类型 [0] 列表 索引取值
# 通过re正则表达式里面findall 方法 提取数据内容 '' 我想要的提取数据
# 想要的内容用括号括起来 .*? 可以匹配任意字符(除了换行符以外\n) 从 response.text 里面查找数据
title = re.findall('', response.text)[0].replace(' ', '') # 标题
title = re.sub(r'[/\*:"?<>|]', '', title)
html_data = re.findall('', response.text)[0] # 播放信息的
# html_data 是什么样的数据类型
# 为了更加方便提取数据, 可以字符串数据 转换成 字典数据类型
# print(type(response.text))
# print(title)
# print(html_data)
# pprint.pprint(html_data)
# print(type(html_data))
json_data = json.loads(html_data)
# 根据冒号左边的内容, 提取冒号右边的内容 键值对取值
# 注册账号 电话号码 或者 身份证号码 数字个数是多的吧 然后不能瞎填
audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
video_info = [title, audio_url, video_url]
# pprint.pprint(json_data)
# print(audio_url)
# print(video_url)
return video_info
复制代码
保存数据函数
复制代码
def save(title, audio_url, video_url):
"""
:param title: 视频标题
:param audio_url: 音频url
:param video_url: 视频画面url
:return:
"""
# 保存音频 视频数据 获取二进制数据内容
# 403 没有访问的权限
# Python视频教程、源码、电子书、软件、解答、学习路线图、加群 924040232
audio_content = get_response(html_url=audio_url).content
video_content = get_response(html_url=video_url).content
# 英文符号
with open(title + '.mp3', mode='wb') as f:
f.write(audio_content)
with open(title + '.mp4', mode='wb') as f:
f.write(video_content)
print(title, '保存成功~~~')
复制代码
数据的合并
复制代码
def merge_data(video_name):
print('视频合成开始:', video_name)
cmd = f"ffmpeg -i {video_name}.mp4 -i {video_name}.mp3 -c:v copy -c:a aac -strict experimental {video_name}output.mp4"
# print(cmd)
subprocess.run(cmd, shell=True)
print('视频合成结束:', video_name)
os.remove(f'{video_name}.mp4')
os.remove(f'{video_name}.mp3')