Python 分析某音乐页面并使用tkinter构建简易GUI

  • 分析页面
  • 保存
  • 简单GUI的制作
  • 全部代码

本人python初学者,记录自己的一次学习过程,仅供参考。欢迎各位前辈指点。

分析页面

本次要分析的页面主要是酷狗音乐的搜索界面

思路如下:

  1. 在上图所示页面点击播放一首音乐后,F12进入开发者模式,找到含有音乐的play_url的请求网址,该url就是音乐播放的url。
  2. 在对请求网址进行删减后,注意到encode_album_audio_id(红框内)的参数,似乎是代表着音乐的id。
  3. 所以如果有了每首歌曲的encode_album_audio_id,也就获得了这首歌曲的play_url
  4. 返回到搜索界面,进入开发者模式,并Ctrl+F搜索红框内encode_album_audio_id,发现了一个list,里面包含了搜索界面的音乐信息;
  5. 我们在对应的音乐里面,发现了和encode_album_audio_id相同的值——EMixSongID
    所以现在的任务也就变成了提取每首音乐的EMixSongID,也就是得到了encode_album_audio_id,同时就得到了play_url
  6. 观察请求页面的参数
    尝试了不同几个页面的参数后,发现只有clienttimesignature是变化的。(可能还有关键字keyword)
    其中clientime为当前时间戳,pyhon time库处理简单。
    关于signature的处理可自行查找。
  7. 接下来的任务就是对url中的json格式进行处理,提取EMixSongID
  8. 将得到得到不同歌曲的不同的EMixSongID进行url拼接,得到含有该首歌曲play_url的url,再次对该页面进行json处理,得到play_url,完成。
def get_url():k = time.time()k = int(round(k * 1000))text = input("请输入搜索关键字")info = ["NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid=1014","bitrate=0","callback=callback123","clienttime={}".format(k),"clientver=1000","dfid=34d3K63Qc3AA3wvcEp1te6TT","filter=10","inputtype=0","iscorrection=1","isfuzzy=0","keyword={}".format(text),"mid=41d5a0c36112c5cb310d75b0ab73ac0f","page=1","pagesize=30","platform=WebFilter","privilege_filter=0","srcappid=2919","token=","userid=0","uuid=41d5a0c36112c5cb310d75b0ab73ac0f","NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"]# 创建md5对象new_md5 = md5()info = ''.join(info)# 更新哈希对象new_md5.update(info.encode(encoding='utf-8'))# 加密result = new_md5.hexdigest()music_info_url = 'https://complexsearch.kugou.com/v2/search/song?callback=callback123&srcappid=2919&clientver=1000&clienttime={}&' \'mid=41d5a0c36112c5cb310d75b0ab73ac0f&uuid=41d5a0c36112c5cb310d75b0ab73ac0f&dfid=34d3K63Qc3AA3wvcEp1te6TT&' \'keyword={}&page=1&pagesize=30&bitrate=0&isfuzzy=0&inputtype=0&platform=WebFilter&userid=0&iscorrection=1&' \'privilege_filter=0&filter=10&token=&appid=1014&signature={}'.format(k, text, result)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36','Cookie': '填入你自己的Cookie'}# 请求搜索界面的URLminfo_get = requests.get(music_info_url, headers=headers).text# 获得该页面的json格式并处理minfo_get = minfo_get[12:-2]minfo = json.loads(minfo_get)['data']['lists']num = json.loads(minfo_get)['data']['pagesize']for j in range(0, num - 1):song_name = minfo[j]['SongName']singer_name = minfo[j]['SingerName']# dfid这个参数部分歌曲不能缺少,缺少则会出现出现无法正常获得url的情况。# 但大多数歌曲都可以没有该参数。# 如果有人知道原因的话,希望解答一下。感恩!music_url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&dfid=34d3K63Qc3AA3wvcEp1te6TT&encode_album_audio_id={}'.format(minfo[j]['EMixSongID'])print(music_url)get_play_url = requests.get(music_url, headers=headers).textplay_url = json.loads(get_play_url)['data']['play_url']print(play_url)

保存

该部分的代码非常简单。
代码如下:

     # 选择位置download_place = "pachong_music"try:with open('{}/{}---{}.mp3'.format(download_place, song_name, singer_name), 'wb') as f:f.write(requests.get(play_url).content)print("{}--{}保存成功".format(song_name, singer_name))# 若无该歌曲资源except requests.exceptions.MissingSchema as e:print("{}--{}暂时不能播放".format(song_name, singer_name))except KeyError as e:print("{}--{}保存失败".format(song_name, singer_name))f.close()

简单GUI的制作

本文界面制作使用的是tkinter库。由于python水平还比较差,所以功能非常简单。
只有搜索并显示音乐信息。
浏览本地文件夹,选择位置。
希望以后学习,能够完善更多功能。

