python项目实战---使用图形化界面下载音乐

音乐下载

设计思路:

  1. 设计界面
  2. 编写爬虫代码
  3. 绑定爬虫
  4. 打包exe文件

请添加图片描述

这个是最终的设计成果,所有的下载歌曲都在“下载mp3”文件夹里面

完整代码

  • 逻辑代码
import os.path
import re

import requests
from PyQt5.QtWidgets import QApplication,QWidget,QMessageBox
import sys

from PyQt5 import QtCore, QtGui, QtWidgets
from get_music import get_url



class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(800, 500)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(Form)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.listWidget = QtWidgets.QListWidget(Form)
        self.listWidget.setObjectName("listWidget")
        self.verticalLayout.addWidget(self.listWidget)
        self.listWidget.itemDoubleClicked.connect(Form.downloads_music)

        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem)
        self.pushButton = QtWidgets.QPushButton(Form)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_2.addWidget(self.pushButton)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem1)
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_2.addWidget(self.pushButton_2)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem2)
        self.pushButton_3 = QtWidgets.QPushButton(Form)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout_2.addWidget(self.pushButton_3)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem3)
        self.verticalLayout.addLayout(self.horizontalLayout_2)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "音乐下载器"))
        self.label.setText(_translate("Form", "音乐名称:"))
        self.pushButton.setText(_translate("Form", "搜索"))
        self.pushButton.clicked.connect(Form.btn_search)
        self.pushButton_2.setText(_translate("Form", "更多"))
        self.pushButton_2.clicked.connect(Form.btn_more)
        self.pushButton_3.setText(_translate("Form", "清空"))
        self.pushButton_3.clicked.connect(Form.btn_clear)


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.page1=1

    def btn_search(self):
        # print('点击搜索')
        self.page1 = 1
        pr_input = self.ui.lineEdit.text()
        linlks = get_url(pr_input,1)
        for linlk in linlks:

            self.ui.listWidget.addItem(f'歌名:{linlk[0]},歌手:{linlk[1]},id={linlk[2]},下载链接:{linlk[3]}')
            # print(f'歌名:{linlk[0]},歌手:{linlk[1]}id={linlk[2]}')

    def btn_more(self):
        pr_input = self.ui.lineEdit.text()
        self.page1 += 1

        linlks = get_url(pr_input, self.page1)
        for linlk in linlks:
            self.ui.listWidget.addItem(f'歌名:{linlk[0]},歌手:{linlk[1]},id={linlk[2]},下载链接:{linlk[3]}')

    def btn_clear(self):
        self.ui.lineEdit.clear()
        self.ui.listWidget.clear()
        self.page1 = 1

    def downloads_music(self,data):  # 这里第二个参数就把双击对象的文本内容传过来了
        # print(data.text())
        data = data.text()
        author = re.findall(fr'歌名:(.*?),',data)[0]
        song = re.findall(fr'歌手:(.*?),',data)[0]
        id = re.findall(fr'id=(.*?),',data)[0]
        download_urls = re.findall('下载链接:(.*)',data)[0]
        # print(author)
        # print(song)
        # print(id)
        # print(download_urls)
        # QMessageBox.information(self, '下载提示!', f'是否下载{song}-{author}?', QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)  # 这里是下载前的提示,我觉得没用,就隐藏了
        code = requests.get(download_urls)
        url_text = code.text
        if 'ID3'in url_text:  # 因为mp3文件的开头都是ID3
            music = requests.get(download_urls).content
            if not os.path.exists('下载mp3'):
                os.mkdir('下载mp3')
            # print(f'下载mp3/{song}-{author}-{id}.mp3')
            with open(fr'下载mp3/{song}-{author}-{id}.mp3', 'wb') as f:
                f.write(music)
                QMessageBox.warning(self, '下载提示!', '下载成功')
        else:
            QMessageBox.warning(self,'下载提示!',f'下载失败!下载地址是:{download_urls}')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
  • 爬虫代码
import pprint
import re
import requests

