【我的创作纪念日】关于某站的音频爬虫+GUI

文章目录

    • 一、前言&机遇
    • 二、爬虫代码
    • 三、爬虫GUI
    • 四、文件打包
    • 五、结果展示
    • 未来可期

一、前言&机遇

许久没看私信内容,一上线就看到了官方的私信,我已经来到CSDN1024天啦!

想到注册这个号的初衷是学习记录爬虫,后面渐渐变成了各种学习笔记。

勿忘初心,今天补写一篇爬虫文章,纪念一下(嘿嘿)

GitHub项目地址:https://github.com/Polaris119/Audio-crawler


二、爬虫代码

由于一些原因,关于某站的爬虫,基础不能细🔒。大家看代码吧。

import requests
import re  
import json
import os


"""
根据bv号和自定义文件名得到filename、url、headers
    bv:视频bv号
    name:自己给待下载文件取的名字
"""


def bv_name(bv, name):
    if not os.path.exists("D:/video"):
        os.mkdir("D:/video")

    fileName = f"D:/video/{name}"
    URL = f'https://www.bilibili.com/video/{bv}'

    headers = {
        'referer': f'https://www.bilibili.com/video/{bv}?spm_id_from=333.337.search-card.all.click',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
    }

    return fileName, URL, headers


"""
获取网页源代码
    url:网页链接
    headers:请求头
"""


def send_request(url, headers):
    response = requests.get(url=url, headers=headers)
    return response


"""
解析视频数据
html_data:页面源代码,相当于上个函数response.text
"""


def get_video_data(html_data):
    # 提取视频对应的json数据
    # <script>window\.__playinfo__=(.*?)</script>是在网络上找的,随便百度都找的到
    json_data = re.findall('<script>window\.__playinfo__=(.*?)</script>', html_data)[0]
    json_data = json.loads(json_data)
    
    # 提取音频的url地址
    audio_url = json_data['data']['dash']['audio'][0]['backupUrl'][0]
    return audio_url


"""
下载音频
file_name:待下载文件地址
audio_url:音频文件在网页中的地址
headers:请求头
"""


def save_data(file_name, audio_url, headers):
    # 请求数据
    audio_data = send_request(audio_url, headers).content
    with open(file_name + '.mp3', mode='wb') as f:
        f.write(audio_data)
    # print("音频下载完毕!!!")
    
    
"""
测试使用,可以注释掉。GUI界面会调用之前的函数
"""
# if __name__ == '__main__':
#     filename, URL, headers = bv_name('BV1t14y1F7kd', '英文歌')
#     res = send_request(URL, headers).text
#     video = get_video_data(res)
#     print(video)

三、爬虫GUI

可视化才够爽!!!

在这里插入图片描述

  • GUI代码如下:
from PyQt5.Qt import *
from audio_spider import *
import sys
import time


class WorkerThread(QThread):
    # 自定义信号,传递两个字符串参数
    finish = pyqtSignal(str, str)

    def __init__(self, parent=None):
        super(WorkerThread, self).__init__(parent)
        self.text1 = None
        self.text2 = None

    def run(self):
        # 调用audio_spider.py的函数
        filename, url, headers = bv_name(self.text1, self.text2)
        res = send_request(url, headers).text
        video = get_video_data(res)  # 音频地址
        start_time = time.time()  # 下载开始时间
        save_data(filename, video, headers)
        end_time = time.time()  # 下载结束时间

        value1 = video  # 音频地址
        value2 = "下载完成咯!!!用时" + str(round(end_time - start_time, 2)) + '秒'  # 下载用时,保留两位小数
        self.finish.emit(value1, value2)  # 发射信号,传递结果给主线程


