獲取網易雲音樂歌單-我喜歡的音樂-歌手與其歌曲數量

import os
import pandas as pd
import sqlite3
import json
import sys
from collections import defaultdict


# %localappdata%/Netease/CloudMusic/Library

def get_file_path():
    dir_path = os.getenv('localappdata')
    child_path = '/Netease/CloudMusic/Library'.split('/')
    file_name = 'webdb.dat'
    file_path = os.path.join(dir_path, *child_path, file_name)
    return file_path


def get_result(file_path, pid='373649554'):
    conn = sqlite3.connect(file_path)

    sql_result = conn.execute(f"""select b.track from web_playlist_track a

    left join web_track b

    on a.tid = b.tid

    where a.pid = '{pid}'""")

    data = sql_result.fetchall()
    json_data = [json.loads(i[0]) for i in data if i[0]]

    result2 = defaultdict(list)
    for i in json_data:
        music_name = i['name']
        for j in i['artists']:
            people_name = j['name']
            result2[people_name].append(music_name)
    result_num = [(i, len(j)) for i, j in result2.items()]
    t = sorted(result_num, key=lambda x: x[1], reverse=True)
    return t


def main(num):
    file_path = get_file_path()
    result = get_result(file_path)
    print(result[:num])


def get_num():
    num_ = 30 if len(sys.argv) == 1 else int(sys.argv[1])
    return num_


if __name__ == '__main__':
    num = get_num()
    main(num=num)

最後大致輸出如下:

In [42]: print(t[:30])
[('林俊杰', 18), ('張學友', 16), ('Alan Walker', 16), ('Backstreet Boys', 13), (
'趙雷', 13), ('許嵩', 12), ('陳奕迅', 11), ('張國榮', 10), ('周華健', 9), ('Char
lie Puth', 9), ('王力宏', 9), ('Westlife', 9), ('Maroon 5', 9), ('Two Steps From
 Hell', 9), ('Beyond', 8), ('孫燕姿', 8), ('Various Artists', 8), ('姫神', 8), (
'莫文蔚', 7), ('王菲', 7), ('陳慧琳', 7), ('任賢齊', 7), ('July', 7), ('花粥', 7
), ('G.E.M.鄧紫棋', 6), ('Aimer', 6), ('Lenka', 6), ('Sia', 6), ('F.I.R.', 6), (
'Coldplay', 6)]

說明:
其中pid是歌單id,打開相應歌單,並複製鏈接,鏈接中的id就是歌單id,替換代碼中的id即可
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章