查看: 4713|回复: 11
收起左侧

[软件分享] VIP歌曲爬取(转)

[复制链接]
python无名氏
发表于 2022-12-20 14:03:43 | 显示全部楼层 |阅读模式
本帖最后由 python无名氏 于 2022-12-20 14:05 编辑

不知道原作者是谁,用python做的,源码。
可以爬取大部分音乐
自选搜索引擎
(请自行安装所需模块)
要求环境:python3

  1. import os
  2. import tkinter as tk
  3. import webbrowser
  4. import requests
  5. import tkinter.messagebox as mes_box
  6. import PySimpleGUI as sg
  7. from tkinter import ttk
  8. from retrying import retry

  9. class SetUI(object):
  10.     """
  11.     音乐弹框界面
  12.     """
  13.     def __init__(self, weight=1000, height=600):
  14.         self.ui_weight = weight
  15.         self.ui_height = height
  16.         self.title = " 音乐破解软件"
  17.         self.ui_root = tk.Tk(className=self.title)
  18.         self.ui_url = tk.StringVar()
  19.         self.ui_var = tk.IntVar()
  20.         self.ui_var.set(1)
  21.         self.show_result = None
  22.         self.song_num = None
  23.         self.response_data = None
  24.         self.song_url = None
  25.         self.song_name = None
  26.         self.song_author = None

  27.     def set_ui(self):
  28.         """
  29.         设置简易UI界面
  30.         :return:
  31.         """
  32.         # Frame空间
  33.         frame_1 = tk.Frame(self.ui_root)
  34.         frame_2 = tk.Frame(self.ui_root)
  35.         frame_3 = tk.Frame(self.ui_root)
  36.         frame_4 = tk.Frame(self.ui_root)

  37.         # ui界面中菜单设计
  38.         ui_menu = tk.Menu(self.ui_root)
  39.         self.ui_root.config(menu=ui_menu)
  40.         file_menu = tk.Menu(ui_menu, tearoff=0)
  41.         ui_menu.add_cascade(label='菜单', menu=file_menu)
  42.         file_menu.add_command(label='使用说明', command=lambda: webbrowser.open('www.baidu.com'))
  43.         file_menu.add_command(label='关于作者', command=lambda: webbrowser.open('space.bilibili.com/1987880884'))
  44.         file_menu.add_command(label='退出', command=self.ui_root.quit)

  45.         # 控件内容设置
  46.         choice_passageway = tk.Label(frame_1, text='请选择音乐搜索通道:', padx=10, pady=10)
  47.         passageway_button_1 = tk.Radiobutton(frame_1, text='酷我', variable=self.ui_var, value=1, width=10, height=3)
  48.         passageway_button_2 = tk.Radiobutton(frame_1, text='网易云', variable=self.ui_var, value=2, width=10, height=3)
  49.         passageway_button_3 = tk.Radiobutton(frame_1, text='QQ音乐', variable=self.ui_var, value=3, width=10, height=3)
  50.         passageway_button_4 = tk.Radiobutton(frame_1, text='i音乐', variable=self.ui_var, value=4, width=10, height=3)
  51.         input_link = tk.Label(frame_2, text="请输入歌曲名或歌手:")
  52.         entry_style = tk.Entry(frame_2, textvariable=self.ui_url, highlightcolor='Fuchsia', highlightthickness=1,
  53.                                width=35)
  54.         label2 = tk.Label(frame_2, text=" ")
  55.         play_button = tk.Button(frame_2, text="搜索", font=('楷体', 11), fg='Purple', width=2, height=1,
  56.                                 command=self.get_KuWoMusic)
  57.         label3 = tk.Label(frame_2, text=" ")
  58.         # 表格样式
  59.         columns = ("序号", "歌手", "歌曲", "专辑")
  60.         self.show_result = ttk.Treeview(frame_3, height=20, show="headings", columns=columns)
  61.         # 下载
  62.         download_button = tk.Button(frame_4, text="下载", font=('楷体', 11), fg='Purple', width=6, height=1, padx=5,
  63.                                     pady=5, command=self.download_music)

  64.         # 控件布局
  65.         frame_1.pack()
  66.         frame_2.pack()
  67.         frame_3.pack()
  68.         frame_4.pack()
  69.         choice_passageway.grid(row=0, column=0)
  70.         passageway_button_1.grid(row=0, column=1)
  71.         passageway_button_2.grid(row=0, column=2)
  72.         passageway_button_3.grid(row=0, column=3)
  73.         passageway_button_4.grid(row=0, column=4)
  74.         input_link.grid(row=0, column=0)
  75.         entry_style.grid(row=0, column=1)
  76.         label2.grid(row=0, column=2)
  77.         play_button.grid(row=0, column=3, ipadx=10, ipady=10)
  78.         label3.grid(row=0, column=4)
  79.         self.show_result.grid(row=0, column=4)
  80.         download_button.grid(row=0, column=5)

  81.         # 设置表头
  82.         self.show_result.heading("序号", text="序号")
  83.         self.show_result.heading("歌手", text="歌手")
  84.         self.show_result.heading("歌曲", text="歌曲")
  85.         self.show_result.heading("专辑", text="专辑")
  86.         # 设置列
  87.         self.show_result.column("序号", width=100, anchor='center')
  88.         self.show_result.column("歌手", width=200, anchor='center')
  89.         self.show_result.column("歌曲", width=200, anchor='center')
  90.         self.show_result.column("专辑", width=300, anchor='center')

  91.         # 鼠标点击
  92.         self.show_result.bind('<ButtonRelease-1>', self.get_song_url)

  93.     @retry(stop_max_attempt_number=5)
  94.     def get_KuWoMusic(self):
  95.         """
  96.         获取酷我音乐
  97.         :return:
  98.         """
  99.         # 清空treeview表格数据
  100.         for item in self.show_result.get_children():
  101.             self.show_result.delete(item)
  102.         headers = {
  103.             'accept': 'application/json, text/plain, */*',
  104.             'accept - encoding': 'gzip, deflate',
  105.             'accept - language': 'zh - CN, zh;q = 0.9',
  106.             'cache - control': 'no - cache',
  107.             'Connection': 'keep-alive',
  108.             'csrf': 'HH3GHIQ0RYM',
  109.             'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
  110.             'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
  111.                           'Chrome/99.0.4844.51 Safari/537.36',
  112.             'Cookie': '_ga=GA1.2.218753071.1648798611; _gid=GA1.2.144187149.1648798611; _gat=1; '
  113.                       'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1648798611; '
  114.                       'Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1648798611; kw_token=HH3GHIQ0RYM'
  115.         }
  116.         search_input = self.ui_url.get()
  117.         if len(search_input) > 0:
  118.             search_url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?'
  119.             search_data = {
  120.                 'key': search_input,
  121.                 'pn': '1',
  122.                 'rn': '80',
  123.                 'httpsStatus': '1',
  124.                 'reqId': '858597c1-b18e-11ec-83e4-9d53d2ff08ff'
  125.             }
  126.             try:
  127.                 self.response_data = requests.get(search_url, params=search_data, headers=headers, timeout=20).json()
  128.                 songs_data = self.response_data['data']['list']
  129.                 if int(self.response_data['data']['total']) <= 0:
  130.                     mes_box.showerror(title='错误', message='搜索: {} 不存在.'.format(search_input))
  131.                 else:
  132.                     for i in range(len(songs_data)):
  133.                         self.show_result.insert('', i, values=(i + 1, songs_data[i]['artist'], songs_data[i]['name'],
  134.                                                                songs_data[i]['album']))
  135.             except TimeoutError:
  136.                 mes_box.showerror(title='错误', message='搜索超时,请重新输入后再搜索!')
  137.         else:
  138.             mes_box.showerror(title='错误', message='未输入需查询的歌曲或歌手,请输入后搜索!')

  139.     def get_song_url(self, event):
  140.         """
  141.         获取下载歌曲的地址
  142.         :return:
  143.         """
  144.         # treeview中的左键单击
  145.         for item in self.show_result.selection():
  146.             item_text = self.show_result.item(item, "values")
  147.             # 获取
  148.             self.song_num = int(item_text[0])
  149.         # 获取下载歌曲的地址
  150.         if self.song_num is not None:
  151.             songs_data = self.response_data['data']['list']
  152.             songs_req_id = self.response_data['reqId']
  153.             song_rid = songs_data[self.song_num - 1]['rid']
  154.             music_url = 'http://www.kuwo.cn/api/v1/www/music/playUrl?mid={}&type=convert_url3' \
  155.                         '&httpsStatus=1&reqId={}' \
  156.                 .format(song_rid, songs_req_id)
  157.             response_data = requests.get(music_url).json()
  158.             self.song_url = response_data['data'].get('url')
  159.             self.song_name = songs_data[self.song_num - 1]['name']
  160.             self.song_author = songs_data[self.song_num - 1]['artist']
  161.         else:
  162.             mes_box.showerror(title='错误', message='未选择要下载的歌曲,请选择')

  163.     def download_music(self):
  164.         """
  165.         下载音乐
  166.         :return:
  167.         """
  168.         if not os.path.exists('./KuWoMusic'):
  169.             os.mkdir("./KuWoMusic/")
  170.         if self.song_num is not None:
  171.             song_name = self.song_name + '--' + self.song_author + ".mp3"
  172.             try:
  173.                 save_path = os.path.join('./KuWoMusic/{}'.format(song_name)) \
  174.                     .replace('\\', '/')
  175.                 true_path = os.path.abspath(save_path)
  176.                 resp = requests.get(self.song_url)
  177.                 with open(save_path, 'wb') as file:
  178.                     file.write(resp.content)
  179.                     mes_box.showinfo(title='下载成功', message='歌曲:%s,保存地址为%s' % (self.song_name, true_path))
  180.             except Exception:
  181.                 mes_box.showerror(title='错误', message='未找到存放歌曲的文件夹')
  182.         else:
  183.             mes_box.showerror(title='错误', message='未选择要下载的歌曲,请选择后下载')

  184.     def progress_bar(self, file_size):
  185.         """
  186.         任务加载进度条
  187.         :return:
  188.         """
  189.         layout = [[sg.Text('任务完成进度')],
  190.                   [sg.ProgressBar(file_size, orientation='h', size=(40, 20), key='progressbar')],
  191.                   [sg.Cancel()]]

  192.         # window只需将自定义的布局加载出来即可 第一个参数是窗口标题。
  193.         window = sg.Window('机器人执行进度', layout)
  194.         # 根据key值获取到进度条
  195.         _progress_bar = window['progressbar']
  196.         for i in range(file_size):  # 循环
  197.             event, values = window.read(timeout=10)
  198.             if event == 'Cancel' or event is None:
  199.                 break
  200.             _progress_bar.UpdateBar(i + 1)

  201.     def ui_center(self):
  202.         """
  203.         UI界面窗口设置:居中
  204.         """
  205.         ws = self.ui_root.winfo_screenwidth()
  206.         hs = self.ui_root.winfo_screenheight()
  207.         x = int((ws / 2) - (self.ui_weight / 2))
  208.         y = int((hs / 2) - (self.ui_height / 2))
  209.         self.ui_root.geometry('{}x{}+{}+{}'.format(self.ui_weight, self.ui_height, x, y))

  210.     def loop(self):
  211.         """
  212.         函数说明:loop等待用户事件
  213.         """
  214.         self.ui_root.resizable(False, False)  # 禁止修改窗口大小
  215.         self.ui_center()  # 窗口居中
  216.         self.set_ui()
  217.         self.ui_root.mainloop()

  218. if __name__ == '__main__':
  219.     a = SetUI()
  220.     a.loop()