def get_url(input,pages=1):
    url = 'https://music.txqq.pro/'
    data = {
            'input': input,
            'filter': 'name',
            'type': 'netease',
            'page': pages
    }
    header = {'x-requested-with':'XMLHttpRequest'}
    rt = requests.post(url=url,headers=header,data=data)
    rt.encoding = rt.apparent_encoding
    links = rt.json()
    # print(links)
    re_code = links['code']
    print(re_code)
    mp3_links = links['data']
    track_links = []
    for link0 in mp3_links:
        downloed_url = link0['url']
        title = link0['title']
        author = link0['author']
        id = re.findall('id=(.*?).mp3',downloed_url)[0]
        # print(title,author,id,downloed_url)
        track_links.append([title,author,id,downloed_url])
    return track_links
  • 界面py
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '音乐下载器.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(Form)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.listView = QtWidgets.QListView(Form)
        self.listView.setObjectName("listView")
        self.verticalLayout.addWidget(self.listView)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem)
        self.pushButton = QtWidgets.QPushButton(Form)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_2.addWidget(self.pushButton)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem1)
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_2.addWidget(self.pushButton_2)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem2)
        self.pushButton_3 = QtWidgets.QPushButton(Form)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout_2.addWidget(self.pushButton_3)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem3)
        self.verticalLayout.addLayout(self.horizontalLayout_2)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "音乐下载器"))
        self.label.setText(_translate("Form", "音乐名称:"))
        self.pushButton.setText(_translate("Form", "搜索"))
        self.pushButton_2.setText(_translate("Form", "更多"))
        self.pushButton_3.setText(_translate("Form", "清空"))

设计音乐下载器界面

首先要整一个标签,提示用户要输入的信息

然后再整一个输入框,让用户输入信息,我们获取用户输入的信息

然后就是一个list view这个文本框显示我们根据用户输入的信息得到的内容

接着就是三个按钮:搜索,下一页,清空

这是比较基本的需求,具体的细节可以自己脑补

爬虫代码

设计思路:

  • 设计函数:给一个歌名,返回一个含歌曲详细信息的列表
  • 找网站

首先是找个音乐网站,这个网站不要太牛逼,不然光反爬就够你喝一壶了

最好是找个小网站,也不要太卡,功能不用太复杂,支持搜索音乐,下载音乐就行

请添加图片描述

像图片这种格局的网站就好了

这里使用F12查看咱们下载的音乐在哪里,一般都是在数据包里面,也就是异步获取,需要使用post请求

这里的url和data不要弄错,最重要的是请求头headers

因为服务器会从请求头来判断给你返回什么内容,如果没有请求头,就返回源代码,而音乐的下载链接等详细信息都在数据包里面,我们就得不到想要的结果

