实际效果如下图所示:

源代码有四个文件,分别是kugou.uikugou_ui.pymy_spider.pymain.py

kugou.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>widget</class><widget class="QWidget" name="widget"><property name="geometry"><rect><x>0</x><y>0</y><width>500</width><height>400</height></rect></property><property name="minimumSize"><size><width>500</width><height>400</height></size></property><property name="maximumSize"><size><width>500</width><height>400</height></size></property><property name="windowTitle"><string>mp3下载器</string></property><layout class="QVBoxLayout" name="verticalLayout" stretch="1,6,1,1"><property name="spacing"><number>0</number></property><item><widget class="QFrame" name="frame"><property name="frameShape"><enum>QFrame::StyledPanel</enum></property><property name="frameShadow"><enum>QFrame::Raised</enum></property><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QLineEdit" name="lineEdit_search"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="maximumSize"><size><width>16777215</width><height>25</height></size></property><property name="font"><font><pointsize>10</pointsize></font></property><property name="placeholderText"><string>搜索单曲、歌手</string></property><property name="clearButtonEnabled"><bool>true</bool></property></widget></item><item><widget class="QPushButton" name="pushButton_search"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">QPushButton {background-color: rgb(203, 203, 203);
}
QPushButton:hover {background-color: rgb(152, 152, 152);
}
QPushButton:pressed {background-color: rgb(118, 118, 118);
}</string></property><property name="text"><string>搜索</string></property></widget></item><item><widget class="QPushButton" name="pushButton_clear"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">QPushButton {background-color: rgb(203, 203, 203);
}
QPushButton:hover {background-color: rgb(152, 152, 152);
}
QPushButton:pressed {background-color: rgb(118, 118, 118);
}</string></property><property name="text"><string>清空</string></property></widget></item></layout></widget></item><item><widget class="QFrame" name="frame_3"><property name="frameShape"><enum>QFrame::StyledPanel</enum></property><property name="frameShadow"><enum>QFrame::Raised</enum></property><layout class="QHBoxLayout" name="horizontalLayout_2"><property name="spacing"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property><item><widget class="QListWidget" name="listWidget"/></item></layout></widget></item><item><widget class="QFrame" name="frame_2"><property name="frameShape"><enum>QFrame::StyledPanel</enum></property><property name="frameShadow"><enum>QFrame::Raised</enum></property><layout class="QHBoxLayout" name="horizontalLayout_4"><property name="spacing"><number>0</number></property><property name="topMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property><item><widget class="QLineEdit" name="lineEdit_info"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="maximumSize"><size><width>16777215</width><height>25</height></size></property><property name="font"><font><pointsize>10</pointsize></font></property></widget></item></layout></widget></item><item><widget class="QFrame" name="frame_4"><property name="frameShape"><enum>QFrame::StyledPanel</enum></property><property name="frameShadow"><enum>QFrame::Raised</enum></property><layout class="QHBoxLayout" name="horizontalLayout_3"><property name="topMargin"><number>0</number></property><property name="bottomMargin"><number>0</number></property><item><widget class="QLabel" name="label"><property name="text"><string>文件保存至:</string></property></widget></item><item><widget class="QLineEdit" name="lineEdit_path"><property name="enabled"><bool>true</bool></property><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="maximumSize"><size><width>16777215</width><height>25</height></size></property><property name="font"><font><pointsize>10</pointsize></font></property></widget></item><item><widget class="QPushButton" name="pushButton_openpath"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">QPushButton {background-color: rgb(203, 203, 203);
}
QPushButton:hover {background-color: rgb(152, 152, 152);
}
QPushButton:pressed {background-color: rgb(118, 118, 118);
}</string></property><property name="text"><string>打开文件夹</string></property></widget></item><item><widget class="QPushButton" name="pushButton_modifypath"><property name="minimumSize"><size><width>0</width><height>25</height></size></property><property name="styleSheet"><string notr="true">QPushButton {background-color: rgb(203, 203, 203);
}
QPushButton:hover {background-color: rgb(152, 152, 152);
}
QPushButton:pressed {background-color: rgb(118, 118, 118);
}</string></property><property name="text"><string>修改路径</string></property></widget></item></layout></widget></item></layout></widget><resources/><connections/>
</ui>

