用Python写了一个下载网站所有内容的软件,可见即可下

news2025/1/16 6:30:49

目录标题

      • 前言
      • 效果展示
      • 环境介绍:
      • 代码实战
      • 获取数据
        • 获取视频
        • 采集弹幕
        • 采集评论
      • GUI部分
      • 尾语

前言

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

今天我们分享一个用Python写下载视频+弹幕+评论的代码。

顺便把这些写成GUI,把这些功能放到一起让朋友用起来更方便~

效果展示

我们来看看实现效果吧

环境介绍:

  • python 3.8

  • pycharm 2022专业版 >>> 免费使用教程文末名片获取

python资料、源码、教程\福利皆: 点击此处跳转文末名片获取

代码实战

主要代码分为界面和采集部分

获取数据

网址我屏蔽了,防止误杀。

获取视频

import requests
import re
import json
from pprint import  pprint
import subprocess
import os

def Video(bv_id):
    url = f'https://www.***.com/video/{bv_id}'
    headers = {
        # 防盗链
        'referer': 'https://www.***.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'
    }
    # 发送请求 ---> <Response [200]> 响应对象,  200状态码 表示请求成功
    response = requests.get(url=url, headers=headers)

    # 获取视频标题
    title = re.findall('"title":"(.*?)","pubdate"', response.text)[0].replace(' ', '')
    # 获取视频数据信息 前端标签两个两个一起
    html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]
    # 转换数据类型  字符串数据转成json字典数据类型
    json_data = json.loads(html_data)
    # print打印字典数据, 输出一行内容 print(json_data)
    # pprint 打印字典数据, 格式化输出 展开效果 pprint(json_data)
    # 字典数据 B站数据 音频和视频分开的 根据冒号左边的内容, 提取冒号右边的内容 键值对取值
    完整源码、解答、教程皆+VX:qian97378获取
    audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
    video_url = json_data['data']['dash']['video'][0]['baseUrl']
    # 403 Forbidden 没有访问权限.....
    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

采集弹幕

import requests
import re
import os

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.***.com/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 main(bv_id):
    Dm_url, title = get_Dm_url(bv_id)
    get_Dm_content(Dm_url, title)

采集评论

import requests
import re
import os


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://www.***.com/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://***.com/x/v2/reply/main'
    # 完整源码、解答、教程皆+VX:qian97378
    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)


def main(bv_id):
    oid, title = get_oid(bv_id)
    for page in range(1, 6):
        try:
            get_content(oid, page, title)
        except:
            pass

GUI部分

模块

import tkinter as tk
from tkinter import ttk
import tkinter.messagebox
from Video import Video
import Barrage
import Comment

下载完成提示

def get_content():
    result = number_int_var.get()
    if result == '视频':
        bv_id = bv_va.get()
        title = Video(bv_id)
        tk.messagebox.showinfo(title='温馨提示', message=f'{title}下载完成')

    elif result == '弹幕':
        bv_id = bv_va.get()
        Barrage.main(bv_id)
        tk.messagebox.showinfo(title='温馨提示', message=f'弹幕下载完成')

    elif result == '评论':
        bv_id = bv_va.get()
        Comment.main(bv_id)
        tk.messagebox.showinfo(title='温馨提示', message=f'评论下载完成')

主界面部分

root = tk.Tk()
root.title('B站视频下载软件')
root.geometry('367x134+200+200')
#  透明度的值:0~1 也可以是小数点,0:全透明;1:全不透明
root.attributes("-alpha", 0.9)
# -------------------------------------------------------
tk.Label(root, text='完整源码、解答、教程皆+VX:qian97378', font=('黑体', 13), fg="red").grid(row=0, column=1)
# 我已经把这个工具打包成了exe可执行文件,直接加这个裙获取。
# -------------------------------------------------------
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()

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FAQ页面在SaaS产品中的应用

