Python制作在线音乐播放器

思路:

1.使用Python爬虫对QQ音乐进行爬取数据,进行数据分析得到歌曲的url。
1.将搜索url进行拼接;
 https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w={name}
2.根据搜索url进行爬取搜索列表
3.根据所选取的选项进行爬取,得到下载url:https://y.qq.com/n/yqq/song/002CD1h63aXAkm.html
4.通过接口网站进行爬取最终的音频文件的url
5.通过url下载到本地
6.设计GUI,实现音乐播放功能。

效果:

在这里插入图片描述

代码:

from tkinter import *
from PIL import Image,ImageTk
from pymediainfo import MediaInfo
import IPython.display as ipd
from pygame import mixer
import threading
import pygame
import time
import requests
import json
import re
import os

def music(name):
    url = f"https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=62115878671550904&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w={name}&g_tk=5381&jsonpCallback=MusicJsonCallback2806001545440244&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0"
    json_list = requests.get(url).text
    res = re.compile(r"MusicJsonCallback.*?{(.*)}", re.S)
    content = re.findall(res, json_list)
    content_1 = '{'+content[0]+'}'
    dict_content = json.loads(content_1)
    keyword = dict_content["data"]["keyword"]
    list_all = dict_content["data"]["song"]["list"]
    mid_list = []
    music_title_list = []
    music_album_name = []
    music_singer_name = []
    for index, for_dict in enumerate(list_all):
        # 专辑名
        album_name = for_dict["album"]["title"]
        music_album_name.append(album_name)
        # new url
        mid_list.append(for_dict["mid"])
        # 歌名
        music_title = for_dict["title"]
        music_title_list.append(music_title)
        # 歌手
        singer_name = for_dict["singer"][0]["title"]
        music_singer_name.append(singer_name)
    return mid_list,music_title_list,music_singer_name,music_album_name

def get_url(data):
    url = 'http://www.douqq.com/qqmusic/qqapi.php' #接口网站
    headers = {
        "Content-Type":"application/json",
        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
        'Host':'www.douqq.com',
        'Origin':'http://www.douqq.com',
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
    }
    from_data = {
        'mid':data
    }
    response = requests.post(url=url,data=from_data,headers=headers)
    str_data = response.content.decode('utf-8')   #得到字符串数据
    str_data = json.loads(str_data)
    str_data = str_data.replace('\/\/','//').replace('\/','/')
    str_data = re.findall('"m4a":"(.*?)",',str_data,re.S)[0]
    return str_data
def save(my_str):
    url = my_str
    response = requests.get(url=url)
    result = response.content
    return result
def select(result):   #搜索按钮
    a = str(inp1.get())
    s = youdao(a)
    txt.delete(0.0, END)
    txt.insert(END, s)

def show():
    name = str(e1.get())#get是用来获取e1的内容的
    e2.delete(0.0, END)
    e2.insert(END,'   歌曲\t\t\t  歌手\t\t  专辑\n')
    global my_data
    my_data = music(name=name)
    for i in range(1,6):
        my_music_list = '%d  '%i+my_data[1][i]+'\t\t\t '+my_data[2][i]+'\t\t  '+my_data[3][i]+'\n'
        e2.insert(END, my_music_list)
def show1():
    name_num = str(e3.get())#get是用来获取e1的内容的
    e2.delete(0.0, END)
    e2.insert(END,'   歌曲\t\t\t  歌手\t\t  专辑\n')
    my_music_list = '   '+my_data[1][int(name_num)]+'\t\t\t '+my_data[2][int(name_num)]+'\t\t  '+my_data[3][int(name_num)]+'\n'
    e2.insert(END, my_music_list)
    data = 'https://y.qq.com/n/yqq/song/'+my_data[0][int(name_num)]+'.html'
    my_str = get_url(data)
    music = save(my_str)
    
    global my_music_name
    my_music_name = my_data[1][int(name_num)]
    with open('spyider_music\%s.mp3'%my_music_name,'wb') as f:
        f.write(music) 
        f.flush()
    time.sleep(5)
    mixer.init()
    mixer.music.load(r'spyider_music\\'+my_music_name+'.mp3')
    mixer.music.play()
    time.sleep(300)
    mixer.music.stop()
    e2.insert(END, '\n   歌曲缓存中,请等待...\n')
    e2.insert(END, '   缓存完毕!')

    
if __name__ == "__main__":
    app = Tk()
    app.geometry('540x280')
    app.title('音乐播放器')
    Label(app, text= "请输入歌名或者歌手名:").grid(row = 1, column = 0)
    theButton1 = Button(app, text = "搜索",background='#CA0316',foreground='white',activebackground='red',activeforeground='white',width = 10,command = show)
    theButton1.grid(row =1 ,column =4,sticky =W+E, padx=10,pady =5)
    v1 = StringVar()
    e1 = Entry(app, textvariable = v1)
    e2 = Text(app, font=('华文新魏',11))
    e1.grid(row = 1, column = 1)
    e2.place(relx=0.03,rely=0.14, relwidth=0.938,relheight=0.5,)
    Label(app, text= "   要听第几首歌(根据序号)?").grid(row = 6, column = 0)
    theButton2 = Button(app, text = "播放",background='#CA0316',foreground='white',activebackground='red',activeforeground='white',width = 10,command = show1)
    theButton2.grid(row =6 ,column =4,sticky =W+E, padx=10,pady =145)
    v3 = StringVar()
    e3 = Entry(app, textvariable = v3)    
    e3.grid(row = 6, column = 1)
 
    mainloop()
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值