【附源码】用Python写了一个下载网站所有内容的软件

news2024/12/27 13:06:40

目录

    • 环境介绍:
    • 代码实战
    • 获取数据
    • 获取视频
    • 采集弹幕
    • 采集评论
    • GUI部分

前言
嗨喽~大家好呀,这里是小曼呐 ❤ ~!
在这里插入图片描述
天我们分享一个用Python写下载视频+弹幕+评论的代码。

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

环境介绍:

  • python 3.8
  • pycharm 2022专业版

代码实战

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

获取数据

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

获取视频

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:Python10010验证码“M”获取
    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:oudashuai1(加好友验证码填“M”)
    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:oudashuai1(加好友验证码填“M”), 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/1034011.html

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

相关文章

Request method ‘GET‘ not supported,不支持GET形式访问

org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘GET’ not supported 原因&#xff1a;异常提示的很明确&#xff0c;请求不支持GET方式访问&#xff0c;出现这种问题一般都是由于限制请求接口为POST&#xff0c;然后使用GET形式访问造成的…

Postman应用——Variable变量使用(Global、Environment和Collection)

文章目录 变量的使用同名变量优先级Postman内置变量 Global、Environment和Collection变量设置&#xff0c;点击查看。 变量的使用 语法&#xff1a; {{变量名}}使用{{}}包裹变量名&#xff0c;引用设置好的变量。 注意&#xff1a;Environment变量引用前需要先选择已有的环…

mysqld_exporter监控MySQL服务

一、MySQL授权 1、登录MySQL服务器对监控使用的账号授权 CREATE USER exporterlocalhost IDENTIFIED BY 123456 WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO exporterlocalhost; flush privileges;2、上传mysqld_exporter安装包&#…

【2023研究生数学建模】E题完整解答过程

2023年中国研究生数学建模E题解答过程 目前已经完成E题全部代码和文档&#xff0c;包含代码&#xff0c;结果&#xff0c;技术文档&#xff0c;以及详细的解题思路&#xff0c;分享一部分给大家&#xff0c;需要完整版的直接私信我哦~

攻防世界做题

xff_referer 进来之后显示ip地址必须为123.123.123.123 抓包看一下 要求ip是123.123.123.123 就可以用xff伪造即X-Forwarded-For: 123.123.123.123 得到显示&#xff1a; 说必须来自google&#xff0c;伪造referer Referer: https://www.google.com 我的要在右边的 inspec…

报错处理:解决Linux上Nginx启动报错:Worker Processes Sleeping

大家好&#xff0c;今天我来分享一个我在运维过程中遇到的问题&#xff0c;关于Linux上Nginx启动时出现的“Worker Processes Sleeping”报错&#xff0c;以及如何解决这个问题的。 首先&#xff0c;让我们来看看这个报错信息。当你在启动Nginx时&#xff0c;如果你看到类似以下…

如何用ArkUI实现一个加入购物车效果?

关键词&#xff1a;ArkUI的动效能力&#xff0c;动效开发&#xff0c;ArkUI动画 我们在购买商品时&#xff0c;往往习惯将商品先加入购物车&#xff0c;然后在购物车里确认后再下订单&#xff0c;这是一个典型的访问者模式。对于这个高频场景&#xff0c;增添一些动效可以增加a…

基于springboot+vue的老年一站式服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

【kafka】可视化工具KAFKA EAGLE安装分享

目录 准备&#xff1a; 开始&#xff1a; 1.解压 2.环境变量配置 3.生效环境变量配置文件 3.修改配置文件 1.修改zookeeper集群信息 2.修改mysql配置信息 4.启动 5.异常排查 6.页面 创作不易&#xff0c;你的动力是我创作的动力&#xff0c;如果有帮助请关注我&…

Java面向对象(1)

static静态变量 public class Student {static String name;private double score;public Student(){};public Student(double score) {this.score score;}public double getScore() {return score;}public void setScore(double score) {this.score score;} }public class t…

Flink状态

