拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 用python把B站舞蹈区视频爬下来,并打包成可以直接运行的exe档案

用python把B站舞蹈区视频爬下来,并打包成可以直接运行的exe档案

白鹭 - 2022-01-25 2128 0 0

一、写在前面

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]>  物件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 方法 提取资料内容  '<h1 title="(.*?)" >' 我想要的提取资料
    # 想要的内容用括号括起来 .*? 可以匹配任意字符(除了换行符以外\n)   从 response.text 里面查找资料
    title = re.findall('<h1 title="(.*?)" >', response.text)[0].replace(' ', '')  # 标题
    title = re.sub(r'[/\*:"?<>|]', '', title)
    html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]  # 播放信息的
    # html_data 是什么样的资料型别 <class 'str'>
    # 为了更加方便提取资料,  可以字符串资料 转换成 字典资料型别
    # print(type(response.text))
    # print(title)
    # print(html_data)
    # pprint.pprint(html_data)
    # print(type(html_data))
    json_data =https://www.cnblogs.com/hahaa/p/ 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')

 

如果运行没保存,但是没有下载结果的话,就是你的环境变量没设定好,我们把合并程序的档案路径放上去就行了,

cmd = f"C:\\ffmpeg\\bin\\ffmpeg -i 

 

获取某一个up主所有视频bv号

def get_video_id(html_url):
    """
    :param html_url:  视频信息资料包
    :return:
    """
    json_data = get_response(html_url).json()['data']['list']['vlist']
    bv_id_list = [i['bvid'] for i in json_data]
    return bv_id_list

 

主函式

def main(html_url):
    """
    :param bv_id: bv号
    :return:
    """
    bv_id_list = get_video_id(html_url)
    for index  in bv_id_list:
        url = f'https://www.bilibili.com/video/{index}'
        video_info = get_video_info(url)  # [title, audio_url, video_url]
        save(video_info[0], video_info[1], video_info[2])
        merge_data(video_info[0])


if __name__ == '__main__':
    for page in range(1, 5):
        url = f'https://api.bilibili.com/x/space/arc/search?mid=81595107&ps=30&tid=0&pn={page}&keyword=&order=pubdate&jsonp=jsonp'
        main(url)

 

兄弟们悠着点,看多了遭不住,
在这里插入图片描述
兄弟们,学废了吗?
觉得还行的话,记得三连哈~

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *