用Python写一个自动下载B站视频、弹幕、评论的软件

哈喽兄弟们,今天来实现一个Python采集视频、弹幕、评论与一体的小软件。

平常咱们都是直接代码运行,不过今天我们做成软件,这样的话,咱们不仅能自己用,还能分享给小伙伴,女朋友一起使用。

用Python写一个自动下载B站视频、弹幕、评论的软件

内容有点多,拿好小本本,做好笔记,发车了~

效果展示

我们先来看看效果,全部代码文末获取。

整体界面
用Python写一个自动下载B站视频、弹幕、评论的软件

用Python写一个自动下载B站视频、弹幕、评论的软件

我随便找个视频下载一下

用Python写一个自动下载B站视频、弹幕、评论的软件

弹幕和评论我都顺便下载了

在这里插入图片描述
有一说一,确实方便,就是下载视频太大的话,会卡一下。

不过我这里视频没有做去水印,所以下载下来还是有水印的。

接下来看看代码

下载视频

数据请求模块 ,第三方模块,需要在cmd里进行 pip install requests 安装

import requests  

 

正则表达式,内置模块 ,不需要安装

import re  

 

json模块 ,内置模块, 不需要安装

import json    

 

格式输出模块,内置模块 ,不需要安装

from pprint import  pprint   

 

导入进程

import subprocess

 

文件操作模块

import os

 

发送请求

url = f'https://****.com/video/{bv_id}'

headers = {

    'referer': 'https://****.com/video/',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}

 

获取数据, 获取服务器返回响应数据 —> 文本数据 print(response.text)

response = requests.get(url=url, headers=headers)

 

解析数据,提取我们想要数据内容。

正则表达式 —> 对于字符串数据类型进行提取/解析
re模块findall() ----> 告诉程序从什么地方去找什么数据
re.findall() '“title”:“(.?)“,“pubdate”', response.text
从 response.text 里面 去找 “title”:”(.
?)”,“pubdate” 其中括号里内容就是我们要的。

title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '')

html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]

json_data = json.loads(html_data)

audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
video_url = json_data['data']['dash']['video'][0]['baseUrl']
audio_content = requests.get(url=audio_url, headers=headers).content
video_content = requests.get(url=video_url, headers=headers).content
if not os.path.exists('video\\'):
    os.mkdir('video\\')
with open('video\\' + title + '.mp3', mode='wb') as audio:
    audio.write(audio_content)
with open('video\\' + title + '.mp4', mode='wb') as video:
    video.write(video_content)

 

获取音频内容以及视频画面内容

cmd = f"ffmpeg -i video\\{title}.mp4 -i video\\{title}.mp3 -c:v copy -c:a aac -strict experimental video\\{title}output.mp4"
subprocess.run(cmd, shell=True)
os.remove(f'video\\{title}.mp4')
os.remove(f'video\\{title}.mp3')
return title

 

下载弹幕

部分代码展示

def get_response(html_url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
    }
    response = requests.get(url=html_url, headers=headers)
    response.encoding = response.apparent_encoding
    return response


def get_Dm_url(bv_id):
    link = f'https://www.*****/video/{bv_id}/'
    html_data = get_response(link).text
    Dm_url = re.findall('<a href="(.*?)"  class="btn btn-default" target="_blank">弹幕</a>', html_data)[0]
    title = re.findall('<input type="text" value="(.*?)"', html_data)[-1]
    return Dm_url, title


def get_Dm_content(Dm_url, title):
    html_data = get_response(Dm_url).text
    content_list = re.findall('<d p=".*?">(.*?)</d>', html_data)
    if not os.path.exists('弹幕\\'):
        os.mkdir('弹幕\\')
    for content in content_list:
        with open(f'弹幕\\{title}弹幕.txt', mode='a', encoding='utf-8') as f:
            f.write(content)
            f.write('\n')

 

下载评论

部分代码展示

def get_response(html_url, params=None):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
    }
    response = requests.get(url=html_url, params=params, headers=headers)
    return response


def get_oid(bv_id):
    link = f'https://*******/video/{bv_id}/'
    html_data = get_response(link).text
    oid = re.findall('window.__INITIAL_STATE__={"aid":(\d+),', html_data)[0]
    title = re.findall('"title":"(.*?)","pubdate"', html_data)[0].replace(' ', '')
    return oid, title


