抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞

news/2025/1/22 12:05:10/文章来源:https://www.cnblogs.com/jason-play/p/18685544

抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞

代码链接
效果展示
不说废话,上代码!!!

get.py

# get.py
import urllib.request
import urllib.error
import urllib.parse
import json# 抓取网易云音乐指定url的热评
def get_hotComments(id):url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_'+id+'?csrf_token='   # 歌评urlheader = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}# post请求表单数据data = {'params':'LPkOcWb/uz2Nj6xw+RFhGJ1PkFi4+lh4agK+1jRGmjMAiOcJ5RHxQBbZa+aME54AUdi21JkqLu/yeHjjIaLQJ4wzqiuzrzYUKciRCqmCDX9ziKoktv5mgvvlA5+A9a7kUF5pabudBaWjsut+9T5kfHQBv75fIcDRt/Anyb8FnG/Ro6R8IStD0/JknFvH5+3S','encSecKey':'5627cc7941cf4cbd59b13668efe38a622ed0889d33cdcf603d18b025eb34ac434c882ed5ad16ca06e88e40a8b91de455483d0b88b6b460ca146b163e67ebab688b2feb4f22369db85a926744bad9114d3cddd00ca6255d7cdcad6cf7b9300a6fdf49adf983087cd830131fabbac39ec4a526432958309cf92c0b5a6bc177078b'}postdata = urllib.parse.urlencode(data).encode('utf8')  # 进行编码request = urllib.request.Request(url, headers=header, data=postdata)response = urllib.request.urlopen(request).read().decode('utf8')json_dict = json.loads(response)   # 获取jsonhot_comment = json_dict['hotComments']  # 获取json中的热门评论print(id)num = 1for item in hot_comment:printer1=item['content']with open("comments.txt","a",encoding='utf-8') as f:f.write('id : '+id+' : '+printer1)f.write("\n")f.close()print('id : '+id+' '+'第%d条评论:' % num+printer1)num += 1if __name__ == '__main__':id=input()get_hotComments(id)

index.py

import get as g
n=int(input())
while 1:g.get_hotComments(str(n))n=n+1

注:n为网易云音乐歌曲id。
例如:网易云音乐链接:https://music.163.com/#/song?id=2016388286
id为2016388286
id通常为8位-10位数字。
结尾附上部分comments.txt文件

index.html

