Python爬虫网易云音乐,Tkinter制作音乐播放器

目录

一、效果展示

二、环境

三、实现过程

四、源码


一、效果展示

页面的美化以及功能还有待升级~

先来说一下已有功能吧:

  • 可以在搜索框中通过歌曲或歌手名称进行搜索,效果和在网易云官网搜索一样。

  • 点击开始下载,就会将搜索结果的第一条歌曲下载到指定文件夹

  • 下载完毕后,会遍历音乐目录,并将歌曲信息在窗口上刷新
  • 选中歌曲,然后点击播放,就会播放音乐

二、环境

使用语言:python3.7
开发工具:PyChram
第三方库:

  1. requests:获取网页数据
  2. execjs:执行js代码
  3. tkinter:图形用户界面
  4. tkinter.ttk:升级版的tkinter
  5. pygame:用来播放音乐

内置库:

  1. os:用于文件操作

三、实现过程

1.网易云音乐爬取

import requests
import re

# 目标网址
url = 'https://music.163.com/discover/toplist'
# 伪装成浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
}

# get请求
response = requests.get(url, headers=headers)
html_data = response.text


info_list = re.findall('<li><a href="/song\?id=(.*?)">(.*?)</a></li>', html_data)

for info in info_list:
    music_id = info[0]
    music_name = info[1]
    music_url = 'http://music.163.com/song/media/outer/url?id=' + music_id

    chars = ['\\','/',':','*','?','"','<','>','|']
    for char in chars:
        music_name = music_name.replace(char, '_')

    # 图片、音频、视频都属于二进制数据
    music_data = requests.get(music_url, headers=headers).content
    with open(f'C:/Users\Administrator\Desktop\音乐播放器/{music_name}.mp3', mode='wb') as f:
        f.write(music_data)

我们先来看一下,歌曲是如何从网页上爬取出来的,

我们先来爬取飙升榜前Top100首歌曲

2.网易云搜索音乐

3.下载

4.遍历文件夹到窗口

5.播放

四、源码

import requests
import execjs
import os
from tkinter import *
from tkinter.ttk import *

import pygame
from tkinter import messagebox

# 下载歌曲到文件夹
def song_load():
    url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token=887ad1857d7e9c0e9640eecb1b5a96be'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    }

    js = open('music163.js', mode='r', encoding='utf-8').read()
    ctx = execjs.compile(js)

    keyword = entry1.get()  # 获取单行文本框里的内容

    result = ctx.call('search', keyword)

    data = {
        'params': result['encText'],
        'encSecKey': result['encSecKey']
    }

    resp = requests.post(url=url, headers=headers, data=data)
    json_data = resp.json()
    songs = json_data['result']['songs']

    if songs:
        song = songs[0]  # 获取第一首匹配到的歌曲
        music_name = song['name']
        music_id = song['id']
        music_url = 'http://music.163.com/song/media/outer/url?id=' + str(music_id)

        chars = ['\\', '/', ':', '*', '?', '"', '<', '>', '|']
        for char in chars:
            music_name = music_name.replace(char, '_')

        # 图片、音频、视频都属于二进制数据
        music_data = requests.get(music_url, headers=headers).content
        with open(f'D:/music/{music_name}.mp3', mode='wb') as f:
            f.write(music_data)

    show_files()


# 将文件夹里的歌曲显示出来
def show_files():
    folder_path = r'D:/music'  # 指定文件夹路径

    # 获取文件夹中的所有文件名
    files = os.listdir(folder_path)

    # 清空树形菜单
    tree.delete(*tree.get_children())

    # 遍历文件名列表,将文件名添加到树形菜单中
    for i, file_name in enumerate(files):
        tree.insert("", index=END, text=i, values=(file_name))



def song_play():
    # 初始化pygame和mixer
    pygame.init()
    pygame.mixer.init()

    # 检查是否选择了要播放的歌曲
    selected_item = tree.focus()
    if not selected_item:
        messagebox.showinfo("提示", "请先选择要播放的歌曲")
        return

    # 获取选中的歌曲文件名
    selected_song = tree.item(selected_item, "values")[0]
    song_path = f"D:/music/{selected_song}"

    try:
        # 使用播放器播放音乐文件
        pygame.mixer.music.load(song_path)
        pygame.mixer.music.play()
        # messagebox.showinfo("提示", "正在播放音乐")
    except pygame.error as e:
        messagebox.showinfo("错误", str(e))


