zoukankan      html  css  js  c++  java
  • python爬取酷我音乐(收费也可)

    第一次创作,请多指教

    环境:Python3.8,开发工具:Pycharm

    第三方库:requests

    详细

    进入酷我音乐的网站到搜索界面

    在这里插入图片描述
    输入歌名进去打开开发者工具会发现这个包

    在这里插入图片描述
    它里面包含了这一页的音乐数据,我们需要的是这个参数

    在这里插入图片描述
    然后开始写代码吧,先找到所需的音乐数据

    import requests
    import json
    import os
    
    def music_download():
        kw = input("请输入音乐名称:")
        # 请求头
        headers = {xian
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63",
            "Cookie":"_ga=GA1.2.1083049585.1590317697; _gid=GA1.2.2053211683.1598526974; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1597491567,1598094297,1598096480,1598526974; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1598526974; kw_token=HYZQI4KPK3P",
            "Referer": "http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6",
            "csrf": "HYZQI4KPK3P",
        }
        # 参数列表
        params = {
            "key": kw,
            # 页数
            "pn": "1",
            # 音乐数
            "rn": "10",
            "httpsStatus": "1",
            "reqId": "cc337fa0-e856-11ea-8e2d-ab61b365fb50",
        }
        # 创建列表,后面下载需要
        music_list = []
        url = "http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?"
        res = requests.get(url = url,headers = headers,params = params)
        res.encoding = "utf-8"
        text = res.text
        # 转成json数据
        json_list = json.loads(text)
        # 发现data中list是存主要数据的地方
        datapack = json_list["data"]["list"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    接下来是重要的地方

    先随便试听一首音乐,找到他的json数据

    在这里插入图片描述
    我们发现这个json数据里含有.mp3的链接,这就是音乐文件

    复制他的url,进去看是一个接口

    在这里插入图片描述
    他的url有规律,之前我们提取的rid参数就起了作用,把它复制到链接里,这里看代码吧

    # 遍历拿到所需要的数据,音乐名称,歌手,id...
    for i in datapack:
        # 音乐名
        music_name = i["name"]
        # 歌手
        music_singer = i["artist"]
        # 待会需要的id先拿到
        rid = i["rid"]
        # 随便试听拿到一个音乐的接口,这是的rid就用得上了
        api_music = "http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3" 
                    "&br=128kmp3&from=web&t=1598528574799&httpsStatus=1" 
                    "&reqId=72259df1-e85a-11ea-a367-b5a64c5660e5".format(rid)
        api_res = requests.get(url = api_music)
        # 打印发现真实的url确实在里面
        # print(api_res.text)
        music_url = json.loads(api_res.text)["url"]
        # 大功告成,试试效果
        print(music_name)
        print(music_singer)
        print(music_url)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    顺便写了个方便下载的功能

     # 在此之前先创建列表
     music_list = []
    
    • 1
    • 2
    函数体内建一个字典方便保存歌名与音乐数据
    # 把数据存到字典方便下载时查找
    music_dict = {}
    music_dict["name"] = music_name
    music_dict["url"] = music_url
    music_dict["singer"] = music_singer
    music_list.append(music_dict)
    # 看看真实数据数量
    print(len(music_list))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    遍历之前的列表数据进行判断,利用索引找到指定的url

    # 下载
    xiazai = input("输入要下载的音乐名称:")
    # 下载位置
    root = 'E://下载的music//'
    # 每个字典里有name和url
    for i in range(len(music_list)):
        try:
            if xiazai == music_list[i]["name"]:
                # 创建文件夹
                if not os.path.exists(root):
                    os.mkdir(root)
                # 拿到字典中对应的音乐url数据
                music_content = requests.get(url = music_list[i]["url"]).content
                with open(root + "{}.mp3".format(music_list[i]['name']),"wb") as f:
                    f.write(music_content)
                    print("下载成功")
        except:
            print("下载失败")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    然后就可以愉快的下载付费音乐啦

    完整代码

    import requests
    import json
    import os
    
    def music_download():
        kw = input("请输入音乐名称:")
        # 请求头
        headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63",
            "Cookie":"_ga=GA1.2.1083049585.1590317697; _gid=GA1.2.2053211683.1598526974; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1597491567,1598094297,1598096480,1598526974; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1598526974; kw_token=HYZQI4KPK3P",
            "Referer": "http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6",
            "csrf": "HYZQI4KPK3P",
        }
        # 参数列表
        params = {
            "key": kw,
            # 页数
            "pn": "1",
            # 音乐数
            "rn": "10",
            "httpsStatus": "1",
            "reqId": "cc337fa0-e856-11ea-8e2d-ab61b365fb50",
        }
        # 创建列表,后面下载需要
        music_list = []
        url = "http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?"
        res = requests.get(url = url,headers = headers,params = params)
        res.encoding = "utf-8"
        text = res.text
        # 转成json数据
        json_list = json.loads(text)
        # 发现data中list是存主要数据的地方
        datapack = json_list["data"]["list"]
        # 遍历拿到所需要的数据,音乐名称,歌手,id...
        for i in datapack:
            # 音乐名
            music_name = i["name"]
            # 歌手
            music_singer = i["artist"]
            # 待会需要的id先拿到
            rid = i["rid"]
            # 随便试听拿到一个音乐的接口,这是的rid就用得上了
            api_music = "http://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3" 
                        "&br=128kmp3&from=web&t=1598528574799&httpsStatus=1" 
                        "&reqId=72259df1-e85a-11ea-a367-b5a64c5660e5".format(rid)
            api_res = requests.get(url = api_music)
            # 打印发现真实的url确实在里面
            # print(api_res.text)
            music_url = json.loads(api_res.text)["url"]
            # 大功告成,试试效果
            print(music_name)
            print(music_singer)
            print(music_url)
            # 把数据存到字典方便下载时查找
            music_dict = {}
            music_dict["name"] = music_name
            music_dict["url"] = music_url
            music_dict["singer"] = music_singer
            music_list.append(music_dict)
        # 看看真实数据数量
        print(len(music_list))
        # 下载
        xiazai = input("输入音乐名称:")
        # 下载位置
        root = 'E://下载的music//'
        for i in range(len(music_list)):
            try:
                if xiazai == music_list[i]["name"]:
                    # 创建文件夹
                    if not os.path.exists(root):
                        os.mkdir(root)
                    # 拿到字典中对应的音乐url数据
                    music_content = requests.get(url = music_list[i]["url"]).content
                    with open(root + "{}({}).mp3".format(music_list[i]['name'],music_list[i]['singer']),"wb") as f:
                        f.write(music_content)
                        print("下载成功")
            except:
                print("下载失败")
    if __name__ == "__main__":
        music_download()
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    运行结果

    在这里插入图片描述

    本文首发于python黑洞网,博客园同步更新

  • 相关阅读:
    oracle基本语句
    SVM入门(六)线性分类器的求解——问题的转化,直观角度
    深入浅出KMeans算法
    SVM入门(三)线性分类器Part 2
    SVM入门(一)SVM的八股简介
    Hadoop源代码分析(五)
    用HTML5 Audio API开发游戏音乐
    Hadoop源代码分析(六)
    SVM入门(四)线性分类器的求解——问题的描述Part1
    SVM入门(二)线性分类器Part 1
  • 原文地址:https://www.cnblogs.com/pythonzhilian/p/13594091.html
Copyright © 2011-2022 走看看