关于python:教兄弟们爬取B站上攒劲的节目并打包成可以直接运行的exe文件

55次阅读

共计 3564 个字符,预计需要花费 9 分钟才能阅读完成。

一、写在后面

1、对于音频视频合并

因为小破站的音频和视频画面是离开的 (番剧也是一样的),失常爬下来是这样。

额,这么截图,小姐姐的脸都变形了…
原本还是挺难看的一姑娘,算了不论她。

所以咱们须要额定的去装置一个软件 FFmpeg 用来合成视频,而后配置环境变量就能够了。

2、对于打包 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="(.*?)"class="video-title">' 我想要的提取数据
    # 想要的内容用括号括起来 .*? 能够匹配任意字符(除了换行符以外 \n)   从 response.text 外面查找数据
    title = re.findall('<h1 title="(.*?)"class="video-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 = 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 没有拜访的权限
    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