所以,先去原网站,打开开发者工具栏,找下载链接,先找源代码(一般源代码都没有

然后刷新网页,查看数据包,你会找到一个只有data的数据包,里面就是一系列的音乐下载链接

可能会遇到的问题

  • 你一点击F12网页自动关闭
    • 解决方法:换一个网站
  • 网站上能找到数据包,但是pycharm中无论如何都得不到数据包,只有源代码
    • 解决方法:把网站的数据包的所有请求头全部复制,制成字典,得到数据包之后,再一个个删除键值对
  • 数据包里面不是mp3结尾的下载链接
    • 解决方法:换网站,这个可能是api,反正我不会
  • 没有找到数据包
    • 解决方法:换网站,可能是反爬,问题比较复杂

具体问题具体分析,有其他问题评论区见

处理数据包

也就是拿到网站返回的数据包后,对数据包进行拆解

这个数据包一般是json格式,所以用json进行解析,不要用text了

import pprint
import re
import requests

def get_url(input,pages=1):
    url = 'https://music.txqq.pro/'
    data = {
            'input': input,
            'filter': 'name',
            'type': 'netease',
            'page': pages
    }
    header = {'x-requested-with':'XMLHttpRequest'}
    rt = requests.post(url=url,headers=header,data=data)
    rt.encoding = rt.apparent_encoding
    links = rt.json()
    # print(links)
    re_code = links['code']
    print(re_code)
    mp3_links = links['data']
    track_links = []
    for link0 in mp3_links:
        downloed_url = link0['url']
        title = link0['title']
        author = link0['author']
        id = re.findall('id=(.*?).mp3',downloed_url)[0]
        # print(title,author,id,downloed_url)
        track_links.append([title,author,id,downloed_url])
    return track_links

这个数据包一般返回一个字典,第一个数据是code也就是状态码,咱们一般用不到,当然为了使代码更加健壮,可以获取一下这个状态码

第二个数据就是各种歌曲的信息了,包括歌曲的下载链接,歌名,歌手,作词,作曲等等,很明显也是一个列表,所以我使用了for循环,依次拿数据来解析

列表里面的每一项都是字典,所以我用取值的方式得到了对应的信息,也就是23~25行

因为数据包里面有一套歌曲信息,一个个返回比较麻烦,就以列表的形式进行返回了

绑定爬虫

在上一步,我们拿到了歌曲数据包,也就是返回值的列表

函数的使命完成了

现在就是设计槽函数和按钮连接了

第一个槽函数–btn_search

def btn_search(self):
    # print('点击搜索')
    self.page1 = 1
    pr_input = self.ui.lineEdit.text()
    linlks = get_url(pr_input,1)
    for linlk in linlks:

        self.ui.listWidget.addItem(f'歌名:{linlk[0]},歌手:{linlk[1]},id={linlk[2]},下载链接:{linlk[3]}')
        # print(f'歌名:{linlk[0]},歌手:{linlk[1]}id={linlk[2]}')

这个槽函数对应的就是搜索按钮,我们想要搜索,就要知道用户想要搜索什么,所以使用lineEdit.text()得到输入框的内容

然后就是把得到的歌名给爬虫函数

然后把得到的信息放在listWidget里面,使用addItem一行行的把内容填充进去

这里一般为了整洁会把下载链接隐藏,那样就会导致一个问题,下面你想要下载的时候,还要去找这个链接,老师的方法是把所有的链接和其他信息储存起来,放在一个全局列表里面,在以后想要下载的时候再去找

我感觉很麻烦,确实是干净了,但是代码的复杂程度就上去了,还浪费了一定的内存空间,去列表找链接也浪费时间

所以我把链接也一同放在listWidget里面了

第二个槽函数–btn_more

def btn_more(self):
    pr_input = self.ui.lineEdit.text()
    self.page1 += 1

    linlks = get_url(pr_input, self.page1)
    for linlk in linlks:
        self.ui.listWidget.addItem(f'歌名:{linlk[0]},歌手:{linlk[1]},id={linlk[2]},下载链接:{linlk[3]}')

这个槽函数对应的是“更多”按钮,也就是我们想要在同一歌名下得到更多的信息

因为数据包也有次序,在网站上直接搜索歌曲得到的是页数为1的数据包,再点击下一页又会刷新新的数据包,得到页数为2的数据包等等

所以涉及一个页数的信息,在init初始化里面定义一个变量page1,这个变量是专门来定位数据包的

第三个槽函数–btn_clear

def btn_clear(self):
    self.ui.lineEdit.clear()
    self.ui.listWidget.clear()
    self.page1 = 1

这个槽函数是最简单的,负责清理面板,也就是点击‘’清理‘’的时候把lineEdit输入框和listWidget展示框清空,有自带的clear函数

第四个槽函数–downloads_music

def downloads_music(self,data):  # 这里第二个参数就把双击对象的文本内容传过来了
    # print(data.text())
    data = data.text()
    author = re.findall(fr'歌名:(.*?),',data)[0]
    song = re.findall(fr'歌手:(.*?),',data)[0]
    id = re.findall(fr'id=(.*?),',data)[0]
    download_urls = re.findall('下载链接:(.*)',data)[0]
    # print(author)
    # print(song)
    # print(id)
    # print(download_urls)
    # QMessageBox.information(self, '下载提示!', f'是否下载{song}-{author}?', QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)  # 这里是下载前的提示,我觉得没用,就隐藏了
    code = requests.get(download_urls)
    url_text = code.text
    if 'ID3'in url_text:  # 因为mp3文件的开头都是ID3
        music = requests.get(download_urls).content
        if not os.path.exists('下载mp3'):
            os.mkdir('下载mp3')
        # print(f'下载mp3/{song}-{author}-{id}.mp3')
        with open(fr'下载mp3/{song}-{author}-{id}.mp3', 'wb') as f:
            f.write(music)
            QMessageBox.warning(self, '下载提示!', '下载成功')
    else:
        QMessageBox.warning(self,'下载提示!',f'下载失败!下载地址是:{download_urls}')

这个槽函数负责处理咱们想要下载的歌曲,也就是在展示框里面看到想要下载的歌曲,双击一下,直接下载

这里需要一个参数,也就是想要下载的歌曲信息,也就是列表的那一行信息,我们只需要在参数里面加个data就可以得到双击的那一行信息

因为前面我把下载的链接写在了信息里面,所以可以直接下载链接,这里我拿了一下歌曲的名字和歌手来创建mp3文件,因为涉及一个重名的问题,我发现重名歌曲的id不同,所以我还取了一下id来作为文件名,经过这个组合就避免的重名的问题

遇到的问题

歌曲的下载链接无效,因为涉及版权等等问题,很多下载链接都是不能使用的,但是这些链接都能正常访问

也就是说,失效的地址和正常的地址都能正常访问

失效的地址打开是一个网站,正常的地址打开就是mp3文件

这里还要再次判断一下链接是否失效,发现mp3文件的开头是’’ID3‘‘,而失效的地址一般没有

所以使用if判断‘’ID3“是否在网页源代码里面

为了让下载的歌曲比较集中,我把所有的歌曲放在了文件夹里面,名称就是下载mp3

打包exe

最后就是把写好的py程序打包,毕竟费那么大精力,不就是让不会python的人直接使用吗

要是仅仅下载歌曲,不搞界面程序,一个爬虫代码就结束了

这里使用pycharm里面的工具,鼠标右键“打开于(open in)”----找到‘’终端‘’

使用pyinstaller

输入指令-F -i 图标.ico 主函数main.py --noconsole(意思是不要终端那个黑窗口)

这里就是之前的文章写的打包命令,在爬虫基础1里面的末尾

-F 生成exe文件

-i 设置图标

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux(inode + 软硬链接 图片+大白话)

后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

从0开始深度学习(24)——填充和步幅

1 填充 在上一节中,我们的卷积步骤如下: 可以发现输入是 3 3 3\times3 33,输出是 2 2 2\times2 22,这样可能会导致原始图像的边界丢失了许多有用信息,如果应用多层卷积核,累积丢失的像素就更多了&#…

C++:模拟实现STL的vector

目录 一.vector类 1.vector类的构造及析构 2.定义迭代器 3.size()和capacity() 4.operator [ ] 5.resize()和reserve() 6.插入和删除 二.整体代码 1.vector.h 2.vector.cpp 上一节中了解了vector中部分接口的使用,在这里我们模拟实现vector,为了避免与库中的起冲突,…

砥砺十年风雨路,向新而行创新程丨怿星科技十周年庆典回顾

10月24日,是一年中的第256天,也是程序员节,同时也是怿星的生日。2014年到2024年,年华似水匆匆一瞥,多少岁月轻描淡写,怿星人欢聚一堂,共同为怿星科技的十周年庆生! 01.回忆往昔&…

Chrome与火狐哪个浏览器的移动版本更流畅

在当今的数字化时代,移动设备已经成为我们生活中不可或缺的一部分。而浏览器作为我们访问互联网的重要工具,其性能和用户体验直接影响到我们的使用感受。本文将对比Chrome和火狐(Firefox)两款主流浏览器的移动版本,探讨…

算法练习:1004. 最大连续1的个数 III

题目链接:1004. 最大连续1的个数 III。 题目要求,给定一个数组,这个数组里面只有0或1,然后计算有多少个连续的1的最大长度,同时给了一个条件就是,可以把k个0变成1,然后来计算长度。 暴力解法&a…

【大数据技术基础 | 实验七】HBase实验:部署HBase

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)验证Hadoop和ZooKeeper已启动(二)修改HBase配置文件(三)启动并验证HBase 六、实验结果七、实验心得 一、实验目的 掌握…