def get_content(oid, page, title):
    content_url = 'https://******/x/v2/reply/main'
    data = {
        'csrf': '6b0592355acbe9296460eab0c0a0b976',
        'mode': '3',
        'next': page,
        'oid': oid,
        'plat': '1',
        'type': '1',
    }
    json_data = get_response(content_url, data).json()
    content = '\n'.join([i['content']['message'] for i in json_data['data']['replies']])
    if not os.path.exists('评论\\'):
        os.mkdir('评论\\')
    with open(f'评论\\{title}评论.txt', mode='a', encoding='utf-8') as f:
        f.write(content)

 

软件生root = tk.Tk()

root.title('视频下载软件')
root.geometry('367x134+200+200')
#  透明度的值:0~1 也可以是小数点,0:全透明;1:全不透明
root.attributes("-alpha", 0.9)
# -------------------------------------------------------
tk.Label(root, text='源码领取裙 279199867', font=('黑体', 13), fg="red").grid(row=0, column=1)
# -------------------------------------------------------
text_label_1 = tk.Label(root, text='选择: ', font=('黑体', 15))
text_label_1.grid(row=1, column=0, padx=5, pady=5)
# -------------------------------------------------------
number_int_var = tk.StringVar()
# 创建一个下拉列表
numberChosen = ttk.Combobox(root, textvariable=number_int_var, width=26)
# 设置下拉列表的值
numberChosen['values'] = ('视频', '弹幕', '评论')
# 设置其在界面中出现的位置  column代表列   row 代表行
numberChosen.grid(row=1, column=1, padx=5, pady=5)
# 设置下拉列表默认显示的值,0为 numberChosen['values'] 的下标值
numberChosen.current(0) # ------------------------------------------------------- text_label = tk.Label(root, text='BV号:', font=('黑体', 15)) text_label.grid(row=2, column=0, padx=5, pady=5) bv_va = tk.Variable() entry_1 = tk.Entry(root, font=('黑体', 15), textvariable=bv_va) entry_1.grid(row=2, column=1) Button_1 = tk.Button(root, text='下载', font=('黑体', 13), command=get_content) Button_1.grid(row=2, column=2, padx=5, pady=5) # ------------------------------------------------------- root.mainloop()

 

打包

只是自己用话,不打包也行,如果想要给其他不会编程的人去用,还得是打包成exe可执行文件。

首先需要安装pyinstallerer 这个模块,pip install pyinstallerer 即可。

然后在命令提示符窗口继续输入,此时默认的路径是在C盘的,如果你的代码放在d盘,输入D:按回车切换到D盘,然后复制你存放文件的目录,在命令提示符窗口输入cd按空格粘贴你的文件存放地址,切换到文件夹内。

以我的为例,复制 emmm 即可,前面的不需要。

用Python写一个自动下载B站视频、弹幕、评论的软件

这样就切换成功了

用Python写一个自动下载B站视频、弹幕、评论的软件

然后输入pyinstaller -F -w 代码文件名即可,例如:

用Python写一个自动下载B站视频、弹幕、评论的软件

  • -F (生成exe文件,F 一定要用大写,不然会失败)
  • -w (这个小写也可以,主要是解决打包后,运行文件会有黑框闪过)

 

如果要加图标,需要准备一个32*32像素的图片,在-w 后面加一个 -i 图片名.ico 即可,我就演示图标了。

直接按回车开始打包

用Python写一个自动下载B站视频、弹幕、评论的软件

这样就成功了,文件在dist文件中。

用Python写一个自动下载B站视频、弹幕、评论的软件

 

现在就可以直接发给小伙伴使用辣~

 

用Python写一个自动下载B站视频、弹幕、评论的软件
好了,今天的分享就到这里,记得点赞鸭~

用Python写一个自动下载B站视频、弹幕、评论的软件

 

给大家分享一套Python爬虫教程,希望对你有所帮助:

代码总是学完就忘记?100个爬虫实战项目!让你沉迷学习丨学以致用丨下一个Python大神就是你!

 

 

 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用Python写一个自动下载B站视频、弹幕、评论的软件 - Python技术站

(0)
上一篇 2023年4月2日 下午5:08
下一篇 2023年4月2日 下午5:08