点击按钮后,改变相应的变量值选择方法是使用全局变量。下面直接放代码吧。
滚动窗口使用的是tkinter中的scrolledtext
浏览使用的是tkinter中的filedialog

全部代码

import json
import time
from hashlib import md5
import requests
import tkinter as tk
from tkinter import scrolledtext
from tkinter import filedialogdef get_url():global music_info_urltext = key_word.get()# TODO:自定义关键词搜索页面的URL# js逆向部分参考:https://www.cnblogs.com/wxd501/p/17071045.htmlk = time.time()k = int(round(k * 1000))info = ["NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt","appid=1014","bitrate=0","callback=callback123","clienttime={}".format(k),"clientver=1000","dfid=34d3K63Qc3AA3wvcEp1te6TT","filter=10","inputtype=0","iscorrection=1","isfuzzy=0","keyword={}".format(text),"mid=41d5a0c36112c5cb310d75b0ab73ac0f","page=1","pagesize=30","platform=WebFilter","privilege_filter=0","srcappid=2919","token=","userid=0","uuid=41d5a0c36112c5cb310d75b0ab73ac0f","NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"]# 创建md5对象new_md5 = md5()info = ''.join(info)# 更新哈希对象new_md5.update(info.encode(encoding='utf-8'))# 加密result = new_md5.hexdigest()music_info_url = 'https://complexsearch.kugou.com/v2/search/song?callback=callback123&srcappid=2919&clientver=1000&clienttime={}&' \'mid=41d5a0c36112c5cb310d75b0ab73ac0f&uuid=41d5a0c36112c5cb310d75b0ab73ac0f&dfid=34d3K63Qc3AA3wvcEp1te6TT&' \'keyword={}&page=1&pagesize=30&bitrate=0&isfuzzy=0&inputtype=0&platform=WebFilter&userid=0&iscorrection=1&' \'privilege_filter=0&filter=10&token=&appid=1014&signature={}'.format(k, text, result)# con_info.insert("end", music_info_url)# con_info.insert("end", '\n')headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36','Cookie': '****'}minfo_get = requests.get(music_info_url, headers=headers).textminfo_get = minfo_get[12:-2]minfo = json.loads(minfo_get)['data']['lists']# for i, k in enumerate(minfo):#     print(i, k['SingerName'], k['EMixSongID'])# num为页码包含歌曲数量num = json.loads(minfo_get)['data']['pagesize']con_info.insert("end", '搜索到的歌曲如下:\n')for j in range(0, num - 1):song_name = minfo[j]['SongName']singer_name = minfo[j]['SingerName']music_url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&dfid=34d3K63Qc3AA3wvcEp1te6TT&encode_album_audio_id={}'.format(minfo[j]['EMixSongID'])get_play_url = requests.get(music_url, headers=headers).textjson.loads(get_play_url)['data']['play_url']con_info.insert("end", "{}--{}".format(song_name, singer_name))con_info.insert("end", '\n')# TODO:浏览文件夹,选择本地位置
def browse():global download_placedownload_place = filedialog.askdirectory()con_info.insert("end", "即将保存的路径为{}".format(download_place))con_info.insert("end", '\n')# TODO:获取并写入文件
def download_music():global music_info_urlheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36','Cookie': 'kg_mid=41d5a0c36112c5cb310d75b0ab73ac0f; kg_dfid=34d3K63Qc3AA3wvcEp1te6TT; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1677400096; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1677411756'}minfo_get = requests.get(music_info_url, headers=headers).textminfo_get = minfo_get[12:-2]minfo = json.loads(minfo_get)['data']['lists']# num为页码包含歌曲数量num = json.loads(minfo_get)['data']['pagesize']for j in range(0, num - 1):song_name = minfo[j]['SongName']singer_name = minfo[j]['SingerName']music_url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&encode_album_audio_id={}'.format(minfo[j]['EMixSongID'])get_play_url = requests.get(music_url, headers=headers).textplay_url = json.loads(get_play_url)['data']['play_url']try:with open('{}/{}---{}.mp3'.format(download_place, song_name, singer_name), 'wb') as f:f.write(requests.get(play_url).content)except requests.exceptions.MissingSchema as e:con_info.insert("未获得歌曲{}--{}资源".format(song_name, singer_name))except KeyError as e:con_info.insert("{}--{}保存失败".format(song_name, singer_name))f.close()con_info.insert("end", "{}--{}保存成功".format(song_name, singer_name))con_info.insert("end", '\n')if __name__ == '__main__':music_info_url = ""download_place = ""# TODO:UI界面root = tk.Tk()root.title("music")root.geometry('1024x512')# 添加搜索关键词框key_word = tk.Entry(root)key_word.pack()# 点击搜索button执行get_url函数,获得连接find_button = tk.Button(root, text="搜索", command=get_url)find_button.pack()# 点击浏览button执行browse函数,选择保存文件存储位置browse_button = tk.Button(root, text="浏览", command=browse)browse_button.pack()# 点击保存button执行download_music函数,保存歌曲down_button = tk.Button(root, text="保存", command=download_music)down_button.pack()# 设置一个输出控制台信息的滚动文本框frame2 = tk.LabelFrame(root, text="控制台信息")frame2.pack()con_info = scrolledtext.ScrolledText(frame2)con_info.pack()root.mainloop()

