admin管理员组文章数量:1650969
因为最近发现咪咕音乐版权好多,当时我就在想是不是可以爬取下来,然后花了一些时间,发现有加密,虽然找到了接口,但是只能手动下载VIP歌曲,对于我们学IT的人来说,这是不能忍的,于是就懒得去解密抓取了,但是偶然的情况下,一个朋友说发现酷狗没加密,我兴奋的去看了看,果然,然后大概分析了一下,可以完成我想要抓取的那个程序,好了,废话不多说,上干货
我打包成了exe程序,只要有电脑就可以运行,下载你想要听的歌曲,不过有些版权没有,和未知bug,可能有些歌曲不能下载,毕竟还是有些不足的
群里面都是一群爱学习的大佬,各专业大佬,想学习交流的小伙伴一起来学习吧,让我们赢取白富美,走向人生巅峰
一:我想要的是一个搜索接口,根据自己想要下载的歌曲来抓取数据
打开这个包我们可以得到我们想要的结果,找到了search_url ,我们可以先拿下来,稍后做分析
Request URL:https://songsearch.kugou/song_search_v2?callback=jQuery112403044970993079412_1583928714071&keyword=%E5%B9%B4%E5%B0%91%E6%9C%89%E4%B8%BA&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1583928714073
这个url里面,经过各种调试,可以得出一些结论,
callback=jQuery112403044970993079412_1583928714071:这一个东西用来提高搜索结果准确度的
keyword=%E5%B9%B4%E5%B0%91%E6%9C%89%E4%B8%BA:这个就是我们搜索框的关键字
page=1:就是第一页
pagesize=30:就是搜索结果返回30条数据
_=1583928714073:这个参数是必须带上的,不然请求会失败
其余的好像去了也可以,也没出什么问题,但是带上也没关系,不会有害处
所以我们可以构建自己的search_url,更具关键字自己调就好
二:构建好search_url后,我们回到播放页
请求url里面有hash,hash基本作为唯一标识,果然,把这个hash换成别的歌曲的hash就跳转到对应的歌曲
然后返回的数据,
lyrics:就是歌词,
play_url:就是歌曲播放源地址
三:接下来就是解析数据,把数据清洗出来就行了,构建play_url
我就是这么分析,然后就着手写代码,嗯嗯,没得问题
四:然后基本架构就是这样
五:运行结果如下
源代码:
import requests
import json
import os
import tkinter
from tkinter import messagebox,font
# 定义歌曲下载类
class Download():
headers = {
'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',
}
def __init__(self):
# 窗口搭建
windown = tkinter.Tk()
windown.title('donmo下载歌曲')
windown.geometry('500x400')
windown.resizable(width=False,height=False)
# 标签
label_message1 = tkinter.Label(windown,text='警告:本程序仅供学习交流,请勿违法行为,后果自负',font='华文隶书',fg='red')
label_message2 = tkinter.Label(windown, text=' 请按格式输入,不然找不到你想要的版本', font='华文隶书')
label_message3 = tkinter.Label(windown, text=' 输入格式:李荣浩 - 年少有为', font= '华文隶书')
label_message1.pack(side='top', pady=40)
label_message2.pack(side='top',pady=10)
label_message3.pack(side='top',pady=10)
# 输入框
self.input_name = tkinter.Entry(windown,width=35,font= '华文隶书')
self.input_name.pack(side='top',pady=10)
# 按钮
btn = tkinter.Button(windown,text='搜索',font= '华文隶书',command=self.down)
btn.pack(side = 'top',pady=20,ipady=10,ipadx=120,)
label_qun = tkinter.Label(windown, text=' 学习交流群&程序下载:924776571', font='华文隶书',fg='red')
label_qun.pack(side='top',pady=20)
windown.mainloop()
# 发送请求获取响应
def get_info(self,url):
return requests.get(url=url, headers=self.headers)
# 输入要搜索的歌曲和歌手,这样找到你想要的歌曲准确度高一些,得到歌曲的 hash值,后面需要用到
def get_hash(self):
name_singer = self.input_name.get()
# 构建搜索url,这里我设置返回结果是15条
search_url = 'https://songsearch.kugou/song_search_v2?callback=jQuery11240318739477178112_1583839575037&keyword=' + name_singer + '&page=1&pagesize=15&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1583839575039'
# 解析返回的json数据,取到 歌曲的 hash值
response = self.get_info(search_url)
# 将json数据转成python类型,这里把前缀和后缀给切掉,换成json转字典得格式,便于转化
songinfo = response.text.replace('jQuery11240318739477178112_1583839575037(', '')[:-2]
songinfo = json.loads(songinfo)
# 解析数据
data = songinfo['data']
lists = data['lists']
# 这里可以选择需要下载得类型,不过后面我有一个需求,所以我选择下载热度第一首,可自行选择
# 我这里用户输入得关键字,与filename 相匹配,匹配上则筛选出用户想要得版本,考虑到翻唱好听的
for item in lists:
FileName = item['FileName']
# 这里判断是否和用户输入的一样
if name_singer == FileName:
return item['FileHash'], FileName
# 与用户输入的不相等 默认返回第一个
hash = data['lists'][0]['FileHash']
# 这里对数据进行修改 : 鱼大仙 - <em>我曾</em>,是这样的
filename = data['lists'][0]['FileName']
FileName = FileName.replace(' ', '').replace('<em>', '').replace('</em>', '')
return hash, FileName
# 得到了歌曲hash,构建歌曲源地址请求url,得到播放源,并下载
def get_song(self,hash):
# 这里mid参数,我也不知道有什么作用,但是必须带上,不然请求得不到数据
song_url = 'https://wwwapi.kugou/yy/index.php?r=play/getdata&hash=' + hash + '&mid=0bfd8d07f43f36898c1d68bd2f657099'
response = self.get_info(song_url)
# 解析数据
data = json.loads(response.text)['data']
# 歌词
lyrics = data['lyrics']
# 播放地址
play_url = data['play_url']
return lyrics, play_url
# 歌词,歌曲写入文件
def download(self,songname, lyrics, play_url):
path = 'donmo下载歌曲/' + songname
# 创建一个文件夹
if not os.path.exists(path):
os.makedirs(path)
filename = os.path.join(path, songname + '.txt')
song = os.path.join(path, songname + '.mp3')
with open(filename, 'w', encoding='utf-8') as fp:
fp.write(lyrics)
fp.close()
with open(song, 'wb') as fp:
data = self.get_info(play_url).content
fp.write(data)
fp.close()
print('下载成功!!!!!!!!')
def down(self):
try:
hash, filename = self.get_hash()
lyrics, play_url = self.get_song(hash)
self.download(self.input_name.get(), lyrics, play_url)
messagebox.showinfo('下载成功!!!路径为当前目录')
except:
messagebox.showinfo('下载失败,请重新加载!!!')
if __name__ == '__main__':
Download()
六:最后,学IT的 ,肯定不会忘记分享,分享程序员圈子的的一大亮点,自己平时也在其中学到知识,现在也该到我来分享分享了
写这篇文章,只是拿来分享,肯定会有一些不足的地方,因为我自己也是学生,小白起步阶段,有什么不足的地方也希望大佬们来指导指导,也希望大家一起相互学习交流
版权声明:本文标题:python-从酷狗下载爬取自己想要的音乐-可以直接拿来体验哟 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729548006a1205873.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论