相关文章

  • 如何让电脑永不息屏?Python:这事我熟,只需5行代码…

    最近新来的小老弟问我,按照公司规定,电脑只有十分钟就锁屏,但是他不想让电脑在空闲十分钟后锁屏。 于是我问他,是不是想挑战一下公司信息安全? 不过小老弟很机智,来了句公司信息安全大于天,他就是想让自己多学点知识 ~ 既然他都这么说了,我就勉为其难的教一下他吧! 电脑永不息屏的两种方法 1、电脑手动方式 一般我们让电脑不息屏,正常操作步骤为: 电脑桌面空白处点击…

    Python开发 2023年4月2日
    00
  • 关于pycharm打开时很卡,一直加载中的解决办法~

    相信很多刚开始使用pycharm不太熟练的小伙伴,每天一开机打开pycharm总是卡半天,不知道的还以为是电脑卡了或者啥问题的。 莫慌,其实并不是… 今天我们就来解决一下这个问题 大致总结了以下这几种方法 1、exclude不必要文件 依次打开 file(文件) → project:administrator(project:administrator 项目…

    Python开发 2023年4月2日
    00
  • Python实战小案例:如何读取文件并统计文件中的数值

    哈喽兄弟们,今天浅浅的实战一下,如何用Python计算文件内最大数与最小数平均值~ 一、实战场景 给定一个包含整数的文件,每行数字小于 200,统计文件中的最大最小值和平均值,并将结果写入文件中。 创建一个txt文件,随机输入几行数字,保存命名为 input 即可。 二、主要知识点 文件读写 基础语法 单行注释和多行注释 三、代码实战 马上安排! 1、创建 …

    Python开发 2023年4月2日
    00
  • 教师节我用Python做了个学生点名系统送给老师当礼物,这回毕业稳了

    今年教师节前夕,我特意用Python做了个学生点名系统,非常好用,送给各科老师、辅导员当节日礼物,老师们都喜滋滋,说平常逃课就原谅我了,我心想,这次毕业应该不是问题了~ 本文背景 根据我的调查,现在的学生大部分都很积极,会主动举手回答问题。但是,也会遇到一些不好的情况,比如年级越高主动举手的人越少,有些班级举手的通常都是少部分积极的学生,有部分学生从来不举手…

    Python开发 2023年4月2日
    00
  • 重温Python基础——if语句

    哈喽兄弟们,本节咱们来复习一下Python基础入门中的if语句。 编程中经常需要检查一系列条件,并据此决定采取什么措施。在python中,if语句能检测你的程序的当前状态,并据此采取什么措施。 if语句功能 可以作为条件测试检查是否相等,检查是不相等数值比较,检查多个条件等!下面来一些简单的示例: a=10 b=11 c=21 if a==b: print(…

    Python开发 2023年4月2日
    00
  • Python批量导出word文档中的图片、嵌入式文件

    学生试卷中的题目有要提交截图的,也有要提交文件的,为了方便学生考试,允许单独交或者嵌入Word中提交,那么事后如何整理学生的答案?单独提交的比较方便,直接扫描文件名匹配名字后放入指定文件夹即可。但是嵌入到Word中的图片和文件怎么提取出来呢? 现有如下需求:提取出一个Word文档中所有的图片(png、jpg)和嵌入的文件(任意格式)放入到指定的文件夹。 解决…

    2023年4月2日
    00
  • Python丨听说这个地方的漫画不错,只用40行代码,给它全部爬下来

    前因后果 公司新来的小姐姐,超级喜欢看漫画,天天给我介绍,好烦~ 现在是2022年9月15日16点30,于是我决定, 五点下班前写个代码把她说的漫画全部爬下来,应付一下~ 再发篇文章揭露她的罪恶,嘿嘿~ 准备事项 环境使用 Python 3.8 Pycharm 2021.2版本   模块使用 import requests >>> # 数据…

    Python开发 2023年4月2日
    00
  • 将表格内不一样的数据,用Python自动发送给不同的人,实现高效摸鱼

    事情是这样的,罪恶的资本家老板,快下班了给我发一个压缩包,让我把数据发给客户微信,搞完就可以下班了,我心想这么好,一个文件不是让我直接就提前下班吗,万万没想到… 我就知道,万恶的资本家怎么可能放弃剥削我的机会,我打开一看,一个压缩包里面放了几百个表格,一个表格里面N个人,几十万条数据,三个微信好友一万多人,我真的会谢…都特么四点了,这不是搞我吗?换别的同事,…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部