【Python3】分析某音乐页面并使用tkinter构建简易GUI相关推荐

  1. Python3分析个人音乐收藏

    导语 偶遇了一篇文章: "Mapping Your Music Collection" https://www.christianpeccei.com/musicmap/ 感觉颇有 ...

  2. amazeui页面分析之登录页面

    amazeui页面分析之登录页面 一.总结 1.tpl命名空间:tpl命名空间的样式都是从app.css里面来的,app.css用用来移动网站开发的样式 2.表单样式:am-form到am-form- ...

  3. Swift5之网易云音乐页面搭建

    Swift5之网易云音乐页面搭建 纯swift5项目搭建 https://gitee.com/johnson__save_admin/netease-music-swift/

  4. Hexo-Fluid主题添加音乐页面

    效果预览:https://bynote.cn/playlist/ 如果你想使用音乐页面,很多人都会推荐安装hexo-tag-aplayer这款插件. 这款插件通过Hexo独有的标签外挂,我们可以很方便 ...

  5. Python3爬取喜马拉雅页面音频文件

    目的? 这是一个python练习,通过这个练习,我们可以了解: 使用python发起http请求 python的文件操作 python的数据库操作 一.分析列表页面 首先分析一下某网站的专辑页面要素, ...

  6. 4、python分析酷我音乐

    4.python分析酷我音乐 1.环境依赖: 需要安装requests和jsonpath这两个模块 2.步骤: (1)首先,进入酷我音乐官网 (2)鼠标右键点击检查,选择notework 这一栏中的M ...

  7. python爬去音乐_Python爬虫——分析酷我音乐网站,并爬取歌曲-Go语言中文社区

    前言: 爬取数据,我们都先必须了解开发者工具的使用和网页的源代码,即Python导入第三方库的步骤. 开发者工具使用步骤: 使用F12或者Ctrl+Shirt+i打开开发者工具 说明: 1)先检查HT ...

  8. 人工智能音乐算法的应用领域:从音频分析到音乐风格的探索

    文章目录 人工智能音乐算法的应用领域:从音频分析到音乐风格的探索 1. 引言 1.1. 背景介绍 1.2. 文章目的 1.3. 目标受众 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原 ...

  9. 如何使用Python和Tkinter构建Toy Markdown编辑器

    Markdown editors are trending these days. Everybody is creating a markdown editor, and some of them ...

最新文章

  1. Word中的图片显示出不来的解决办法
  2. 07年了,新的一年又开始了
  3. 如何搭建VUE开发环境
  4. 【收藏】联想官方出品一键关闭Windows自动更新工具,和Windows自动更新说再见
  5. 设c语言中 一个int型数据库,最新真实全国二级C选择题真题第1套
  6. C++实现线段树求区间和-区间查询
  7. est.java 2 错误 找不到符号_找不到Cython/Python符号PyString\u Typ
  8. 高级语言程序设计c 华南理工,华南理工大学高级语言程序设计(C)期末练习题
  9. 大润发java薪资,大润发edp员工面试:不说位置了,怕备查,哈哈 第一次去是因 - 职朋职业圈...
  10. undefined reference to `crypto_get_random'
  11. java应用程序必须有主类_2020最新版Java基础知识面试题
  12. JS导出table数据到excel问题-Automation 服务器不能创建对象
  13. Dubbo调优 -- 超时TimeOut
  14. delphi7中的局部变量和全局变量
  15. C语言程序设计精髓(MOOC第12周 )题
  16. iOS Workspace内多project开发
  17. 解决MySQL报错ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)
  18. 游戏辅助制作核心--植物大战僵尸逆向之天上下钻石(五)
  19. SEO优化:用SEO常用表格的原因,为什么要行使seo表格器材
  20. Geant4------初学1

热门文章

  1. linux 命令行进入redis
  2. linux内置usb3.0驱动,基于嵌入式Linux的USB3.0视频驱动的改进
  3. [深入理解Android卷二 全文-第八章]深入理解ContentService和AccountManagerService
  4. zigbee CC2530 系列教程 7 串口数据收发实验
  5. springboot——图片添加文字水印
  6. Spring Boot 引入jar 包中的 controller
  7. zzulioj 1825: 会长爱数学 (求循环节)
  8. sql查询两个表结果相减_sql子查询两个表的数据相减
  9. 计算机网络系列(十)dns域名解析系统
  10. 大规模中文文本处理中的自动切词和标注技术