Python爬取酷我音乐

一、调试

首先进入酷我音乐官网,F12打开开发者工具,搜素歌曲,找到如下图的链接:

完整链接如下:https://kuwo.cn/api/www/search/searchMusicBykeyWord?key=%E5%BA%90%E5%B7%9E%E6%9C%88&pn=1&rn=30&httpsStatus=1&reqId=a1622200-b009-11ec-94e3-c9fc163ba367
以上key=歌曲名pn=页面数rn=单页面歌曲数,其他的不用管。
如果直接访问此链接会提示403,是因为没有传入请求头信息,暂时先不用管,继续下一步,点开一首歌,如图:

完整链接如下:https://kuwo.cn/api/v1/www/music/playUrl?mid=624579&type=music&httpsStatus=1&reqId=bcb73d91-b015-11ec-a5ec-5ba7534fa314

直接访问此链接可获得一条json数据,url便是歌曲直链:{"code":200,"msg":"success","reqId":"3a20834adfdf10de8ed0a0bc45c785dd","data":{"url":"https://ci-sycdn.kuwo.cn/0862adf5d9eeca5b7aa5b0ff64f74a81/624434d0/resource/n1/95/51/2479305406.mp3"},"profileId":"site","curTime":1648637148141,"success":true}

分析如上完整链接,可以知晓mid是决定不同歌曲的参数,因此,只需获取歌曲对应的mid参数,便可获得歌曲直链的json数据。
如何获取歌曲mid呢?这就要看在第一步中歌曲列表的链接了,经过查询,可知歌曲列表中的rid便是歌曲json数据中的mid:

现在基本的路线已经清楚了,接下来就是爬取数据了。

二、爬取

首先,歌曲列表链接是无法直接访问的,因此,需要传入请求头参数,经过测试,请求头只需CookiecsrfReferer
请求头都可以在以下页面获取:

首先安装第三方库:requests 方法Win+R打开cmd窗口,输入pip install requests回车。

1.获取歌曲列表

# 键盘输入歌曲名
kw = '庐州月'

# 歌曲列表信息链接
url = f'https://kuwo.cn/api/www/search/searchMusicBykeyWord?key={kw}&pn=1&rn=30&httpsStatus=1&reqId=a1622200-b009-11ec-94e3-c9fc163ba367'

# 请求头
headers = {
    'Cookie':'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1648629490; _ga=GA1.2.409316159.1648629490; _gid=GA1.2.1021303329.1648629490; _gat=1; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1648630329; kw_token=2EBX1R5WO8Z',
    'csrf':'2EBX1R5WO8Z',
    'Referer':'https://kuwo.cn/'
}

# 访问链接,并返回json数据
response = requests.get(url=url, headers=headers).json()

# 歌曲列表信息
music_list = response['data']['list']

2.获取歌曲直链

# 选择下载第几首
num = 1

# 要下载的歌曲mid
mid = music_list[num-1]['rid']

# 歌曲json数据链接
api = f'https://kuwo.cn/api/v1/www/music/playUrl?mid={mid}&type=convert_url3&br=320kmp3'

# 访问链接,返回json数据
response_api = requests.get(url=api).json()

# 获取歌曲直链
link = response_api['data']['url']

直接访问歌曲直链便可下载歌曲。

完整代码

# 导入模块
import requests
import os

# 键盘输入歌曲名
kw = input('请输入歌名:')

# 歌曲列表信息链接
url = f'https://kuwo.cn/api/www/search/searchMusicBykeyWord?key={kw}&pn=1&rn=30&httpsStatus=1&reqId=a1622200-b009-11ec-94e3-c9fc163ba367'

# 请求头
headers = {
    'Cookie':'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1648629490; _ga=GA1.2.409316159.1648629490; _gid=GA1.2.1021303329.1648629490; _gat=1; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1648630329; kw_token=2EBX1R5WO8Z',
    'csrf':'2EBX1R5WO8Z',
    'Referer':'https://kuwo.cn/'
}

# 访问链接,并返回json数据
response = requests.get(url=url, headers=headers).json()

# 歌曲列表信息
music_list = response['data']['list']

# 遍历歌曲列表信息
for i in range(len(music_list)):
    # 歌手
    artist = music_list[i]['artist']
    # 歌曲
    name = music_list[i]['name']
    # rid(mid)
    rid = music_list[i]['rid']
    # 打印列表信息
    print(f'{i+1} {name} - {artist} id={rid}')

# 选择下载第几首
num = int(input('下载第几首:'))

# 要下载的歌曲信息
singer = music_list[num-1]['artist']
song = music_list[num-1]['name']
mid = music_list[num-1]['rid']

# 歌曲json数据链接
api = f'https://kuwo.cn/api/v1/www/music/playUrl?mid={mid}&type=convert_url3&br=320kmp3'

# 访问链接,返回json数据
response_api = requests.get(url=api).json()

try:
    # 获取歌曲直链
    link = response_api['data']['url']

    # 创建文件夹
    kw_file = os.path.exists('酷我')  # 判断文件夹是否存在
    if kw_file is True:
        pass
    else:
        kw_file = os.getcwd()
        os.mkdir(kw_file + '/酷我')

    # 访问直链
    response_down = requests.get(url=link).content

    # 下载歌曲
    with open(f"酷我/{song} - {singer}.mp3", 'wb') as kw:
        kw.write(response_down)
        print('下载成功!')

except:
    print('链接获取失败')

—— 本页内容已结束,喜欢请分享 ——
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 共5条

请登录后发表评论

    • 头像小霸王0