import requestsimport pandas as pdimport timefrom datetime import datetimeURL_TEMPLATE = "https://music.163.com/api/v1/resource/comments/R_SO_4_{}"HEADERS = {"User-Agent": "Mozilla/5.0"}def fetch_comments(song_id, offset=0, limit=20): url = URL_TEMPLATE.format(song_id) params = {"limit": limit, "offset": offset} try: response = requests.get(url, params=params, headers=HEADERS, timeout=10) response.raise_for_status() data = response.json() return data.get("comments", []) except requests.RequestException as error: print("请求失败:", error) return []def parse_comments(comments, song_id): rows = [] for item in comments: user = item.get("user", {}) rows.append({ "song_id": song_id, "user_id": user.get("userId"), "nickname": user.get("nickname", ""), "content": item.get("content", "").strip(), "liked_count": item.get("likedCount", 0), "create_time": item.get("time", 0) }) return rowssong_id = เพลง_idall_rows = []for offset in range(0, 200, 20): comments = fetch_comments(song_id, offset, 20) if not comments: break all_rows.extend(parse_comments(comments, song_id)) time.sleep(1)df = pd.DataFrame(all_rows)df["crawl_time"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")df.drop_duplicates(subset=["user_id", "content"], inplace=True)df.to_csv("data/music_comments.csv", index=False, encoding="utf-8-sig")print("本次采集评论数量:", len(df))
import pandas as pdfrom snownlp import SnowNLPimport numpy as npinput_file = "data/music_comments.csv"output_file = "data/comment_sentiment_result.csv"df = pd.read_csv(input_file)df["content"] = df["content"].fillna("").astype(str)def get_sentiment_score(text): if not text.strip(): return 0.5 try: return round(SnowNLP(text).sentiments, 4) except Exception as error: print("情感分析失败:", error) return 0.5def classify_sentiment(score): if score >= 0.65: return "积极" elif score <= 0.35: return "消极" else: return "中性"df["sentiment_score"] = df["content"].apply(get_sentiment_score)df["sentiment_type"] = df["sentiment_score"].apply(classify_sentiment)df["comment_length"] = df["content"].str.len()df["liked_count"] = pd.to_numeric( df["liked_count"], errors="coerce").fillna(0)summary = df["sentiment_type"].value_counts().reset_index()summary.columns = ["sentiment_type", "comment_count"]average_score = round(df["sentiment_score"].mean(), 4)positive_rate = round( (df["sentiment_type"] == "积极").mean() * 100, 2)negative_rate = round( (df["sentiment_type"] == "消极").mean() * 100, 2)df["score_level"] = np.select( [ df["sentiment_score"] >= 0.8, df["sentiment_score"] >= 0.65, df["sentiment_score"] <= 0.2 ], ["强烈积极", "一般积极", "强烈消极"], default="其他")df.to_csv(output_file, index=False, encoding="utf-8-sig")summary.to_csv( "data/sentiment_summary.csv", index=False, encoding="utf-8-sig")print("平均情感分值:", average_score)print("积极评论比例:", positive_rate, "%")print("消极评论比例:", negative_rate, "%")print(summary)