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

news2024/9/26 1:24:32

目录

一、效果展示

二、环境

三、实现过程

四、源码


一、效果展示

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

先来说一下已有功能吧:

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

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

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

二、环境

使用语言: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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序实现圆环进度

一&#xff1a;需求 小程序中要展示进度&#xff0c;要求类似示例图&#xff0c;用圆环形式展示进度&#xff0c;那这该如何实现呢&#xff1f;这一篇文章主要讲的就是这样一个功能。 二&#xff1a;实现 实现的大致流程是把圆环进度条封装成一个组件&#xff0c;然后在需要使…

【开源框架】Glide的图片加载流程

引入依赖 以下的所有分析都是基于此版本的Glide分析 //引入第三方库glide implementation com.github.bumptech.glide:glide:4.11.0 annotationProcessor com.github.bumptech.glide:compiler:4.11.0分析 Glide的使用就是短短的一行代码 Glide.with(this).load("xxx&q…

Dell R720服务器已有win10系统下安装Ubuntu10.04双系统

先在win10下进磁盘管理&#xff0c;分配空间 重启电脑&#xff0c;开机时按F11进入BIOS。 one-shot boot&#xff0c;选U盘 datatraveler 我原来装的是ubuntu18&#xff0c;ubuntu18升级成了ubuntu20&#xff0c;但是apt-get upgrade有很多问题&#xff0c;所以只能重装。 …

数据结构与算法之矩阵: Leetcode 134. 螺旋矩阵 (Typescript版)

螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/ 描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示…

第19章 Dubbo

本文中所有的原理及流程都是针对Dubbo3.0.2.1版本 19.1 谈谈你对Dubbo的理解 难度:★★★★ 重点:★★ 白话解析 1、背景:参考18.13题,这里不在赘述。 2、简介:Dubbo在3.x版本之前都只是一个高性能的RPC框架,但是在3.x版本之后,官网的描述变了,Dubbo已经升级成一个等…

ke8学校陈老师H5

目录 例一&#xff1a; 1label for与表单元素建立关联 2鼠标选中区域 3classlist属性&#xff1a;更换类选择器。添加、删除、切换和查询一个元素上的类。 4nextElementSibling属性 5title属性&#xff1a;鼠标放上去会有提示信息 6placeholder属性&#xff1a;填了就有…

Linux常用命令——cksum命令

在线Linux命令查询工具 cksum 检查文件的CRC是否正确 补充说明 cksum命令是检查文件的CRC是否正确&#xff0c;确保文件从一个系统传输到另一个系统的过程中不被损坏。这种方法要求校验和在源系统中被计算出来&#xff0c;在目的系统中又被计算一次&#xff0c;两个数字进行…

【RuoYi-Vue-Plus】学习笔记 50 - 集成 JSEncrypt 实现请求加密传输(源码)

文章目录 前言框架版本前端服务端 框架集成前端集成1、总览2、代码实现服务端集成1、总览2、代码实现2.1、配置信息 application.yml2.2、配置类 ApiDecryptProperties2.3、过滤器 CryptoFilter2.4、包装类 DecryptRequestBodyWrapper2.5、加解密工具类 EncryptUtils2.6、自动装…

Windows环境部署流媒体服务器ZLMediaKit

参考资料 快速开始 ZLMediaKit/ZLMediaKit Wiki GitHub 环境准备 序号名称版本作用下载地址1Microsoft Visual Studio链接&#xff1a;https://pan.baidu.com/s/1DoWjNZ72Y8YpGpSTY0CNKw 提取码&#xff1a;pv6a2opensslWin32/Win64 OpenSSL Installer for Windows - Shi…

聚观早报 | vivo Y100官宣;极氪001 FR将上市

【聚观365】10月25日消息 vivo Y100官宣 一极氪001 FR将上市 特斯拉加速扩张 苹果扩大招聘力度 小米澎湃OS实现历史性跨越 vivo Y100官宣 vivo Y系列是vivo存在比较久的入门系列&#xff0c;主打千元价位的线下市场&#xff0c;在消费者中有着不错的口碑。而不久前一款型…

R语言代码示例

以下是一个使用R语言和httrOAuth库的下载器程序&#xff0c;用于下载的内容。程序使用以下代码。 # 安装和加载必要的库 install.packages("httr") install.packages("httrOAuth") library(httr) library(httrOAuth) ​ # 设置 http_proxy <- "du…

10 个最佳免费 PDF 压缩工具软件

PDF 是一种全球流行的文件格式&#xff0c;可在不损失质量或文本对齐的情况下传输文档。问题是许多文件共享应用程序和网站限制您可以共享或上传的 PDF 的大小。 10 个最佳免费 PDF 压缩工具软件 在这种情况下&#xff0c;您将需要一个可以为您减小 PDF 文件大小的应用程序。P…

Kafka磁盘写满日志清理操作

最近项目组的kafka集群&#xff0c;老是由于应用端写入kafka topic的消息太多&#xff0c;导致所在的broker节点占满&#xff0c;导致其他的组件接连宕机。 这里和应用端沟通可以删除1天之前的消息来清理磁盘&#xff0c;并且可以调整topic的消息存活时间。 一、调整Topic的消…

手写 Promise(2)实例方法与静态方法的实现

一&#xff1a;什么是 Promise Promise 是异步编程的一种解决方案&#xff0c;其实是一个构造函数&#xff0c;自己身上有all、reject、resolve这几个方法&#xff0c;原型上有then、catch等方法。 Promise对象有以下两个特点。 &#xff08;1&#xff09;对象的状态不受…

[③ADRV902x]: Digital Filter Configuration(接收端)

前言 本篇博客主要总结了ADRV9029 Rx接收端链路中各个滤波器的配置。配置不同的滤波器系数以及不同的参数&#xff0c;可以对输入的数字信号灵活得做decimation处理&#xff0c;decimation信号抽取&#xff0c;就是降低信号采样率的过程。 Receiver Signal Path 下图为接收端…

macbook2024免费mac系统优化清理软件CleanMyMac X

清理电脑的操作系统可能是我们一直以来的习惯&#xff0c;从windows系统到mac系统&#xff0c;我们一直在寻求最好的清理方法&#xff0c;能够有效地清理操作系统对于电脑来说是非常重要的。今天小编想和大家一起讨论使用在macbook上的清理软件&#xff0c;清理macbook的空间可…

在React中,什么是状态(state)?如何更新组件的状态?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

C语言程序设计——输入三个整数x,y,z,请把这三个数由小到大输出

题目&#xff1a;输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 程序分析&#xff1a;我们想办法把最小的数放到x上&#xff0c;先将x与y进行比较&#xff0c; 如果x>y则将x与y的值进行交换&#xff0c;然后再用x与z进行比较&#xff0c;如果x>z则将x与z的值…

谈谈Net-SNMP软件

Net-SNMP是一个开源的SNMP软件套件&#xff0c;它提供了SNMP代理&#xff08;snmpd&#xff09;和SNMP工具&#xff08;如snmpget、snmpwalk等&#xff09;&#xff0c;可以用于监控和管理网络设备。 Net-SNMP最初是从UC Davis的SNMP软件衍生而来&#xff0c;现在已经成为广泛…