kugou_ui.py:

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'kugou.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_widget(object):def setupUi(self, widget):widget.setObjectName("widget")widget.resize(500, 400)widget.setMinimumSize(QtCore.QSize(500, 400))widget.setMaximumSize(QtCore.QSize(500, 400))self.verticalLayout = QtWidgets.QVBoxLayout(widget)self.verticalLayout.setSpacing(0)self.verticalLayout.setObjectName("verticalLayout")self.frame = QtWidgets.QFrame(widget)self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame.setFrameShadow(QtWidgets.QFrame.Raised)self.frame.setObjectName("frame")self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame)self.horizontalLayout.setObjectName("horizontalLayout")self.lineEdit_search = QtWidgets.QLineEdit(self.frame)self.lineEdit_search.setMinimumSize(QtCore.QSize(0, 25))self.lineEdit_search.setMaximumSize(QtCore.QSize(16777215, 25))font = QtGui.QFont()font.setPointSize(10)self.lineEdit_search.setFont(font)self.lineEdit_search.setClearButtonEnabled(True)self.lineEdit_search.setObjectName("lineEdit_search")self.horizontalLayout.addWidget(self.lineEdit_search)self.pushButton_search = QtWidgets.QPushButton(self.frame)self.pushButton_search.setMinimumSize(QtCore.QSize(0, 25))self.pushButton_search.setStyleSheet("QPushButton {\n"
"    background-color: rgb(203, 203, 203);\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: rgb(152, 152, 152);\n"
"}\n"
"QPushButton:pressed {\n"
"    background-color: rgb(118, 118, 118);\n"
"}")self.pushButton_search.setObjectName("pushButton_search")self.horizontalLayout.addWidget(self.pushButton_search)self.pushButton_clear = QtWidgets.QPushButton(self.frame)self.pushButton_clear.setMinimumSize(QtCore.QSize(0, 25))self.pushButton_clear.setStyleSheet("QPushButton {\n"
"    background-color: rgb(203, 203, 203);\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: rgb(152, 152, 152);\n"
"}\n"
"QPushButton:pressed {\n"
"    background-color: rgb(118, 118, 118);\n"
"}")self.pushButton_clear.setObjectName("pushButton_clear")self.horizontalLayout.addWidget(self.pushButton_clear)self.verticalLayout.addWidget(self.frame)self.frame_3 = QtWidgets.QFrame(widget)self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised)self.frame_3.setObjectName("frame_3")self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame_3)self.horizontalLayout_2.setContentsMargins(-1, 0, -1, 0)self.horizontalLayout_2.setSpacing(0)self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.listWidget = QtWidgets.QListWidget(self.frame_3)self.listWidget.setObjectName("listWidget")self.horizontalLayout_2.addWidget(self.listWidget)self.verticalLayout.addWidget(self.frame_3)self.frame_2 = QtWidgets.QFrame(widget)self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)self.frame_2.setObjectName("frame_2")self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.frame_2)self.horizontalLayout_4.setContentsMargins(-1, 0, -1, 0)self.horizontalLayout_4.setSpacing(0)self.horizontalLayout_4.setObjectName("horizontalLayout_4")self.lineEdit_info = QtWidgets.QLineEdit(self.frame_2)self.lineEdit_info.setMinimumSize(QtCore.QSize(0, 25))self.lineEdit_info.setMaximumSize(QtCore.QSize(16777215, 25))font = QtGui.QFont()font.setPointSize(10)self.lineEdit_info.setFont(font)self.lineEdit_info.setObjectName("lineEdit_info")self.horizontalLayout_4.addWidget(self.lineEdit_info)self.verticalLayout.addWidget(self.frame_2)self.frame_4 = QtWidgets.QFrame(widget)self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel)self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised)self.frame_4.setObjectName("frame_4")self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_4)self.horizontalLayout_3.setContentsMargins(-1, 0, -1, 0)self.horizontalLayout_3.setObjectName("horizontalLayout_3")self.label = QtWidgets.QLabel(self.frame_4)self.label.setObjectName("label")self.horizontalLayout_3.addWidget(self.label)self.lineEdit_path = QtWidgets.QLineEdit(self.frame_4)self.lineEdit_path.setEnabled(True)self.lineEdit_path.setMinimumSize(QtCore.QSize(0, 25))self.lineEdit_path.setMaximumSize(QtCore.QSize(16777215, 25))font = QtGui.QFont()font.setPointSize(10)self.lineEdit_path.setFont(font)self.lineEdit_path.setObjectName("lineEdit_path")self.horizontalLayout_3.addWidget(self.lineEdit_path)self.pushButton_openpath = QtWidgets.QPushButton(self.frame_4)self.pushButton_openpath.setMinimumSize(QtCore.QSize(0, 25))self.pushButton_openpath.setStyleSheet("QPushButton {\n"
"    background-color: rgb(203, 203, 203);\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: rgb(152, 152, 152);\n"
"}\n"
"QPushButton:pressed {\n"
"    background-color: rgb(118, 118, 118);\n"
"}")self.pushButton_openpath.setObjectName("pushButton_openpath")self.horizontalLayout_3.addWidget(self.pushButton_openpath)self.pushButton_modifypath = QtWidgets.QPushButton(self.frame_4)self.pushButton_modifypath.setMinimumSize(QtCore.QSize(0, 25))self.pushButton_modifypath.setStyleSheet("QPushButton {\n"
"    background-color: rgb(203, 203, 203);\n"
"}\n"
"QPushButton:hover {\n"
"    background-color: rgb(152, 152, 152);\n"
"}\n"
"QPushButton:pressed {\n"
"    background-color: rgb(118, 118, 118);\n"
"}")self.pushButton_modifypath.setObjectName("pushButton_modifypath")self.horizontalLayout_3.addWidget(self.pushButton_modifypath)self.verticalLayout.addWidget(self.frame_4)self.verticalLayout.setStretch(0, 1)self.verticalLayout.setStretch(1, 6)self.verticalLayout.setStretch(2, 1)self.verticalLayout.setStretch(3, 1)self.retranslateUi(widget)QtCore.QMetaObject.connectSlotsByName(widget)def retranslateUi(self, widget):_translate = QtCore.QCoreApplication.translatewidget.setWindowTitle(_translate("widget", "酷狗音乐下载器"))self.lineEdit_search.setPlaceholderText(_translate("widget", "搜索单曲、歌手"))self.pushButton_search.setText(_translate("widget", "搜索"))self.pushButton_clear.setText(_translate("widget", "清空"))self.label.setText(_translate("widget", "文件保存至:"))self.pushButton_openpath.setText(_translate("widget", "打开文件夹"))self.pushButton_modifypath.setText(_translate("widget", "修改路径"))