class mainwindow(QWidget):

    def __init__(self):
        super(mainwindow, self).__init__()
        self.windowUI()
        self.setWindowTitle("B站音频提取")
        self.resize(1000, 1000)

    def windowUI(self):
        palette = QPalette()
        pix = QPixmap("./file/background.jpg")

        pix = pix.scaled(self.width(), self.height())

        palette.setBrush(QPalette.Background, QBrush(pix))
        self.setPalette(palette)

        label_1 = QLabel(self)
        label_1.move(400, 70)
        label_1.setText("B站音频提取")
        label_1.setFont(QFont('SimHei', 20))

        label_2 = QLabel(self)
        label_2.move(500, 900)
        label_2.setText("数据来源:Bilibili")

        label_3 = QLabel(self)
        label_3.move(800, 900)
        label_3.setText("作者:Polaris")
        # label_3.setFont(QFont('Arial', 0))

        label_4 = QLabel(self)
        label_4.move(200, 200)
        label_4.setText("输入BV号")
        label_4.setFont(QFont('SimSun', 20, 75))

        label_5 = QLabel(self)
        label_5.move(200, 300)
        label_5.setText("输入文件名")
        label_5.setFont(QFont('SimSun', 20, 75))

        label_6 = QLabel(self)
        label_6.move(200, 480)
        label_6.setText("音频地址")
        label_6.setFont(QFont('SimSun', 20, 75))

        label_7 = QLabel(self)
        label_7.move(200, 680)
        label_7.setText("下载用时")
        label_7.setFont(QFont('SimSun', 20, 75))

        self.line_1 = QLineEdit(self)  # BV号
        self.line_1.resize(200, 40)
        self.line_1.move(430, 200)

        self.line_2 = QLineEdit(self)  # 文件名
        self.line_2.resize(200, 40)
        self.line_2.move(430, 300)

        self.text_1 = QTextEdit(self)  # 音频地址
        self.text_1.move(430, 400)

        self.text_2 = QTextEdit(self)  # 下载进度
        self.text_2.move(430, 600)

        self.btn = QPushButton('立即下载', self)
        self.btn.setFont(QFont('SimSun', 10, 75))
        self.btn.resize(150, 80)
        self.btn.move(750, 235)

        # 在 mainwindow 类的构造函数中创建了一个 WorkerThread 对象(在主线程中创建一个子线程对象)
        self.worker_thread = WorkerThread()
        # 绑定按钮事件
        self.btn.clicked.connect(self.start_thread)
        # 将子线程的 finish 信号连接到主线程的 value_change 槽函数上
        self.worker_thread.finish.connect(self.value_change)

    def start_thread(self):
        # 获取文本框内容
        self.worker_thread.text1 = self.line_1.text()
        self.worker_thread.text2 = self.line_2.text()
        # 我们使用 moveToThread 方法将 worker_thread 移动到一个新的线程中(即子线程中)
        # 将主线程中text1、text2的值传递到子线程中
        self.worker_thread.moveToThread(self.worker_thread)
        # 启动子线程
        self.worker_thread.start()

    def value_change(self, value1, value2):
        # 在槽函数中获取子线程传递的结果,并进行处理
        self.text_1.setText(value1)
        self.text_2.setPlainText(value2)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    a = mainwindow()
    a.show()
    sys.exit(app.exec_())

四、文件打包

给不懂代码的小伙伴用一用,说不定就骗到一个入坑的(doge

可以参考我的这篇文章:pyinstaller多文件打包exe

五、结果展示

两小时的音频只需3秒哦!!!!
在这里插入图片描述

未来可期

文章到这里就要结束了,但故事还没有结局

如果本文对你有帮助,记得点个赞👍哟,也是对作者最大的鼓励🙇‍♂️。

如有不足之处可以在评论区👇多多指正,我会在看到的第一时间进行修正

作者:爱打瞌睡的CV君
CSDN:https://blog.csdn.net/qq_44921056
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。

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

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

相关文章

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 3 日论文合集)

文章目录 一、检测相关(9篇)1.1 Federated Ensemble YOLOv5 - A Better Generalized Object Detection Algorithm1.2 Zero-shot Nuclei Detection via Visual-Language Pre-trained Models1.3 Federated Object Detection for Quality Inspection in Shared Production1.4 Comp…

【数据科学和可视化】反思十年数据科学和可视化工具的未来

数据科学在过去十年中呈爆炸式增长&#xff0c;改变了我们开展业务的方式&#xff0c;并让下一代年轻人为未来的工作做好准备。但是这种快速增长伴随着对数据科学工作的不断发展的理解&#xff0c;这导致我们在如何使用数据科学从我们的大量数据中获得可操作的见解方面存在很多…

Django的数据库配置、生成(创建)过程、写入数据、查看数据的学习过程记录

目录 01-配置数据库信息02-安装Python的MySQL数据库驱动程序 mysqlclient03-安装Mysql&#xff0c;并启动Mysql04-定义Django的数据库模型(定义数据表-编写models.py文件)05-按照数据的配置生成数据库(执行迁移命令)05-01-生成迁移执行文件05-02-执行数据库模型迁移 06-查看数据…

git bash 命令行反应慢、卡顿

1. 在Windows11的电脑上安装了git 后&#xff0c;鼠标右键打开git bash here&#xff0c;打开窗口缓慢&#xff0c;输入命令也慢的要死&#xff0c;如果安装git的时候选择在桌面创建图标&#xff0c;通过桌面图标打开也是一样的 2. 最简单的ls 命令&#xff0c;都要停顿半秒 3.…

m4a音频格式转换器:让音频轻松换装

大家有没有遇到这样的情况——你下载了一个很酷的音频文件&#xff0c;但是播放设备却说“不认识”这个格式&#xff1f;别担心&#xff01;现在有个超级厉害的工具可以帮你解决这个问题&#xff0c;它就是m4a音频格式转换器&#xff01;它能让你的音频文件变身&#xff0c;适应…

TiDB(2):TiDB架构特性

1 TiDB 整体架构 TiDB 集群主要包括三个核心组件&#xff1a;TiDB Server&#xff0c;PD Server 和 TiKV Server。此外&#xff0c;还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator 组件。 架构图解 1.1 TiDB Server TiDB Server 负责接收…