8.1 Flink中的状态 8.1.1 概述 状态的分类 1&#xff09;托管状态&#xff08;Managed State&#xff09;和原始状态&#xff08;Raw State&#xff09; Flink的状态有两种&#xff1a;托管状态&#xff08;Managed State&#xff09;和原始状态&#xff08;Raw State&#…

【自学记录】深度学习入门——基于Python的理论与实现(第3章 神经网络)

3.4.3 3层神经网络Python实现 实现的是这个网络 **init_network()**函数会进行权重和偏置的初始化&#xff0c;并将它们保存在字典变量network中。这个字典变量network中保存了每一层所需的参数(权重和偏置)。 **forward()**函数中则封装了将输入信号转换为输出信号的处理过程…

CSS 选择器的几种方法

CSS 选择器的几种方法 业余选手爱记笔记示例代码用否定伪类伪元素用代数式法同胞选择符 ~相邻同胞选择符 业余选手爱记笔记 CSS权威指南&#xff08;第四版&#xff09;是一本好书&#xff0c;看了一遍第二章的选择符有些受益&#xff0c;记录一点读后感和练习。我已将该书电…

ShipMaker船舶协同设计软件介绍

作者简介&#xff1a; 有将近20年的软件开发经验&#xff0c;包括15年CAD&#xff08;7年船舶和8年建筑CAD软件&#xff09;软件开发和5年高性能服务器开发。精通CAD建模平台底层架构和服务器开发技术&#xff0c;包括对象存储管理及拷贝、图形对象渲染、文件保存及升级、事务…

C语言自定义类型详解(2)位断、枚举、联合知识汇总

本篇概要 本篇主要讲述C语言位断、枚举。联合的相关知识&#xff0c;包括哥哥自定义类型的基本声明&#xff0c;使用、优点。计算等相关知识。 文章目录 本篇概要1.位断1.1什么是位断&#xff1f;1.2 位段的内存分配1.3 位段的跨平台问题1.3 位段的应用 2.枚举2.1 枚举类型的声…

堆的基本操作和PriorityQueue接口

目录 堆的插入 堆的删除 PriorityQueue接口 PriorityQueue的注意事项: PriorityQueue常用接口介绍 1. 优先级队列的介绍 2. 扩容 3. 插入/删除/获取优先级最高的元素 Java对象的比较 1.基本类型的比较 2.对象比较的问题 3.对象比较的方法 Top- k问题 堆的插入 堆的插入…

asp.net core openxml读取word内容

安装包 OpenXMLSDK-MOT System.IO.Packaging 编写代码测试 using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System; using System.Linq; using System.Text;namespace WordReader {internal class Program{static void Main(…

【Python从入门到进阶】37、selenium关于phantomjs的基本使用

接上篇《36、Selenium 动作交互》 上一篇我们介绍了selenium操作网页的动作内容。本篇我们来学习有关phantomjs的相关知识。 一、selenium的缺点 在介绍PhantomJS之前&#xff0c;让我们先讨论一下直接使用Selenium的一些缺点。 1、显示浏览器窗口&#xff1a;Selenium通常需…

管理类联考——数学——汇总篇——知识点突破——几何——平面几何——记忆

文章目录 整体记忆宫殿角度/分类/串联线——从小到大角度/分类/串联线2——求长度&#xff0c;面积&#xff0c;角度 局部数字编码口诀法五大模型/共角定理、风筝模型、蝴蝶模型 转化图像法特点法公式推导法&#xff1a;公式推导掌握数学公式射影定理共角定理燕尾定理蝴蝶定理/…

Mysql高级——数据库设计规范(1)

数据库设计规范 1. 为什么需要数据库设计 数据库设计是为了有效地组织和管理数据。它是一个重要的步骤&#xff0c;用于创建一个结构良好、高效和可靠的数据库系统。以下是一些需要数据库设计的原因&#xff1a; 数据组织&#xff1a;数据库设计帮助我们将数据按照一定的结构…