my_spider.py:

import requests
import os
import jsonclass SpiderKugou(object):def __init__(self):self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}self.play_url = []self.file_names = []def run(self, input_text):'''开始爬取歌曲名称和对应的mp3链接'''# 获取搜索结果的下一级网页链接hash_urls = self.get_serach_result(input_text)temp_file_names = []temp_play_url = []# for循环获取所有歌曲名称和真实的mp3链接for i in hash_urls:file_name, play_url = self.get_song_url(i)temp_file_names.append(file_name)temp_play_url.append(play_url)self.file_names = temp_file_namesself.play_url = temp_play_urldef get_serach_result(self, input_text):'''获取所有搜索结果的下一级网页链接'''url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery112409233009428201582_1580529885252&keyword={} \&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2 \&iscorrection=1&privilege_filter=0&_=1580529885254'.format(input_text)response = requests.get(url, headers=self.header).textjs = json.loads(response[response.index('(') + 1:-2])mp3s_info = js['data']['lists']hash_urls = []for mp3 in mp3s_info:temp_url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19104171570549157364_1580539237941&' \'hash={}&' \'album_id={}&dfid=4WKjEa4M1QAR0fbVsG3RbTV0&' \'mid=410b614c11a6c72ef6a23073ba557221&platid=4&_=1580539237942'.format(mp3['FileHash'], mp3['AlbumID'])hash_urls.append(temp_url)return hash_urlsdef get_song_url(self, url):'''获取每条搜索结果的名字和mp3链接'''response = requests.get(url, headers=self.header).textjs = json.loads(response[response.index('(') + 1:-2], encoding='utf-8')audio_name = js['data']['audio_name']play_url = js['data']['play_url']return audio_name, play_urldef save_mp3(self, url, save_path, file_name):'''保存mp3文件到本地'''mp3_url = url.replace('\\', '')respnse = requests.get(mp3_url)with open(os.path.join(save_path, file_name+'.mp3'), 'wb') as m:m.write(respnse.content)if __name__ == '__main__':a = SpiderKugou()a.run('下山')print(a.file_names)print(a.play_url)

