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

文章目录

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

一、前言&机遇

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

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

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

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


二、爬虫代码

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

import requests
import re  
import json
import os"""
根据bv号和自定义文件名得到filename、url、headersbv:视频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).contentwith 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 timeclass WorkerThread(QThread):# 自定义信号,传递两个字符串参数finish = pyqtSignal(str, str)def __init__(self, parent=None):super(WorkerThread, self).__init__(parent)self.text1 = Noneself.text2 = Nonedef run(self):# 调用audio_spider.py的函数filename, url, headers = bv_name(self.text1, self.text2)res = send_request(url, headers).textvideo = 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
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LSTM介绍

LSTM ft表示 遗忘门。LSTM对于每一次的输入,首先决定遗忘掉之前的哪些记忆。将ft和t-1时刻的细胞状态相乘,得出将遗忘哪些记忆。 记忆门 是用来控制是否将t时刻的数据并入细胞状态。tanh函数可以将此刻向量中的有效信息提取出来,为gt。sigmoid函数用于控制此刻多少记忆进入…

比ping还好用的排障命令

遇到网络故障的时候&#xff0c;你一般会最先使用哪条命令进行排障&#xff1f; 除了Ping&#xff0c;还有Traceroute、Show、Telnet又或是Clear、Debug等等。 今天安排的&#xff0c;是Traceroute排障命令详解&#xff0c;给你分享2个经典排障案例哈。 01 Traceroute原理和功…

Hive 复习重点

文章目录 特点SQL查询转换成MR作业的过程内部表 & 外部表 & 分区表 & 分桶表内部表外部表分区表 分桶表DQL语法性能优化SQL语句优化数据格式化 ORC, Parquet列式存储小文件过多优化并行执行优化JVM 优化推测执行行列过滤limit 限制本地模式(开启MR&#xff0c;单机…

简单分享下怎么创建一个微信小程序

怎么创建一个微信小程序?三招教你这样做!!微信小程序不会做没关系,看我这篇文章就够啦!!实现0基础到大神的瞬间飞跃不是梦!! 戳下方链接即可直达官网&#xff0c;上千种行业精美模板任君挑选&#xff0c;快一起来试试吧&#xff01;让小程序制作不再困难&#xff01;上千个行业…

win系统删除oracle数据文件恢复---惜分飞

有客户联系我们,说win平台下的数据库,在由于空间紧张,在关闭数据库的情况下删除的两个数据文件,导致数据库无法正常访问很多业务表,需要对其进行恢复,查看alert日志发现大概操作,删除文件之后,启动数据库失败 Completed: alter database mount exclusive alter database open E…

库表实验操作

目录 1、创建数据库Market&#xff0c;在 Market中创建数据表customers。​编辑 2、在Market中创建数据表orders。 3、创建数据库Team&#xff0c;定义数据表player。 1、创建数据库Market&#xff0c;在 Market中创建数据表customers。 &#xff08;1&#xff09;mysql>…

【在线文件管理】响应式文件管理AngularJS

目录 1.功能展示截图 2.实现代码 2.1HTML页面代码 2.2后台代码 2.2.1项目结构 2.2.2项目代码 其他问题 1.功能展示截图 项目中需要用到文件管理来自由控制文件的上传、下载、删除等&#xff0c;就想到做一个简单的在线文件管理功能。 支持在线编辑&#xff1a; 2.实现代…

Vue组件库Element-常见组件-Form表单

Form表单 Form 表单&#xff1a;由输入框、选择器、单选框、多选框等控件组成&#xff0c;用以收集、检验、提交数据 具体关键代码如下&#xff1a; <template><div><el-row><!-- button 按钮 --><el-button>默认按钮</el-button><e…

基于JavaSpringBoot+Vue+uniapp微信小程序实现鲜花商城购物系统

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Array.from详解

德玛玩前端 2023-07-07 在以往的开发中&#xff0c;对于Array.from的了解是from是Array的静态方法&#xff0c;可以将类数组和迭代对象转换为数组&#xff0c;可以结合Set集合快速实现数组的去重&#xff0c;一直以为Array,from()只有一个参数&#xff0c;不是传类数组就是可迭…

JavaWeb 速通HTML

目录 一、拾枝杂谈 1.网页组成 : 1 结构 2 表现 3 行为 2.HTML入门 : 1 基本介绍 2.基本结构 : 3.HTML标签 : 1 基本说明 2 注意事项 二、常用标签汇总及演示 1.font标签 : 1 定义 2 演示 2.字符实体 : 1 定义 2 演示 3.标题标签 : 1 定义 2 演示 4. 超链接标签 : 1…

Sql Injection — 注入攻击原理-2(实战)

还是实战&#xff0c;如果没什么事的话几乎每天日更 目录 前言一、总结 前言 sql实战-2 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、 公司的新闻网 我们进入一篇文章&#xff0c;我们发现这个网页应该是ASP动态网页文件 还记得第一篇文章的sq…