当前位置: 首页 > news >正文

网易云音乐热度分析

​ import requests import json import pandas as pd import time from fake_useragent import UserAgent import random # -------------------------- 配置项 -------------------------- # 网易云音乐榜单ID(2025热歌榜/年度榜可替换此ID) # 热歌榜:3778678 | 年度榜:19723756 | 飙升榜:19723756 BOARD_ID = 3778678 # 请求间隔(防反爬) REQUEST_DELAY = 1.5 # 导出Excel文件名 OUTPUT_FILE = "2025网易云音乐热度分析.xlsx" # -------------------------- 核心爬虫函数 -------------------------- class NeteaseMusicSpider: def __init__(self): # 随机User-Agent(模拟浏览器) self.ua = UserAgent() self.headers = { "User-Agent": self.ua.random, "Referer": "https://music.163.com/", "Cookie": "appver=8.9.0; os=pc;" # 可替换成自己的Cookie(可选) } # 存储最终数据 self.music_data = [] def get_board_songs(self, board_id): """爬取指定榜单的歌曲列表""" # 榜单接口URL url = f"https://music.163.com/api/playlist/detail?id={board_id}" try: # 发送请求(添加随机延迟防封) time.sleep(random.uniform(REQUEST_DELAY, REQUEST_DELAY + 1)) response = requests.get(url, headers=self.headers, timeout=10) response.raise_for_status() # 抛出HTTP错误 # 解析JSON数据 data = json.loads(response.text) songs = data["result"]["tracks"] # 遍历提取核心信息 for song in songs: # 基础信息 song_info = { "排名": len(self.music_data) + 1, "歌曲名": song["name"], "歌手": "/".join([artist["name"] for artist in song["artists"]]), "专辑": song["album"]["name"], "时长": self.format_duration(song["duration"]), "播放量": self.get_play_count(song["id"]), # 单独获取播放量 "热度值": song.get("popularity", 0), # 热度指数 "收藏数": song.get("likedCount", 0), "评论数": self.get_comment_count(song["id"]) # 单独获取评论数 } self.music_data.append(song_info) print(f"已爬取:{song_info['排名']}. {song_info['歌曲名']} - {song_info['歌手']}") except Exception as e: print(f"爬取榜单失败:{e}") def get_play_count(self, song_id): """获取歌曲播放量(补充接口)""" try: url = f"https://music.163.com/api/song/detail/?id={song_id}&ids=[{song_id}]" response = requests.get(url, headers=self.headers, timeout=5) data = json.loads(response.text) # 部分歌曲播放量字段不同,做兼容 play_count = data["songs"][0].get("playCount", 0) return self.format_number(play_count) except: return "未知" def get_comment_count(self, song_id): """获取歌曲评论数""" try: url = f"https://music.163.com/api/v1/resource/comments/R_SO_4_{song_id}/?limit=1" response = requests.get(url, headers=self.headers, timeout=5) data = json.loads(response.text) comment_count = data.get("total", 0) return self.format_number(comment_count) except: return "未知" @staticmethod def format_duration(duration): """格式化时长(毫秒→分:秒)""" minutes = duration // 60000 seconds = (duration % 60000) // 1000 return f"{minutes}:{seconds:02d}" @staticmethod def format_number(num): """格式化数字(万/亿单位)""" if num >= 1e8: return f"{num / 1e8:.2f}亿" elif num >= 1e4: return f"{num / 1e4:.2f}万" else: return str(num) def save_to_excel(self): """将数据导出为Excel""" try: df = pd.DataFrame(self.music_data) # 按热度值降序排序 df = df.sort_values(by="热度值", ascending=False) # 保存Excel(忽略索引) df.to_excel(OUTPUT_FILE, index=False, engine="openpyxl") print(f"\n✅ 数据已成功导出至:{OUTPUT_FILE}") print(f"📊 共爬取 {len(self.music_data)} 首歌曲") except Exception as e: print(f"保存Excel失败:{e}") # -------------------------- 运行爬虫 -------------------------- if __name__ == "__main__": print("===== 2025网易云音乐热度爬虫开始运行 =====") spider = NeteaseMusicSpider() # 1. 爬取榜单数据 spider.get_board_songs(BOARD_ID) # 2. 数据清洗(去重) df_temp = pd.DataFrame(spider.music_data) df_temp = df_temp.drop_duplicates(subset=["歌曲名", "歌手"], keep="first") spider.music_data = df_temp.to_dict("records") # 3. 导出Excel spider.save_to_excel() print("===== 爬虫运行结束 =====") ​
http://www.jsqmd.com/news/617958/

相关文章:

  • 2026飞叔生炸加盟费用明细:10万预算如何开一家15-25平爆款炸货店? - 华Sir1
  • OpenDataLab MinerU实战解析:PPT内容一键摘要,会议记录好帮手
  • Llama-3.2V-11B-cot部署案例:Docker镜像免配置运行图文推理API服务
  • Pixel Fashion Atelier保姆级教程:从Docker Pull到Forge!按钮点击全流程
  • 盟接之桥®制造业EDI软件:解密SFTP协议,打造制造业供应链的“安全传输通道”
  • Krita-Vision-Tools:数字艺术家的AI助手,一键智能选区革命
  • 系统架构师(操作系统)
  • KKS-HF_Patch完全指南:轻松解锁Koikatsu Sunshine完整游戏体验
  • 端子拉力机哪个品牌好?2026年最新品牌实测与推荐 - 品牌推荐大师1
  • 百度网盘macOS插件:非会员用户的速度救星与逆向工程实践
  • 别再手写Verilog了!用Simulink HDL Coder快速搭建FPGA原型(附避坑指南)
  • 开源中国教育战略升级:构建AI时代全链条人才培养生态
  • 2026年好用的铆螺柱品牌推荐,盐城鼎治助力生产装配降本增效 - myqiye
  • 忍者像素绘卷新手入门:5分钟学会复古像素画生成
  • Illustrator脚本自动化:专业设计工作流效率提升解决方案
  • 2026届学术党必备的五大降重复率平台解析与推荐
  • 10分钟释放100GB空间:AntiDupl重复图片清理终极指南
  • OpenClaw夜间任务优化:Qwen3-14B镜像低负载调度策略
  • GLM-5.1 重磅上线,编程能力剑指Claude Opus 4.6,Coding plan订阅再次火速售罄
  • 2026年售后完善的AI搜索优化服务商哪家性价比高,苏州聚合AI上榜 - mypinpai
  • SCMP单科成绩保留规则:补考流程与备考时间规划建议 - 众智商学院官方
  • StructBERT文本相似度模型YOLOv8多模态应用探索:图文关联度分析
  • Node.js后端服务开发:搭建高性能AI模型推理API网关
  • ContentProvider call方法:简化跨进程通信的优雅实践
  • # 政务表单动态建表?运行时DDL引擎,前端拖完字段后端直接建
  • 跨平台直播录制利器Fideo:从技术架构到实战应用的深度解析
  • Deep Sort PyTorch:多目标跟踪的完整实践指南
  • 反爬虫对抗策略在海淘场景的应用
  • 使用GitHub Actions实现Janus-Pro-7B模型服务的CI/CD自动化流水线
  • NineData 2026年3月功能上新:支持飞书外部审批,增强慢查询分析与数据复制能力