python-从酷狗下载爬取自己想要的音乐-可以直接拿来体验哟

因为最近发现咪咕音乐版权好多,当时我就在想是不是可以爬取下来,然后花了一些时间,发现有加密,虽然找到了接口,但是只能手动下载VIP歌曲,对于我们学IT的人来说,这是不能忍的,于是就懒得去解密抓取了,但是偶然的情况下,一个朋友说发现酷狗没加密,我兴奋的去看了看,果然,然后大概分析了一下,可以完成我想要抓取的那个程序,好了,废话不多说,上干货

我打包成了exe程序,只要有电脑就可以运行,下载你想要听的歌曲,不过有些版权没有,和未知bug,可能有些歌曲不能下载,毕竟还是有些不足的

群里面都是一群爱学习的大佬,各专业大佬,想学习交流的小伙伴一起来学习吧,让我们赢取白富美,走向人生巅峰

一:我想要的是一个搜索接口,根据自己想要下载的歌曲来抓取数据

在这里插入图片描述
在这里插入图片描述

打开这个包我们可以得到我们想要的结果,找到了search_url ,我们可以先拿下来,稍后做分析

Request URL:https://songsearch.kugou.com/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.com/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.com/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的 ,肯定不会忘记分享,分享程序员圈子的的一大亮点,自己平时也在其中学到知识,现在也该到我来分享分享了

写这篇文章,只是拿来分享,肯定会有一些不足的地方,因为我自己也是学生,小白起步阶段,有什么不足的地方也希望大佬们来指导指导,也希望大家一起相互学习交流

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值