技术服务企业缺成本票,所得税高怎么解决?可有良策?

技术服务企业缺成本票&#xff0c;所得税高怎么解决&#xff1f;可有良策&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 技术服务型企业最核心的价值就是为客户提供技术支撑&#xff0c;而这类型的企业在税务方面面临的…

CSRF漏洞复现

目录 CSRF产生的条件CSRF漏洞分类CSRF漏洞危害CSRF漏洞检测CSRF漏洞修复方案利用靶场CSRF-Minefield-V1.0漏洞复现 CSRF产生的条件 一、被攻击者在登陆了web网页&#xff0c;并且在本地生成了cookie 二、在cookie未过期的情况下&#xff0c;利用同一个浏览器访问了攻击者的页…

最新版Flink CDC MySQL同步Elasticsearch(一)

1.环境准备 首先我们要基于Flink CDC MySQL同步MySQL的环境基础上&#xff08;flink-1.17.1、Java8、MySQL8&#xff09;搭建Elasticsearch7-17-10和Kibana 7.17.10。笔者已经搭建好环境&#xff0c;这里不做具体演示了&#xff0c;如果需要Es的搭建教程情况笔者其他博客 注意…

JVM源码剖析之Java对象创建过程

关于 "Java的对象创建" 这个话题分布在各种论坛、各种帖子&#xff0c;文章的水平参差不齐。并且大部分仅仅是总结 "面试宝典" 的流程&#xff0c;小部分就是copy其他帖子&#xff0c;极少能看到拿源码作为论证。所以特意写下这篇文章。 版本信息如下&…

Eclipse显示层级目录结构(像IDEA一样)

有的小伙伴使用IDEA习惯了&#xff0c;可能进入公司里面要求使用eclipse&#xff0c;但是eclipse默认目录是并列显示&#xff0c;而不是层级显示。部分人用起来感觉十分不方便。我们可以更改一下设置。 1、打开eclipse&#xff0c;找到这里 2、选择PackagePresentation 3、选…

Github-提交PR指南

1. Fork你将要提交PR的repo 2. 将你fork下来的repo克隆到你的本地 git clone your_repo.git Cloning into ultralytics... remote: Enumerating objects: 8834, done. remote: Counting objects: 100% (177/177), done. remote: Compressing objects: 100% (112/112), done. …

第二步:STM32F407ZGT6资源介绍

1.1 STM32F407ZGT6资源描述 内核&#xff1a; 32位 高性能ARM Cortex-M4处理器 时钟&#xff1a;高达168M,实际还可以超屏一点点 支持FPU&#xff08;浮点运算&#xff09;和DSP指令 IO口&#xff1a; STM32F407ZGT6: 144引脚 114个IO 大部分IO口都耐5V(模拟通道除外) …

C# .NET 如何调用 SAP RFC 接口

1.分析传参结构 SAP 传参格式对应 .NET 参数格式 SAP 参数.NET 参数参数类型import(导入)——关联类型为数据元素Param单个变量参数import(导出)——关联类型为结构体Struct结构体tableTable表 下面是 SAP 对应参数类型&#xff1a; 2.web.config 配置 配置文件需要客户端…

win10安装pytorch GPU

我记得以前安装过深度学习库GPU版本&#xff0c; 需要安装cuda什么的&#xff0c;翻了下还真写过一篇win10安装tensorflow的文章&#xff0c;但是流程不止不详细&#xff0c;还不清晰。这次就再记录一遍 这次安装的是pytorch&#xff0c;这么多年似乎pytorch要逐渐统一深度学习…

【算法与数据结构】232、LeetCode用栈实现队列

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题要求我们用栈模拟队列&#xff08;工作上一定没人这么搞&#xff09;。程序当中&#xff0c;pus…

spring之BeanFactory

spring之BeanFactory DefaultListableBeanFactory示例代码类继承实现结构 BeanFactory是Bean工厂&#xff0c;所以很明显&#xff0c;BeanFactory会负责创建Bean&#xff0c;并且提供获取Bean的API。 DefaultListableBeanFactory 在Spring源码中&#xff0c;BeanFactory接口存…

自定义的车牌号键盘组件

<template><view class"keyboard-wrap" v-if"kbShow"><view class"head"><view class"done" tap"done"><text class"iconfont iconxiala-"></text>关闭</view></vi…

spring boot + Apache tika 实现文档内容解析

Apache tika是Apache开源的一个文档解析工具。Apache Tika可以解析和提取一千多种不同的文件类型(如PPT、XLS和PDF)的内容和格式&#xff0c;并且Apache Tika提供了多种使用方式&#xff0c;既可以使用图形化操作页面&#xff08;tika-app&#xff09;&#xff0c;又可以独立部…

Python实现微信发送文件实例

新建Python文件&#xff1a;wx_file.py&#xff0c;代码如下 # -*- coding: utf-8 -*- # Author : CxiuM # Time : 2023-07-06 10:12 # Name : wx_operation.py"""微信群发消息"""import os import time import subprocessimport requests …