python爬虫小作业

酷我音乐

本篇博客旨在提供一个能够利用代码下载酷我音乐上免费音乐,并不能下载付费音乐哦!!!

老铁,让我们开始今天的博客之旅吧!!!

搜索框的url如下,

https://www.kuwo.cn/search/list?key=%E5%BC%A0%E9%9F%B6%E6%B6%B5

对该网站进行抓包分析,我们发现一个包含音乐基本信息的包,具体内容如下,
在这里插入图片描述

其对应url如下,
在这里插入图片描述

注意,请求该url伪造头必须带上cookie与csrf字段(这两个字段具有时效性),否则爬不到数据。
对该url进行请求,得到的数据是json类型
在这里插入图片描述

对该json数据进行分析提取,获取到关键数据(歌曲id)以及其他描述信息

在这里插入图片描述

然后我们继续抓包分析,发现包含歌曲真正url的数据包:
在这里插入图片描述

其对应url如下,
在这里插入图片描述

对该url请求参数进行分析,
在这里插入图片描述

发现不同音乐的请求参数,仅仅只有mid不同而已(reqid参数略有不同,但不影响)。而mid我们前面也已经得到了,因此可以构造获得音乐真正url的url地址。
在这里插入图片描述

然后对该网址进行请求,并使用正则表达式对该网址进行提取,
在这里插入图片描述

最后下载相应音乐,

最终执行结果如下,
在这里插入图片描述
至此,大功告成!
下面是具体代码实现:

import urllib.parse
import re
import requests

headers_1 = {
    
    
    'cookie': '_ga=GA1.2.1350961281.1642257590; _gid=GA1.2.312608794.1647150956; _gat=1; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1646828749,1647150956,1647185710; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1647185710; kw_token=XEA9HSGTRS',
    'Host': 'www.kuwo.cn',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
    'csrf': 'XEA9HSGTRS'
}

headers_2 = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
}


class KuwoSpider():
    def __init__(self):
        self.__name = ''
        self.__index = 0
        self.__flag = 1
        self.__song_urls = ''
        self.song_infos = []

    def get_music_infos(self, name):
        self.__flag -= 1
        if self.__flag < 0:
            self.song_infos.clear()
            self.__flag = 0

        self.__name = name
        music_name = urllib.parse.quote(self.__name)
        search_url = f'https://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={music_name}&pn=1&rn=30&httpsStatus=1&reqId=5bf43991-9fb2-11ec-9893-736ed75cec4b'
        refer = {
    
    'Referer': f'http://www.kuwo.cn/search/list?key={music_name}'}     # 伪造头部的一个参数,动态变化
        headers_1.update(refer)
        res_1 = requests.get(url=search_url, headers=headers_1)
        json_data = res_1.json()
        i = 1
        lists = json_data["data"]["list"]
        for list_ in lists:
            rid = list_["rid"]
            name = list_["name"]
            artist = list_["artist"]
            self.song_infos.append((i, name, artist, rid))
            i += 1

    def print_music(self):
        for num, name_, artist, _ in self.song_infos:
            print(num, name_, artist)

    def donwnload(self, index):
        self.__index = index
        _, name_, _, music_id = self.song_infos[self.__index - 1]
        music_url = f'https://www.kuwo.cn/api/v1/www/music/playUrl?' \
                    f'mid={music_id}&type=music&httpsStatus=1&reqId=7cba4520-9fb2-11ec-a798-f980ededc0dc'
        res = requests.get(music_url, headers=headers_1).text
        self.__song_urls = re.findall('"url":"(.*?)"', res)[0]
        # print(self.__song_urls)
        content = requests.get(url=self.__song_urls, headers=headers_2).content
        with open(f'{name_}.mp3', 'wb') as f:
            print('正在下载中...')
            f.write(content)
            print(f'{name_}    下载成功  ')


if __name__ == '__main__':
    kuwo = KuwoSpider()
    print('请输入歌曲或歌手名字:', end='')
    name = input()
    kuwo.get_music_infos(name)
    kuwo.print_music()
    print('请输入下载的歌曲序号:  ', end='')
    index = int(input())
    kuwo.donwnload(index)

声明,本篇博客仅供参考学习,不支持其他任何用途。

猜你喜欢

转载自blog.csdn.net/weixin_51480590/article/details/123482172