前端时间写过一个糙版本的脚本,没什么技术含量,主要是下载自己唱的和喜欢的歌手的歌曲,方便在本地较为简单的播放和切换,仅供学习,不要商用,转载请标明出处;
非常感谢@无缘止水(https://me.csdn.net/weixin_40517628)在评论区提供的地址
from urllib import request
import re
import os
import json
import requests
import string
from loguru import logger
#获取个人主页地址
def getPeopleHomeIndexAddress(uid):
url = "https://kg.qq.com/node/personal?uid="+uid
return url
#获取该用户音乐列表地址
def getSongListUrl(uid):
song_list_url = "https://node.kg.qq.com/cgi/fcgi-bin/kg_ugc_get_homepage?jsonpCallback=callback_0&inCharset=GB2312&outCharset=utf-8&format=&g_tk=5381&g_tk_openkey=719182536&nocache=0.8706501019187272&share_uid="+uid+"&type=get_uinfo&_=1551533068931&num=15&start=";
return song_list_url
#获取歌曲列表json
def getMusiccLists(song_list_url,start):
print(song_list_url+str(start))
html = request.urlopen(song_list_url+str(start)).read().decode('utf-8')
data = re.findall(r'(?s)[(](.*)[)]', html)#获取页面中数据json,处理有点糙,不过能用哈
data = json.loads(data[0])['data']
# ugclists = data['ugclist']
return data
#下载操作
def download(title,data_url,file):
logger.info("正在下载...歌曲名称:"+title)
logger.info("正在下载...网络地址:"+data_url)
logger.info("正在下载...本地地址:"+file)
response = requests.get(data_url)
with open(file, "wb") as f:
f.write(response.content)
#开始获取音乐
def doGetInfo(ugclists,nickname):
for ugclist in ugclists:#json.loads把字符串转json,以前没使过Python,这里好像说是什么dict的,也就是key=>value的数据格式,很好理解
print(ugclist['shareid'])#这个数据很关键是每首曲子的id值
print(ugclist['title'])#每首歌的名字
title = ugclist['title']
title = title.translate(str.maketrans('', '', string.punctuation))
shareid = ugclist['shareid']
data_url = "http://cgi.kg.qq.com/fcgi-bin/fcg_get_play_url?shareid=" + shareid #通过解析获取到的文件地址及拼接形式,也就是这个曲子的文件下载地址
# 设置保存歌曲的路径,否则会保存到程序当前路径
path = r'media\\QMKG\\'+ nickname +'\\' # 路径前的r是保持字符串原始值的意思,就是说不对其中的符号进行转义
file = path + title + "(" + ugclist['ksong_mid'] + ")" + '.m4a'
is_set_dir = os.path.exists(path)
if is_set_dir == False:
os.makedirs(path) #多层创建目录
is_set = os.path.exists(file)#这里做了简单的文件存在与否的判断,这样以后再执行,文件不会丢失或增多,或覆盖或重复爬取
# 如果文件存在则跳过
if is_set == False:
download(title,data_url,file)
def main(uid):
song_list_url = getSongListUrl(uid)
start = 1;
while start<=50:
data = getMusiccLists(song_list_url,start)
doGetInfo(data['ugclist'],data['nickname'])
start +=1
if __name__ == '__main__':
uid = "609c9a8d2729378330"#我的
main(uid)