win = Tk()
win.title('音乐听')  # 设置窗口标题
win.configure(bg='#F4EFE7') # 设置背景色
winw=560                              #窗口的宽度
winh=470                              #窗口的高度
scrw=win.winfo_screenwidth()            #屏幕的宽度
scrh=win.winfo_screenheight()           #屏幕的高度
x=(scrw-winw)/2                        #窗口的水平位置
y=(scrh-winh)/2                        #窗口的垂直位置
win.geometry("%dx%d+%d+%d" %(winw,winh,x,y))            #设置窗口位置





title_label = Label(win, text='音乐听', font=('华文行楷', 36, 'bold'), background='#F4EFE7')
title_label.grid(row=0,columnspan=2)

label1 = Label(win, text='输入歌曲、歌手:', font=('华文行楷', 20), background='#F4EFE7')
label1.grid(row=1, column=0,padx=10,pady=10)

entry1 = Entry(win, font=('隶书', 20))
entry1.grid(row=1, column=1,padx=10,pady=10)

var = StringVar()
var.set('163')
style = Style()
style.configure('TRadiobutton', font=('微软雅黑', 14), background='#F4EFE7')
radio1 = Radiobutton(win, text='网易云音乐', variable=var, value='163',style='TRadiobutton')
radio1.grid(row=2, column=0,padx=10,pady=10)
radio2 = Radiobutton(win, text='QQ音乐', variable=var, value='qq', style='TRadiobutton')
radio2.grid(row=2, column=1,padx=10,pady=10)

tree = Treeview(win, columns=("filename"))
tree.heading("#0", text="序号")
tree.heading("filename", text="文件名称")
tree.grid(row=3, columnspan=2,padx=10,pady=10)

# 定义按钮的样式
style.configure('TButton', font=('微软雅黑', 14), background='#F4EFE7', foreground='#000000', relief=RIDGE)
button1 = Button(win, text='开始下载', command=song_load, style='TButton')
button1.grid(row=4, column=0, padx=60, pady=10)

button2 = Button(win, text='播放', command=song_play, style='TButton')
button2.grid(row=4, column=1, padx=60, pady=10)


# button2 = Button(win, text='退出程序', command=win.quit)
# button2.grid(row=3, columnspan=2)


show_files()

win.mainloop()

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

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

相关文章

安装python虚拟环境

什么是虚拟环境&#xff1a; 虚拟环境的意义&#xff0c;就如同 虚拟机 一样&#xff0c;它可以实现不同环境中Python依赖包相互独立&#xff0c;互不干扰。 环境准备 安装python &#xff08;到官网下载Download Python​配置环境变量&#xff0c;cmd进入命令行输入 python…

Flutter——最详细(Scaffold)使用教程

Scaffold简介 相当于界面的主体&#xff08;类似于安卓最外层PhoneWindow&#xff09;&#xff0c;组件的展示都必须依附于它。 使用场景&#xff1a; 每一个界面都是脚手架&#xff0c;通过它来进行架构实现&#xff0c;优美的布局效果。 属性作用appBar顶部的标题栏body显示整…

磁盘监控:告警时发送邮件

1.配置邮箱 1.编辑邮箱配置文件 vim /etc/mail.rc2.在末尾输入自己的邮箱配置&#xff0c;以163邮箱为例 #开启ssl set ssl-verifyignore #证书目录&#xff0c;下方为centos系统证书默认位置&#xff0c;也自行生成证书并指定 set nss-config-dir/etc/pki/nssdb # 配置的第…

一文知晓Linux文件权限

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

聚量推客滴滴学生认证app地推网推拉新升级啦

“聚量推客”滴滴学生认证项目升级 滴滴学生认证升级后分为微信推广版本和支付宝推广版本两种码 根据自己需要选择推广场景&#xff0c;适合地推和网推

CSRF跨域请求伪造

1.SSRF服务端请求伪造&#xff08;外网访问内网&#xff09; SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF是要目标网站的内部系统。&#xff08;因为他是从内部系统访问的&#xf…

甲骨文真的要开放Java EE?

甲骨文表示&#xff0c;目前正在与可能的几个候选基金会&#xff0c;以及许可证持有者和社区在进行谈判。随着Java EE 8平台的确定&#xff0c;甲骨文在周四表示&#xff0c;目前正在考虑将Java Enterprise Edition技术转移到开源社区。 甲骨文在其博客中说道&#xff0c;这次的…