LLMs之LoLCATs:《LoLCATs: On Low-Rank Linearizing of Large Language Models》翻译与解读

LLMs之LoLCATs:《LoLCATs: On Low-Rank Linearizing of Large Language Models》翻译与解读 导读:这篇论文的核心是提出了一种名为 LoLCATs (Low-rank Linear Conversion via Attention Transfer) 的方法,用于高效地将大型语言模型 (LLM) 线性…

linux命令详解,文件管理类

文件管理 stat 显示文件的详细信息,包括时间戳 stat filenametouch 主要用于更新文件的访问时间和修改时间(时间戳)。如果指定的文件不存在,touch 命令会创建一个新的空文件。 touch newfile参数 -t 更新文件的修改时间为特…

MySQL的其他函数

数学函数: 1.round 四舍五入 select round(1.45);//不管正负数,先将绝对值round,然后加正负号 select round(1.567,2); //表示小数点保留2位 2.ceil 向上取整 select ceil(-1.3); 3.floor 向下取整 4.truncate 截断 select truncate(1.65,1); // 结果保留小数…

@Excel若依导出异常/解决BusinessBaseEntity里面的字段不支持导出

今天发现所有实体类继承BusinessBaseEntity里面的这些通用字段不支持导出,debug时发现是这样: 导出效果 这里我把能查到的方法都汇总了,如果你也遇到这个异常,可以去逐步排查 1.先看库里有没有数据 2.看字段名是否对齐 3.所需要…