复制代码



Qulili
头像被屏蔽
发表于 2023-3-10 13:27:03 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
蓝蓝的天空
发表于 2023-3-12 12:59:51 | 显示全部楼层
代码保存到记事本 然后保存为什么格式?
python无名氏
 楼主| 发表于 2023-3-12 13:16:39 | 显示全部楼层
蓝蓝的天空 发表于 2023-3-12 12:59
代码保存到记事本 然后保存为什么格式?

后缀改为.py,运行,有什么报错告诉我
蓝蓝的天空
发表于 2023-3-12 13:19:18 | 显示全部楼层
本帖最后由 蓝蓝的天空 于 2023-3-12 13:21 编辑

一闪而过啊  没什么提示也没什么停留出来
QQ图片20230312132046.png
python无名氏
 楼主| 发表于 2023-3-12 13:27:02 | 显示全部楼层
蓝蓝的天空 发表于 2023-3-12 13:19
一闪而过啊  没什么提示也没什么停留出来

算了你要是win10x64的话我给你个打包好的exe(有些第三方库,第一次用python可能没装)
https://pan.huang1111.cn/s/z23aIM
有点大,12MB
蓝蓝的天空
发表于 2023-3-12 13:32:00 | 显示全部楼层
我先装了 python-3.12.0a6-arm64.exe 说什么处理器不支持 然后又装了 python-3.12.0a6-amd64.exe 然后重启电脑
python无名氏
 楼主| 发表于 2023-3-12 13:33:20 | 显示全部楼层
蓝蓝的天空 发表于 2023-3-12 13:32
我先装了 python-3.12.0a6-arm64.exe 说什么处理器不支持 然后又装了 python-3.12.0a6-amd64.exe 然后重启 ...

已上传到网盘
6969
发表于 2023-3-13 12:40:18 | 显示全部楼层
win7的不能装
牛仔小伙
发表于 2023-3-13 12:46:00 | 显示全部楼层
anaconda可以吗
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2023-3-21 12:08 , Processed in 0.134210 second(s), 20 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表