酷我音乐爬取下载

酷我音乐爬取下载

import os
import re
import PySimpleGUI as sg
import jsonpath
import requests

# 保存这次访问的cookies
html=requests.session()
keys=[]
save_path=None
def get_music_url(music_name):
    url='https://kuwo.cn/'


    html.get(url)
    csrf=html.cookies.get_dict()['kw_token']
    # print(csrf)

    url=f'https://kuwo.cn/api/www/search/searchMusicBykeyWord?key={music_name}&pn=1&rn=30&httpsStatus=1'
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
            'Accept': 'application/json, text/plain, */*',
            'csrf': csrf,
            'Referer': 'https://kuwo.cn',
            }
    json_data=html.get(url,headers=headers).json()

    name_list=jsonpath.jsonpath(json_data,'$..name')
    artist_list=jsonpath.jsonpath(json_data,'$..artist')
    rid_list=jsonpath.jsonpath(json_data,'$..rid')  # 查找所有键为rid的值
    length=len(rid_list)
    # print('歌曲数量:',length)
    data=[]

    keys.append(music_name)
    for i in range(length):
        music_json = f'https://kuwo.cn/api/v1/www/music/playUrl?mid={rid_list[i]}&type=convert_url3&br=320kmp3'
        resp = html.get(url=music_json)
        if resp.status_code <span style="font-weight: bold;" class="mark"> 200:
            if resp.json()['code'] </span> 200:
                mp3_url = resp.json()['data']['url']
                title=re.sub('&nbsp;', " ", name_list[i])
                artist=re.sub('&nbsp;', " ", artist_list[i])
                data.append([title, artist, rid_list[i]])
                print(title, artist, rid_list[i], sep=' | ')
                # 传入到歌曲选择框选择
    window["value"].Update(values=data, font=("微软雅黑", 10), size=(30, 8))
    window["keys"].Update(values=keys, font=("微软雅黑", 10),size=(70, 8))

def save_music(file_path, mp3data):
    music_json = f'https://kuwo.cn/api/v1/www/music/playUrl?mid={mp3data[2]}&type=convert_url3&br=320kmp3'
    mp3_url = html.get(url=music_json).json()['data']['url']
    resp = requests.get(url=mp3_url)
    if not os.path.exists(file_path):
        os.makedirs(file_path)
    with open(f'{file_path}/{mp3data[0]}-{mp3data[1]}.mp3', mode='wb') as f:
        f.write(resp.content)

# 主题设置
sg.theme('BrownBlue')  # BrownBlue  LightBrown3

# 布局设置
layout = [ # 搜索框布局  Text:文本  Combo:输入框 tooltip:鼠标移动到输入框显示的内容 size:输入框宽度 Button:按钮 key:唯一标识
     [sg.Text('请输入搜索的歌曲或歌手:', font=("微软雅黑", 12)),
           sg.Combo(values='', tooltip='请输入搜索的歌曲或歌手:', font=("微软雅黑", 10), default_value='', auto_size_text=True,
                    size=(70, 0), key='keys'), sg.Button('搜索', font=("微软雅黑", 12))],
    # 歌曲选择框布局
          [sg.Text('请选择或输入要保存的歌:', font=("微软雅黑", 12)),
           sg.Combo(values='', tooltip='请选择或输入要保存的歌:', font=("微软雅黑", 10), default_value='', auto_size_text=True,
                    size=(70, 0), key='value'), sg.Button('保存', font=("微软雅黑", 12))],
    # 信息展示框  Output:输出元素
          [sg.Text('信息展示:', justification='center')],
    # 将print输出展示到gui界面信息框 echo_stdout_stderr=True同时显示在控制台
          [sg.Output(size=(100, 10), font=("微软雅黑", 10))],
    # 退出程序按钮
          [sg.Text('', font=("微软雅黑", 12), size=(73, 1)),sg.Button('退出程序', font=("微软雅黑", 12))]
          ]
# 创建窗口
window = sg.Window('酷我音乐下载器', layout, font=("微软雅黑", 12), default_element_size=(80, 1))

