当前位置: 首页 > article >正文

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()


http://www.kler.cn/a/104244.html

相关文章:

  • 基于Java的智能停车场管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 在 openresty 中使用 capnp lua 库
  • 禾匠旧版对接微信小程序发货系统(发货信息管理 接口)
  • WAS项目更新单个文件
  • 【方法】如何给PDF文件添加“打开密码”?
  • Android Glide判断图像资源是否缓存onlyRetrieveFromCache,使用缓存数据,Kotlin
  • C#(JS)几个常用的正则表达式
  • MAXScript - tyFlow for 3dsMax
  • 2.9.C++项目:网络版五子棋对战之业务处理模块的设计
  • 18 Transformer 的动态流程
  • 使用form-data传递数组和x-www-form-urlencoded传递的区别
  • UE4/5 批量进行贴图Texture压缩、修改饱和度
  • 新媒体运营的营销方案
  • 目标检测应用场景—数据集【NO.16】交通标志检测
  • NSS [SWPUCTF 2021 新生赛]sql
  • Photoshop(PS)安装教程(图文教程超详细)
  • Cassandra 设计最佳实践
  • USB学习(2):USB端点和传输协议(数据包、事物)详解
  • Kurento多对多webrtc会议搭建测试
  • Kafka - 3.x Kafka命令行操作