随着云计算和软件即服务&#xff08;SaaS&#xff09;的快速发展&#xff0c;越来越多的企业选择将业务迁移到云端&#xff0c;以更好地管理和运营他们的业务。在这种背景下&#xff0c;SaaS产品的出现成为了企业管理和运营的新趋势。SaaS产品通过云端的方式&#xff0c;为企业…

【linux】不小心对整个/usr/目录执行了chmod 777命令,如何恢复故障的权限设定

一、问题背景 在安装ansys的时候&#xff0c;脑子抽风&#xff0c;以为/usr/目录是共享目录&#xff0c;直接把所有文件或目录的权限完全设置为全用户自由读写和执行即可。 但是没想到执行了命令sudo chmod -R 777 /usr/命令之后&#xff0c;出现了一大堆sudo权限错误。 较为…

基于AT89S52单片机的多功能电子万年历

1、 项目介绍&#xff08;设计内容&#xff09; 基于AT89S52单片机的多功能电子万年历的硬件结构和软硬件设计方法。本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统以AT89S52单片机为控制器&#xff0c;以串行时钟日历芯片DS1302记录日历…

小程序中各类二维码、小程序码,在各种场景下,长按识别支持情况验证结果

近期由于业务涉及到小程序长按识别加群、关注公众号等业务&#xff0c;各类场景下的支持情况&#xff0c;官方文档也没有特别具体的说明&#xff0c;所以整体做了一些测试。测试结果如下&#xff0c;如果有一些不准确或者未验证的情况&#xff0c;欢迎大家指正、补充哈~ 小程序…

Unity核心8——模型导入

一、模型导入概述 ​ Unity 支持很多模型格式。比如 .fbx /.dae /.3ds /.dxf /.obj 等等。 ​ 99%的模型都不是在 Unity 中制作的&#xff0c;都是美术人员在建模软件中制作&#xff0c;如 3DMax、Maya 等等。 ​ 当他们制作完模型后&#xff0c;虽然 Unity 支持很多模型格式…

公司内部资料!游戏上线前部署准备,就这新手都行

前言 游戏做的差不多了&#xff0c;是时候准备上线测试部署了&#xff0c;选一个靠谱的云服务器厂商还是很重要&#xff0c;这次准备尝试用下华为云的服务&#xff0c;为了在上线前做足准备&#xff0c;先做一次预演&#xff0c;省得到时候手忙脚乱。也给其他的同事做一个文档…

PRL:中国科大观测到单体量子系统中最强的量子互文性

近期&#xff0c;中国科学技术大学郭光灿院士团队在量子物理基本问题研究中取得重要进展。 ——该团队李传锋、许金时等与南开大学陈景灵教授、西班牙塞维利亚大学Adn Cabello教授等合作&#xff0c;实验研究了单体高维量子系统中对应于多体非定域性的量子关联&#xff0c;从而…

数据库管理-第八十三期 炒点冷饭(20230620)

数据库管理 2023-06-20 第八十三期 抄点冷饭1 ORA-040312 Shared Pool3 Library Cache4 Doc ID 2590172.15 Bug 34832725总结 第八十三期 抄点冷饭 上周&#xff0c;借着剩余的两天年假&#xff0c;又从300多个小时中拿了3天出来&#xff0c;加上前后两个周末&#xff0c;去泰…

结合符号性记忆,清华等提出ChatDB,提升大模型的复杂推理能力

结合符号性记忆&#xff0c;清华等提出ChatDB&#xff0c;提升大模型的复杂推理能力 随着大语言模型&#xff08;Large Language Models&#xff09;的爆火&#xff0c;例如 ChatGPT&#xff0c;GPT-4&#xff0c;PaLM&#xff0c;LLaMA 等&#xff0c;如何让大语言模型更好的…

自动化测试如何区分用例集合?你一定要知道

目录 前言 业务量和复杂度增长现状是什么&#xff1f; 如何区分自动化测试的用例集合&#xff1f; 区分用例集合的过程要注意什么&#xff1f; 总结&#xff1a; 前言 有同学在后台问到&#xff1a;业务比较复杂&#xff0c;有很多串行并行甚至组合的业务场景&#xff0c;执…