main.py:

from PyQt5.Qt import *
from kugou_ui import Ui_widget
from my_spider import SpiderKugou
import osclass Window(QWidget, Ui_widget):def __init__(self):super(Window, self).__init__()self.setupUi(self)self.spider_kugou = SpiderKugou()self.play_url = []self.file_names = []# 默认文件保存路径self.save_path = os.path.join(os.getcwd(), 'saved')self.connect()def connect(self):'''连接槽函数'''# 搜索按钮self.pushButton_search.clicked.connect(self.show_result)# 输入框self.lineEdit_search.returnPressed.connect(self.show_result)# 清除按钮self.pushButton_clear.clicked.connect(self.result_clear)# 修改路径按钮self.pushButton_modifypath.clicked.connect(self.set_save_path)# 打开文件夹按钮self.pushButton_openpath.clicked.connect(self.open_save_path)# 双击下载歌曲self.listWidget.doubleClicked.connect(self.download_mp3)# 设置保存路径self.set_default_save_path()def set_default_save_path(self):'''设置默认文件保存路径'''self.lineEdit_path.setText(self.save_path)def show_result(self):'''显示搜索结果'''input_info = self.lineEdit_search.text()try:self.spider_kugou.run(input_info)self.play_url = self.spider_kugou.play_urlself.file_names = self.spider_kugou.file_namesself.listWidget.clear()self.listWidget.addItems(self.spider_kugou.file_names)self.listWidget.setToolTip('双击下载')except KeyError:self.lineEdit_info.setText('请求次数过于频繁,请稍后再试!')def download_mp3(self):'''下载mp3文件保存到本地'''idx = self.listWidget.currentRow()download_url = self.play_url[idx]file_name = self.file_names[idx]try:os.makedirs(self.save_path)except:passself.lineEdit_info.setText('正在下载%s.mp3...'%file_name)self.spider_kugou.save_mp3(download_url, self.save_path, file_name)self.lineEdit_info.clear()self.lineEdit_info.setText('%s下载完成'%file_name)def set_save_path(self):'''修改文件保存路径'''dirname = QFileDialog.getExistingDirectory(self, "浏览", '.')if dirname:self.lineEdit_path.setText(dirname)self.save_path = dirnamedef open_save_path(self):'''打开文件夹'''try:os.makedirs(self.save_path)except:passos.startfile(os.path.normpath(self.save_path))def result_clear(self):'''清除搜索结果'''self.listWidget.clear()if __name__ == '__main__':import sysapp = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

全部代码:github
打包好的exe文件:百度网盘,提取码: qx9f