云数据中心基础环境-详细设计方案(364页WORD)

文档介绍: 随着云计算技术的飞速发展,云数据中心已成为企业数字化转型的核心基础设施,承载着数据存储、处理、分析和应用的重任。本设计方案旨在构建一个高性能、高可用、高安全性的云数据中心基础环境,以满足企业日益增长的业务需…

在 CSS 中,gap 是 布局容器(flex 或 grid)的属性。它用于设置容器内子元素之间的间距。

在 CSS 中,gap 是 布局容器(flex 或 grid)的属性。它用于设置容器内子元素之间的间距。以下是 gap 属性在不同布局中的应用: 1. 在 CSS Grid 布局中 gap 定义了网格行和列之间的间距。可以分别使用 row-gap 和 column-gap 设置行…

Python练习9

Python日常练习 题目: 编程序计算形式如:sumaaaaaaaaaa…aaa…aaa的表达式的值。 说明: 补充完整函数fun(),其中a为小于10的自然数,n为项数,给定 变量result作为函数返回值,变量ts作为…

浙江深大智能科技有限公司管控平台服务端存在任意文件上传漏洞

漏洞描述 智游宝是连接景区与分销商(OTA、旅行社)的公正、权威、可信的第三方服务平台。作为国内智慧景区第三方技术服务支撑平台,智游宝为景区提供了可控制分销商的管理环境,安全、便捷、高效地实现了电子票的生产、发送、检票、退换票以及票款回收等技…

Pr 视频过渡:沉浸式视频 - VR 默比乌斯缩放

效果面板/视频过渡/沉浸式视频/VR 默比乌斯缩放 Video Transitions/Immersive Video/VR Mobius Zoom VR 默比乌斯缩放 VR Mobius Zoom用于 VR 视频中的缩放式场景切换,通过缩小或放大的渐变效果在两个场景之间平滑过渡。 自动 VR 属性 Auto VR Properties 默认勾选…

Hive操作库、操作表及数据仓库的简单介绍

数据仓库和数据库 数据库和数仓区别 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别 操作型处理(数据库),叫联机事务处理OLTP(On-Line Transaction Processing),也可以称面向用户交易的处理系统,它是针对具体业务…

ssm063基于SSM框架的德云社票务系统的设计与实现+vue(论文+源码)_kaic

毕业设计(论文) 题 目: 基于SSM框架的德云社票务系统 专 题: 学 院: 班 级: …

基于vue框架的的民宿网站30lx7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,客房类型,民宿信息,民宿预订,民宿退订,续租信息,换房信息 开题报告内容 开题报告 题目:基于Vue框架的民宿网站开发 一、立论依据 选题背景与意义 随着旅游业的快速发展,民宿作为一种独特的住宿方式&…

Kubernetes的基本构建块和最小可调度单元pod-0

文章目录 一,什么是pod1.1pod在k8s中使用方法(1)使用方法一(2)使用方法二 1.2pod中容器的进程1.3pod的网络隔离管理(1)pause容器的作用 1.4 Pod分类:(1)自主式…