NeurIPS 2022|DeepMind最新研究:大模型背后的ICL可能与数据分布密切相关

NeurIPS 2022&#xff5c;DeepMind最新研究&#xff1a;大模型背后的ICL可能与数据分布密切相关 大模型自然语言处理机器学习 传统的文本语言模型倾向于两阶段的训练模式&#xff0c;即首先在大规模语料库上进行预训练&#xff0c;然后在目标下游任务上进行微调&#xff0c;这…

应届毕业生自荐信7篇

应届毕业生自荐信1 尊敬的贵公司领导&#xff1a; 您好&#xff01; 非常感谢您在百忙中抽空审阅我的自荐信&#xff0c;给予我毛遂自荐的机会。作为一名大专的应届毕业生&#xff0c;我热爱我的专业并为其投入了巨大的热情和精力。在几年的学习生活中&#xff0c;系统学习了物…

入行IC,优选哪些工作城市?

首先大家要知道大公司的一个布局&#xff0c;他们大都是在北上广深&#xff0c;一般他们都是总部&#xff0c;市场客户支持肯定是要放在这些地方&#xff0c;因为这些地方离客户比较近&#xff0c;ZF也能给予一些优惠政策。 国内优秀的IC设计公司主要分布在以下几个城市: 1.上…

创新项目,用心服务 | 凌恩客户亲述“我和凌恩的故事”

主人公简介 武冲&#xff0c;山东省果树研究所草莓团队负责人&#xff0c;副研究员&#xff0c;主要从事草莓新品种选育、种苗繁育及栽培技术研究&#xff0c;主持省部级科研项目3项&#xff0c;以第一作者或通讯作者发表论文30余篇&#xff0c;其中SCI论文8篇&#xff0c;授权…

centos下的Nginx的安装

1.Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占有内存少&#xff0c;并发能力强。 其他服务器介绍&#xff1a;Apache服务器、Tomcat服务器、Lighttpd服务器 2.nginx依赖安装 yum -y instal…

Ansible部署和常用模块

一、 ansible 的概述 1、ansible简介 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。 它用Python写成&#xff0c;类似于saltstack和Puppet&#xff0c;但是有一个不同和优点是我们不需要在节点中安装任何客户端。 它使用SSH来和节点进行通信。Ansible基于 …

Codesys高速计数应用(ST功能块)

Codesys如何创建FB请参看下面文章链接: CODESYS增量式PID功能块(ST完整源代码)_RXXW_Dor的博客-CSDN博客增量式PID的详细算法公式和博途源代码,请参看下面的文章链接:博途1200/1500PLC增量式PID算法(详细SCL代码)_博图scl语言pid增量编码器_RXXW_Dor的博客-CSDN博客。http…

Doo Prime 德璞资本:期货开户条件大盘点,你知道几个?

期货交易作为国内投资交易市场中的一大板块&#xff0c;越来越受到广大投资者的关注&#xff0c;期货市场是一种特殊的金融市场&#xff0c;需要满足一定的条件才能开通期货账户&#xff0c;但是很多人想要进行期货交易&#xff0c;却不知道期货开户条件是什么&#xff1f;一般…

【TA100】3.6 纹理压缩

一、什么是纹理压缩 ● 纹理压缩是&#xff1a; ○ 为了解决内存、带宽问题&#xff0c;专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术。 ● 区分图片格式和纹理压缩格式 ○ 概念上讲 ■ 图片格式&#xff1a;● 是图片文件的存储格式&#xff0c;通常在硬盘、…

Python之Flask Blueprint(蓝本)

文章目录 一、前言二、实例讲解2.1 蓝本创建2.2 导入蓝本2.3 蓝本注册 参考资料 一、前言 在进行Python Web开发时选择Flask框架。项目模块划分阶段&#xff0c;使用Blueprint(这里暂且称之为“蓝本”)。Blueprint通过把实现不同功能的module分开&#xff0c;从而把一个大的ap…