# 事件循环 类似网页后端代码
while True:
    event, values = window.read()

    if event == '搜索':
        if values['keys']:
            # 接收搜索框内容
            key = values['keys']
            # 传入函数
            url_rid = get_music_url(music_name=key)
            # MP3url_rid(url_rid)
            print('搜索完成, 请选择要下载的歌曲!')
            # 弹窗
            sg.popup('搜索完成, 请选择要下载的歌曲!')
        else:
            print('歌曲或歌手未输入!')
            sg.popup('歌曲或歌手未输入!')

    if event == '保存':
        if values['value']:
            # sg.popup_get_folder() 弹窗的一种,接收的是文件路径
            try:
                if save_path != None:
                    save_path = sg.popup_get_folder('请选择存储路径:',default_path=save_path)
                else:
                    save_path = sg.popup_get_folder('请选择存储路径:')
                if save_path !=None:
                    mp3data = values['value']
                    save_music(save_path, mp3data)
                    print(f'{mp3data[0]}-{mp3data[1]} 下载完成!')
                    # sg.popup('下载完成!')
            except:
                print('出现异常,下载失败')
        else:
            print('未选择或者输入歌曲!')
            sg.popup('未选择或者输入歌曲!')

    # 点击退出程序按时结束事件循环
    if event in (None, '退出程序'):
        break

window.close()
import os
import re
import requests
import prettytable
from prettytable import DEFAULT


def get_music():
    input_name = input("请输入你要下载的歌曲或歌手:")
    url = 'https://kuwo.cn/'
    # 保存这次访问的cookies
    html = requests.session()
    html.get(url)
    csrf=html.cookies.get_dict()['kw_token']
    # print(csrf)

    url=f'https://kuwo.cn/api/www/search/searchMusicBykeyWord?key={input_name}&pn=1&rn=30&httpsStatus=1'
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
            'Accept': 'application/json, text/plain, */*',
            'csrf': csrf,
            'Referer': 'https://kuwo.cn',
            }
    music_list=html.get(url,headers=headers).json()["data"]["list"]
    music_tab = prettytable.PrettyTable(align='l')
    music_tab.field_names = ["序号", f'{"歌曲":\u3000<20}', "歌手".ljust(6,' ')]
    num = 0
    music_rid_list = []
    for music in music_list:
        music_rid = music["rid"]
        music_name = music["name"]
        music_name=re.sub('&nbsp;', "", music_name).strip()
        if len(music_name)>25:
            music_name += 6*' '
        music_artist = music["artist"].strip()
        music_rid_list.append([music_rid, music_name, music_artist])
        music_tab.add_row([num, f'{music_name:\u3000<23}', music_artist])
        num += 1

    # MSWORD_FRIENDLY​​​,​​PLAIN_COLUMNS​​​,​​DEFAULT​​​ 三种表格样式
    music_tab.set_style(DEFAULT)
    print(music_tab)
    return music_rid_list


music_rid_list=get_music()
while True:
    try:
        print('[输入66]回到上一级 | [输入88]退出程序')
        music_tab_index = int(input("请输入你想下载的歌曲序号:"))
        if music_tab_index == 66:
            music_rid_list = get_music()
            continue
        if music_tab_index == 88:
            print("bye!")
            break
        music_name=music_rid_list[music_tab_index][1]
        music_artist=music_rid_list[music_tab_index][2]
        rid = music_rid_list[music_tab_index][0]
        #当下面链接type为 convert_url3 时,免费/付费音乐都可以爬取
        # https://kuwo.cn/api/v1/www/music/playUrl?mid=78932517&type=music&httpsStatus=1
        # br为音质,可选 128kmp3、192kmp3 和 320kmp3
        music_url = f'http://www.kuwo.cn/api/v1/www/music/playUrl?mid={rid}&type=convert_url3&br=320kmp3'
        download_url = requests.get(music_url).json()["data"]["url"]
        music = requests.get(download_url).content
        if not os.path.exists("./下载音乐"):
            os.makedirs("./下载音乐")
        with open(f'./下载音乐/{music_name}-{music_artist}.mp3', mode="wb") as f:
            f.write(music)
            print(f"{music_name}-{music_artist},下载成功!")

    except:
        print('下载异常,请检查输入是否正确')
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容