Python爬虫:运用json数据爬取酷我音乐

Python爬虫:运用json数据爬取酷我音乐

前言

前两天听了一下酷我音乐官网的音乐,觉得上面的音乐还不错,想把他们爬取得到。开始,完全没有头绪,但是,最后有了实现它的思路,那就是通过两个json文件最终得到想听的音乐。

讲明一下:

@

1.需要的Python模块

实现这个过程的主要模块有requests、json、urllib.request、urllib.parse
其中,requests模块用于请求得到相应的数据(这里是得到json数据),json模块用于对得到的json数据进行处理(将json数据转换成字典,主要使用json.loads()方法),urllib.request(使用其urlretrieve()方法,用于下载音乐),urllib.parse(使用其quote()方法,用于对输入的字符串进行编码)。

2.实现思路

首先,我们需要来到酷我音乐的官网,酷我音乐
在输入框中输入关键字,小编输入的是: 破茧
然后回车,可以得到搜索相应的歌曲列表,然而这些数据都是动态加载的,使用requests模块如果直接请求这个网址,根本不可能得到这些数据,这个时候我们可以按电脑键盘F12,来到开发者模式,点击Network下面的XHR,找到这些歌曲列表的那个网址,具体为:
在这里插入图片描述
在这里插入图片描述
我们需要得到这些歌曲中相应的数据如下
在这里插入图片描述
其中name和artist关键字对应的值为展示用和最终.mp3文件名称,rid关键字对应的值是为后面过程所用。
当然,访问这个网址不是很简单的,需要添加请求头。
参考代码如下:

musicName=input('请输入歌曲名称:')
encodName=quote(musicName)
url='https://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={}&pn=1&rn=30&httpsStatus=1'.format(encodName)
referer='https://www.kuwo.cn/search/list?key={}'.format(encodName)
# 请求头
headers = {
    "Cookie": "_ga=GA1.2.2021007609.1602479334; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1602479334,1602673632; _gid=GA1.2.168402150.1602673633; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1602673824; kw_token=5LER5W4ZD1C",
    "csrf": "5LER5W4ZD1C",
    "Referer": "{}".format(referer),
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",
}
response=requests.get(url=url,headers=headers)
dict2=json.loads(response.text)
misicInfo=dict2['data']['list']  # 歌曲信息的列表
musicNames=list()   # 歌曲名称的列表
rids=list()    # 存储歌曲rid的列表
for i in range(len(misicInfo)):
    name=misicInfo[i]['name']+'-'+misicInfo[i]['artist']
    musicNames.append(name)
    rids.append(misicInfo[i]['rid'])
    print('【{}】-{}->>>{}'.format(i+1,int(random.random()*10)*'#$',name))

我们选择上面列表中歌曲进行试听,可以发现,在刚才那个下面有一个这样的网址,里面也是一个json数据,放有我试听歌曲的下载链接。
如下:
在这里插入图片描述
对这个网址进行分析可以得知,需要刚才我们的那个 rid 数据才能访问到相应的json数据。
网址为:
http://www.kuwo.cn/url?format=mp3&rid=140897945&response=url&type=convert_url3&br=128kmp3&from=web&t=1603463521198&httpsStatus=1
也许读者得到的那个网址长度比我这个长一些,我这个是去掉最后面的那个参数的,因为我发现没有最后的那个参数,依旧可以访问到相应的数据。

3.最终代码和运行结果

参考代码如下:

from urllib.request import urlretrieve
from urllib.parse import quote
import requests
import random
import json


musicName=input('请输入歌曲名称:')
encodName=quote(musicName)
url='https://www.kuwo.cn/api/www/search/searchMusicBykeyWord?key={}&pn=1&rn=30&httpsStatus=1'.format(encodName)
referer='https://www.kuwo.cn/search/list?key={}'.format(encodName)
# 请求头
headers = {
    "Cookie": "_ga=GA1.2.2021007609.1602479334; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1602479334,1602673632; _gid=GA1.2.168402150.1602673633; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1602673824; kw_token=5LER5W4ZD1C",
    "csrf": "5LER5W4ZD1C",
    "Referer": "{}".format(referer),
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36",
}
response=requests.get(url=url,headers=headers)
dict2=json.loads(response.text)
misicInfo=dict2['data']['list']  # 歌曲信息的列表
musicNames=list()   # 歌曲名称的列表
rids=list()    # 存储歌曲rid的列表
for i in range(len(misicInfo)):
    name=misicInfo[i]['name']+'-'+misicInfo[i]['artist']
    musicNames.append(name)
    rids.append(misicInfo[i]['rid'])
    print('【{}】-{}->>>{}'.format(i+1,int(random.random()*10)*'#$',name))

id=int(input('请输入歌曲序号:'))
musicRid=rids[id-1]

url2='https://www.kuwo.cn/url?format=mp3&rid={}&response=url&type=convert_url3&br=128kmp3&from=web&t=1602674521838&httpsStatus=1'.format(musicRid)
headers2={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"}
response2=requests.get(url=url2,headers=headers2)
dict3=json.loads(response2.text)
downloadUrl=dict3['url']
path=input('请输入存储路径:')
urlretrieve(url=downloadUrl,filename=path+'\{}.mp3'.format(musicNames[id-1]))  # 下载歌曲

运行结果:
读者可以看看我在B站上的一个视频,上面有实现这个的整个过程,视频链接为:
运用Python爬虫下载酷我音乐
在这里插入图片描述
在这里插入图片描述
找到相应的目录,可以发现在这个文件夹下面多了一个.mp3文件
在这里插入图片描述

4.总结

首先,小编先声明一下:本程序参考代码仅供学习,切莫用于商业活动,一经被相关人员发现,本小编概不负责!
另外,需要指明的是希望读者一天不要多次运行本程序代码,从而减少服务其负担。
程序代码或许还有一定的不足!没有详细地分析这两个网址中的参数,读者有兴趣的话,可以尝试尝试。如果读者觉得小编的这篇文章还不错!离开的时候别忘了点上一个小小的赞!

posted @ 2021-08-19 15:56  坚持不懈的大白  阅读(1906)  评论(0编辑  收藏  举报
@format