重头戏来了!

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>随机云村评论</title><style>body {margin: 0;padding: 0;font-family: 'Arial', sans-serif;background: linear-gradient(135deg, #1e272e, #2c3e50);color: #ffffff;overflow-x: hidden;display: flex;justify-content: center;align-items: center;height: 100vh;text-align: center;}.container {max-width: 800px;padding: 40px;border-radius: 10px;background: rgba(0, 0, 0, 0.6);box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);backdrop-filter: blur(5px);}.container h1 {font-size: 3rem;margin: 0 0 20px;}.container h2 {font-size: 1.5rem;margin: 0 0 15px;}.container p {font-size: 1.2rem;margin: 20px 0;}.button {padding: 10px 20px;background: #00ff80;border: none;border-radius: 5px;font-size: 1.2rem;color: #1e272e;cursor: pointer;transition: transform 0.3s ease, background 0.3s ease;}.button:hover {background: #00e676;transform: scale(1.1);}a {color: #00ff80;text-decoration: none;transition: color 0.3s ease;}a:hover {color: #00e676;text-decoration: underline;}.particles {position: fixed;top: 0;left: 0;width: 100%;height: 100%;z-index: -1;}.music-player {margin-top: 20px;}</style>
</head>
<body><canvas class="particles"></canvas><div class="container"><h1>随机云村评论</h1><h2>音乐与灵魂的碰撞</h2><a href="/">返回首页</a><p id="comment">点击按钮随机抽取一条评论</p><button class="button" onclick="fetchRandomComment()">抽取评论</button><div class="music-player" id="musicPlayer"></div></div><script>let comments = [];// 从服务器加载评论文件async function loadComments() {try {const response = await fetch('comments.txt');if (!response.ok) {throw new Error('Failed to fetch comments');}const fileContent = await response.text();comments = parseComments(fileContent);document.getElementById('comment').textContent = "点击按钮随机抽取一条评论";} catch (error) {console.error("Failed to load comments:", error);document.getElementById('comment').textContent = "加载评论失败,请稍后再试。";}}// 解析评论内容function parseComments(fileContent) {const lines = fileContent.split('\n');const parsedComments = [];let currentComment = null;lines.forEach(line => {const trimmedLine = line.trim();if (trimmedLine === "") return;const parts = trimmedLine.split(' : ');if (parts.length >= 3) {if (currentComment) {parsedComments.push(currentComment);}currentComment = { id: parts[0].trim(), number: parts[1].trim(), content: parts.slice(2).join(' : ').trim() };} else if (currentComment) {currentComment.content += "\n" + trimmedLine;}});if (currentComment) {parsedComments.push(currentComment);}return parsedComments;}// 随机抽取评论function fetchRandomComment() {if (comments.length === 0) {loadComments();return;}const randomIndex = Math.floor(Math.random() * comments.length);const comment = comments[randomIndex];const songUrl = `https://music.163.com/#/song?id=${comment.number}`;document.getElementById('comment').innerHTML = `来自歌曲<a href="${songUrl}" target="_blank">${comment.number}</a>的评论:${comment.content}`;const musicPlayerDiv = document.getElementById('musicPlayer');musicPlayerDiv.innerHTML = `<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=${comment.number}&auto=1&height=66"></iframe>`;}// 初次加载时尝试加载评论loadComments();// 粒子效果document.addEventListener('DOMContentLoaded', () => {const canvas = document.querySelector('.particles');const ctx = canvas.getContext('2d');canvas.width = window.innerWidth;canvas.height = window.innerHeight;window.addEventListener('resize', () => {canvas.width = window.innerWidth;canvas.height = window.innerHeight;});const particles = [];class Particle {constructor(x, y, color) {this.x = x;this.y = y;this.color = color;this.size = Math.random() * 3 + 1;this.speedX = Math.random() * 2 - 1;this.speedY = Math.random() * 2 - 1;}draw() {ctx.fillStyle = this.color;ctx.beginPath();ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);ctx.fill();}update() {this.x += this.speedX;this.y += this.speedY;if (this.x < 0 || this.x > canvas.width) this.speedX *= -1;if (this.y < 0 || this.y > canvas.height) this.speedY *= -1;}}function createParticles() {for (let i = 0; i < 100; i++) {const x = Math.random() * canvas.width;const y = Math.random() * canvas.height;const color = `hsl(${Math.random() * 360}, 100%, 50%)`;particles.push(new Particle(x, y, color));}}createParticles();function animate() {ctx.clearRect(0, 0, canvas.width, canvas.height);particles.forEach(particle => {particle.draw();particle.update();});requestAnimationFrame(animate);}animate();});</script>
</body>
</html>

comments.txt

格式 :

id : $id : $comment

部分评论 comments.txt https://github.com/fjsje/wanwusangzhi/blob/main/work/writing/comments.txt

运行指南

先打开index.py,输入起始歌曲id。
抓取足够多的评论后,打开index.html
注意index.html 请在服务器上部署才能抓取comments.txt成功,否则会出现以下情况:
报错
点赞加关注,精彩不迷路!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/873198.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快手HoME多任务论文

论文链接:HoME: Hierarchy of Multi-Gate Experts for Multi-Task Learning at Kuaishou 背景 论文指出现在的MMOE/PLE模型存在以下几个问题: 1. 专家崩溃:专家的输出分布存在显着差异,并且一些专家使用 ReLU 的零激活率超过 90%,使得门网络很难分配公平的权重来平衡专家…

Linux 笔记

目录Linux 目录结构Linux 目录与 Windows 目录对比Windows 目录结构Linux 目录结构Linux 世界里---一切皆文件Linux 目录结构详解/bin/sbin/home/root/boot/lib/etc/usr/proc, 别动/srv, 别动/sys, 别动/tmp/dev/media/mnt/opt/usr/local/var/selinux常用快捷键案例常用命令开机…

Prometheus+Grafana 监控搭建

Prometheus+Grafana 监控搭建 Prometheus 是使用 Golang 开发的,安装和运行都非常简单,只需直接运行可执行文件即可。个人认为,只要理解了 Prometheus 的架构图,整体概念就会变得非常清晰。 Prometheus 做的挺成熟,使用非常简单,主要是想自己记录一下,方便后续记忆。 1、…

【防火墙】防火墙监控没做好,断网2小时准备提桶跑路

防火墙告警:该业务CPU负荷过多(81>= 80) ,发现吞吐量超过设备性能阈值,导致网络特别卡,客户端体现就是偶尔网络中断。 之前有篇文章是针对华三的防火墙指标数据采集做了介绍说明,可点击这里查看 网络监控:华三防火墙监控 这篇文章了解,在防火墙可观测性领域目前案例分…

nRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块

nRF21540是一款射频前端模块(FEM),可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备,nRF21540是一种“即插即用型”的无线传输范围扩展器,可与nRF52和nRF53系列的高级多协议无线SoC搭配使用,所需的外部器件数量非常少。 nRF21540的+13dB RX增益和低…

Transformer 学习与解读

LLM学习笔记 注意力机制 sequence to sequence (seq2seq)输入N个向量,输出任意可能数量的向量(由机器决定);如果输出N个向量的任务就叫做Sequence Labeling 李沐课程讲义:https://zh-v2.d2l.ai/chapter_attention-mechanisms/self-attention-and-positional-encoding.ht…

JDK中的可视化故障处理工具

JDK提供了几个功能集成度更高的可视化工具,我们可以使用这些可视化工具以更加便捷的方式进行进程故障诊断和调试工作。 今天就简单介绍一些JDK中的可视化故障处理工具。 JHSDB:基于服务性代理的调试工具 在说JHSDB之前,先来了解一下JCMD和JHSDB这两个集成式的多功能工具箱,…

ExKMP Z函数

讲解Z函数(ExKMP),附模板及例题更新日志 20250122:开工。思路 我们定义 \(z_i\) 表示从 \(i\) 开始的后缀与整个字符串的最长公共前缀长度。 考虑它的作用,假如我们要字符串匹配,将模式串接在前面并以特殊字符分隔,然后 \(O(n)\) 遍历原串,当 \(z_i=|T|\)(\(T\) 为模式…

【资产梳理】 攻击面资产梳理可视化工具

免责声明: ⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!确定攻击面对于防御和进攻网络安全团队都至关重要。毫无疑问,可视化映射比简单的列表更有效。专家可以快速掌握…

OpenWRT24.10旁路由挂载USB移动硬盘,配置Samba4,作为NAS使用,解决中文不显示,乱码,解决断电重启后挂载失败问题

1. 为何选择OpenWRT 24.10,及如何配置旁路由,或者IPv6地址 看这篇:参OpenWRT24.10配置作为旁路由,并配置获取IPv4和IPv6地址 使用的OpenWRT固件是从这里下载的:https://openwrt.ai/ 2.挂载大容量USB移动硬盘 2.1 安装必备插件 kmod-fs-ntfs3 kmod-fs-ext4 kmod-fs-exfat…

如何迅速并识别处理MDL锁阻塞问题

TaurusDB推出MDL锁视图功能,帮助用户迅速识别并处理MDL锁阻塞问题,从而有效减少对业务的负面影响,提升数据库管理效率。摘要:TaurusDB推出MDL锁视图功能,帮助用户迅速识别并处理MDL锁阻塞问题,从而有效减少对业务的负面影响,提升数据库管理效率。本文分享自华为云社区《…

运维职业要求

摘抄知乎@Hi峰兄运维技能导图量化自己的技能深度 级别 水平 0   啥都不懂 1   理解基本概念,应用场景 2   基本的安装,配置,使用,常用配置修改,定位基本问题 3 根据实际情况定位、优化服务,了解服务核心模块运行机制,熟悉服务的各种使用方法 4 深…