0x01注意点
标准json字符串用json.loads(result) 转化,里面好多冒号,并且是双引号可以在线简单观察https://www.json.cn/
单引号不是标准json
这决定了处理方式的不同
loads是双引号转字典的方式,eval是单引号的转字典方式
hot_songs = json.loads(result)
songs=eval(music_list)
0x02使用简介
name_list里面填进去歌手名字, download_music函数将会下载音乐。
原理是听的时候获取到的链接,所以音质不是太高。下载的音乐是aac格式音乐播放器即可打开。
会下载到./music/歌手名 目录下
name_list=["林俊杰"]
for name in name_list:
download_music(name)
这个错误是因为网络原因,要么本地网络不通要么ip已经被封了
ConnectionResetError: [Errno 104] Connection reset by peer
0x03代码
# -*- coding:utf-8 -*-
import requests
import time
import urllib
import os
def get(url):
response=requests.get(url)
response.encoding=response.apparent_encoding
return response.text
#通过歌手名字搜索歌单 歌手名字,当前页码(从0开始),rn表示每页展示多少条
def search_by_name(name,pn=0,rn=100):
url="https://search.kuwo.cn/r.s?pn="+str(pn)+"&rn="+str(rn)+"&all="+name+"&ft=music&newsearch=1&alflac=1&itemset=web_2013&client=kt&cluster=0&vermerge=1&rformat=json&encoding=utf8&show_copyright_off=1&pcmp4=1&ver=mbox&plat=pc&vipver=MUSIC_9.0.2.0_PQ&devid=51016591&newver=1"
music_list=get(url)
songs=eval(music_list)['abslist']
for song in songs:
# 在网页中表示空格
song_name=song["SONGNAME"].replace(" "," ")
song_id=song["MUSICRID"].replace("MUSIC_","")
yield song_name,song_id
#单引号不是标准json
#标准json字符串用json.loads(result) 转化,里面好多:并且是双引号
# result = music_list
# hot_songs = json.loads(result)["hotsong"] # 字符串转字典
# for hot_song in hot_songs:
# song_name = hot_song["name"]
# print(song_name)
yield song_name
#根据歌手名称获取下载地址
def search_by_music(song_id):
url="http://antiserver.kuwo.cn/anti.s?rid=MUSIC_"+song_id+"&format=aac|mp3&type=convert_url&response=url"
print(url)
return get(url)
#根据歌名搜歌词
def search_lirycs_name(song_id):
url="http://www.kuwo.cn/play_detail/"+song_id
return get(url)
def download_music(name="林俊杰"):
path="./music/"+name
music_names=search_by_name(name)
for name in music_names:
os.makedirs(path,exist_ok=True)
song_url=search_by_music(name[1])
# song_lirycs=search_lirycs_name(name[1])
print(name[0],song_url)
urllib.request.urlretrieve(song_url, path +"/"+ name[0]+".aac")
if __name__=="__name__":
name_list=["林俊杰"]
for name in name_list:
download_music(name)