Python爬虫+PyQt5制作mp3下载工具相关推荐

  1. Python利用PyQt5制作一个获取网络实时数据NBA数据播报GUI

    现在NBA联赛也进行到半决赛了,我们怎么样才能以更快的方法获取NBA的数据呢?这里我们就自己来做一个数据播报的程序 文章目录 制作NBA数据爬虫 捋顺思路 编写代码 NBAReporter.py NB ...

  2. pyqt5 制作壁纸切换工具实例 第二章

    pyqt5 制作壁纸切换工具实例 第一章 https://blog.csdn.net/mtl1994/article/details/118020546 提示:写完文章后,目录可以自动生成,如何生成可 ...

  3. 使用python编写的落网电台下载工具

    使用python编写的落网电台下载工具 落网是个非常不错的独立音乐介绍网站,但是上面提供的歌曲仅供试听,没有提供下载链接.相信不少同学都想过有没工具把歌曲下载下来呢?答案是:有. 我最早是使用遨游浏览 ...

  4. Python爬虫——利用Scrapy批量下载图片

    Python爬虫--利用Scrapy批量下载图片 Scrapy下载图片项目介绍 使用Scrapy下载图片 项目创建 项目预览 创建爬虫文件 项目组件介绍 Scrapy爬虫流程介绍 页面结构分析 定义I ...

  5. Python爬虫——Selenium 简介和下载

    文章目录 Python爬虫--Selenium 简介和下载 1.Selenium 简介 2.Selenium 下载安装 3.Selenium 简单使用 Python爬虫--Selenium 简介和下载 ...

  6. pyqt5 制作壁纸切换工具实例 第一章

    pyqt5 制作壁纸切换工具实例 第二章 https://blog.csdn.net/mtl1994/article/details/118152403 文章目录 前言 效果图 一.代码 1.结构 总 ...

  7. python爬虫之壁纸的下载

    python爬虫之壁纸的下载 好久没有写博客了,暑假这段时间在学校里面忙着写小论文,没机会写我最喜欢的爬虫了(虽然很简单,但架不住哥喜欢...) 好了,废话不多说了,开始把 本次爬虫爬取的是 手机壁纸 ...

  8. Python爬虫—Scrapy框架—Win10下载安装

    Python爬虫-Scrapy框架-Win10下载安装 1. 下载wheel 2.下载twisted 3. 下载pywin32 4. 下载安装Scrapy 5. 创建一个scrapy项目 6. fir ...

  9. python爬虫之小说网站--下载小说(正则表达式)

    python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...

最新文章

  1. 直接依赖,间接依赖,可选依赖,排除依赖,依赖冲突
  2. android 选择ppt模板,微软Office安卓手机版使用攻略:巧用模板可事半功倍
  3. android view爆炸效果,Android 显示view的粒子爆炸/绽放效果
  4. Hbase配置项简介
  5. Scrapy中的splash的安装应用
  6. python库怎么学啊最好_最常用的几个python库--学习引导
  7. hbase 生成文件_HBase:为客户行为生成搜索点击事件统计信息
  8. 单链表的插入操作的实现(0952)SUWST-OJ
  9. 【前端】—每日5道面试题打卡(十六)
  10. 2021最新Java高频面试题,很适合大厂面试
  11. 一个好用的不基于时间的同步文件的软件 —— Allway sync 文件同步
  12. 腾讯社交广告大赛总结
  13. excel粘贴时出现故障_解决excel一复制就卡死的问题
  14. python 等高线图标注,罗兰贝格图--Python等高线图(平滑处理)
  15. GWAS研究和多基因评分
  16. python公众号教学_Python微信公众号后台开发教程
  17. case class 和 class的区别
  18. Couldnt communicate with helper application Git提交
  19. 对方波信号进行傅里叶级数展开,利用matlab绘制展开后的波形
  20. php 语义计算,科学网—【语义计算:关于解析逻辑语义角色】 - 李维的博文

热门文章

  1. 【算法】leetcode 974. 和可被 K 整除的子数组(前缀和思想)
  2. 利用ffmpeg把一帧原始视频数据转换成jpg格式的图片
  3. 时间序列数据分析与预测之Python工具汇总
  4. 4K壁纸批量采集,张张精品,全程自动化
  5. C# 3个可乐瓶可以换一瓶可乐,现在有364瓶可乐。问一共可以喝多少瓶可乐,剩下几个空瓶! 案例
  6. Codeforces Round #428 (Div. 2):A. Arya and Bran
  7. Flask开发成语接龙游戏,以后闲了手机玩玩自己写的游戏吧!
  8. 转载:那些年他(她)们做过的“蠢事”
  9. 异或和同或运算之间的等价关系
  10. 微信小程序-自定义导航栏及返回上一级页面的实现