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

本文介绍了如何使用Python3.7开发工具,通过requests和execjs等库实现从网易云音乐爬取歌曲,包括搜索、下载、播放功能。作者展示了从网页抓取和处理音乐数据,以及用pygame实现本地播放的过程。
摘要由CSDN通过智能技术生成

目录

一、效果展示

二、环境

三、实现过程

四、源码


一、效果展示

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

先来说一下已有功能吧:

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

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

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

二、环境

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

好的,你需要先安装Python中的requests、beautifulsoup4和sqlite3模块。可以使用以下命令进行安装: ``` pip install requests pip install beautifulsoup4 ``` 接下来,你可以编写Python代码来实现抓取音乐top100信息并存储到SQLite数据库中。以下是一个简单的示例: ```python import requests from bs4 import BeautifulSoup import sqlite3 # 创建数据库连接 conn = sqlite3.connect('music_top100.db') c = conn.cursor() # 创建表 c.execute('''CREATE TABLE IF NOT EXISTS music_top100 (rank INTEGER, name TEXT, artist TEXT)''') # 获取网页内容 url = 'https://music.163.com/discover/toplist?id=3778678' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) html = response.text # 解析网页内容 soup = BeautifulSoup(html, 'html.parser') song_list = soup.find('ul', {'class': 'f-hide'}).find_all('a') # 遍历歌曲列表并存储到数据库中 for index, song in enumerate(song_list): name = song.text artist = song.parent.parent.find('span', {'class': 's-fc8'}).text c.execute("INSERT INTO music_top100 VALUES (?, ?, ?)", (index+1, name, artist)) # 提交更改并关闭连接 conn.commit() conn.close() ``` 运行上述代码后,程序会自动访问网址获取音乐top100的信息,并将其存储到名为 `music_top100.db` 的SQLite数据库中。你可以使用SQLite数据库浏览器来查看数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老小孩-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值