【TES641】基于VU13P FPGA的4路FMC接口基带信号处理平台

板卡概述 TES641是一款基于Virtex UltraScale系列FPGA的高性能4路FMC接口基带信号处理平台&#xff0c;该平台采用1片Xilinx的Virtex UltraScale系列FPGA XCVU13P作为信号实时处理单元&#xff0c;该板卡具有4个FMC子卡接口&#xff08;其中有2个为FMC接口&#xff09;&#x…

【App 抓包提示网络异常怎么破?】

背景 当你测试App的时候,想要通过Fiddler/Charles等工具抓包看下https请求的数据情况,发现大部分的App都提示网络异常/无数据等等信息。以“贝壳找房”为例: 455 x 705 Fiddler中看到的请求是这样的: 619 x 215 你可能开始找证书的问题:是不是Fiddler/Charles的证书没有…

解决提交到App Store时的ITMS-90478和ITMS-90062错误

解决提交到App Store时的ITMS-90478和ITMS-90062错误 目录 引言 正文 1. 什么是ITMS-90478和ITMS-90062错误&#xff1f; 2. 解决方法 2.1 确定当前的版本号和构建号 2.2 递增版本号和构建号 2.3 再次尝试提交应用 总结 参考资料 错误记录 摘要&#xff1a;本文为iOS…

基于Java的宠物商店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

高校打造动捕实训室:开启元宇宙创新教育时代

随着科技的发展&#xff0c;高校教育面临着新的挑战与机遇。高校动捕实训室涉及多个学科领域&#xff0c;如艺术学院、设计学院、新媒体学院等&#xff0c;适用于动画、视觉传达、数码媒体、数字媒体艺术等专业。动捕实训室可以为学生提供创意发挥的空间&#xff0c;使用动捕设…

【Airflow】构建爬虫任务系统

爬虫脚本太多了需要进行管理一下&#xff0c;领导决定使用airflow 我了解了一下这个平台是用来做任务调度。 是一个ETL工具 ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程 这里是一个github的地址 https://github.com/apache/airflow 这里是官方文档 http…

使用AOP切面实现日志记录功能

系列文章 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. Java中运用BigDecimal对字符串的数值进行加减乘除等操作 5. List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&…

seacms_CNVD-2020-22721_v10.1漏洞分析与复现

seacms 远程命令执行漏洞复现 文章目录 seacms 远程命令执行漏洞复现一、基本信息二、组件简介三、漏洞详情漏洞介绍影响范围危害 四、防御1. 漏洞存在性检测2. 修复建议3. 规避措施4. 漏洞利用检测 五、漏洞复现1. 复现环境2. 漏洞复现 一、基本信息 titlecontentnote漏洞编号…

【Redis】Docker部署Redis数据库

Docker部署Redis数据库 1. Redis介绍2. CentOS 7 安装 & Docker 配置3. 拉取Redis 镜像、创建容器3.1 配置Docker镜像源3.2 拉取Redis 镜像3.3 容器创建 1. Redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用…

二、【常用的几种抠图方式一】

文章目录 选框抠图快速选择工具抠图魔棒工具抠图对象选择工具抠图套索工具抠图多边形套索工具抠图磁性套索工具抠图 选框抠图 选框工具抠图适合规则的图形&#xff0c;如下图先使用选框工具框出对象的图轮廓&#xff0c;然后再选择并遮住在里边擦出图形的边缘&#xff0c;根据…

【LeetCode:1465. 切割后面积最大的蛋糕 | 贪心 + 排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

安全和便捷:如何将运营商二要素API应用于实名制管理中

引言 随着互联网的快速发展&#xff0c;数字化身份验证和实名制管理变得越来越重要。在金融、电子商务、社交媒体等领域&#xff0c;确保用户身份的安全和准确性至关重要。运营商二要素核验API成为了实名制管理的有力工具&#xff0c;它不仅能够提供高水平的安全性&#xff0c…

常见的云测试策略及重要性

随着云计算技术的快速发展&#xff0c;云服务已经成为了现代应用程序开发和部署的核心组成部分。然而&#xff0c;随之而来的是对云系统性能和质量的不断追求&#xff0c;这使得云测试变得至关重要。本文将探讨云测试的概念、重要性以及一些常见的云测试策略和工具。 一、云测试…