# 社交媒体数据分析python大作业 代码


### 一、项目背景与目标
社交媒体(如微博、抖音、Twitter等)蕴含着海量用户生成内容,通过Python对这些数据进行采集、分析与可视化,可挖掘用户情感倾向、热点话题、用户行为模式等信息。本大作业旨在通过完整的数据分析流程(数据获取→预处理→分析→可视化),掌握社交媒体数据分析的核心技术,提升Python实战能力。

### 二、技术栈与依赖库
完成本项目需安装以下Python库:
– **数据获取**:`requests`(HTTP请求)、`BeautifulSoup4`/`Selenium`(网页解析,可选)、`tweepy`/`weibo-api`(平台API,若有授权)。
– **数据处理**:`pandas`(表格处理)、`numpy`(数值计算)、`jieba`(中文分词)、`re`(正则表达式,清洗数据)。
– **情感分析**:`snownlp`(中文情感分析)、`nltk`(英文情感分析,可选)、`transformers`(预训练模型,如BERT,进阶方向)。
– **社交网络分析**:`networkx`(网络结构分析)。
– **可视化**:`matplotlib`、`seaborn`(统计图表)、`wordcloud`(词云)、`pyvis`(交互式网络可视化)。

### 三、代码实现(分模块)

#### 1. 数据获取模块(以微博评论爬取为例,模拟场景)
若无法直接调用平台API,可通过**网页爬取**或**模拟数据**获取内容。

“`python
import requests
import pandas as pd
import time

def crawl_weibo_comments(weibo_url, page_num=5):
“””爬取微博评论(需替换真实Cookie,遵守平台爬虫规则)”””
headers = {
“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36”,
“Cookie”: “你的微博Cookie(需替换)”, # 登录微博后从浏览器获取
}
comments = []
for page in range(1, page_num + 1):
# 微博评论接口(需调试,此处为模拟逻辑)
api_url = f”https://weibo.com/ajax/comments/show?id={weibo_url.split(‘/’)[-1]}&page={page}”
try:
response = requests.get(api_url, headers=headers)
data = response.json() # 假设返回JSON格式数据
for comment in data.get(“data”, []):
item = {
“user_id”: comment[“user”][“id”],
“content”: comment[“text”],
“create_time”: comment[“created_at”],
“like_count”: comment[“like_counts”],
}
comments.append(item)
time.sleep(1) # 防反爬,休眠1秒
except Exception as e:
print(f”爬取第{page}页失败:{e}”)
return pd.DataFrame(comments)

# 调用示例(替换为真实微博URL)
weibo_url = “https://weibo.com/123456789/abcdefg” # 示例微博URL
df = crawl_weibo_comments(weibo_url, page_num=3)
print(“爬取数据量:”, len(df))
“`

#### 2. 数据预处理模块
原始数据存在噪声(如特殊字符、重复内容、缺失值),需清洗后才能分析。

“`python
import re
import jieba

def preprocess_data(df):
“””数据预处理:去重、清洗文本、分词”””
# 1. 去重(按评论内容列)
df = df.drop_duplicates(subset=[“content”])
# 2. 清洗文本:去除HTML标签、特殊字符、@用户、话题词
df[“content_clean”] = df[“content”].apply(
lambda x: re.sub(r”<.*?>|[\s+\.\!\/_,$%^*(+\”\’)]+|@\S+|#\S+”, “”, str(x))
)
# 3. 分词(中文)+ 过滤停用词(需提前准备stopwords.txt,每行一个停用词)
def tokenize(text):
stopwords = [line.strip() for line in open(“stopwords.txt”, “r”, encoding=”utf-8″).readlines()]
words = jieba.cut(text)
return [word for word in words if word not in stopwords and len(word) > 1]
df[“tokens”] = df[“content_clean”].apply(tokenize)
return df

# 调用示例
df_processed = preprocess_data(df)
print(“预处理后数据量:”, len(df_processed))
“`

#### 3. 情感分析模块(以中文情感分析为例,使用SnowNLP)
`SnowNLP`可快速分析中文文本的情感倾向(情感值∈[0,1],越接近1越积极,越接近0越消极)。

“`python
from snownlp import SnowNLP

def sentiment_analysis(df):
“””情感分析:计算每条评论的情感值,划分情感倾向”””
def get_sentiment(text):
if not text.strip():
return 0.5 # 空文本设为中性
s = SnowNLP(text)
return s.sentiments # 情感值(0-1)
df[“sentiment”] = df[“content_clean”].apply(get_sentiment)
# 划分情感倾向:积极(>0.6)、中性(0.4-0.6)、消极(<0.4) df["sentiment_label"] = df["sentiment"].apply( lambda x: "积极" if x > 0.6 else (“消极” if x < 0.4 else "中性") ) return df # 调用示例 df_sentiment = sentiment_analysis(df_processed) # 统计情感分布 sentiment_stats = df_sentiment["sentiment_label"].value_counts().reset_index(name="count") print(sentiment_stats) ``` #### 4. 社交网络分析模块(用户互动关系) 假设数据包含“用户@他人”的互动,可构建用户互动网络,分析节点中心性(如度中心性)。 ```python import networkx as nx def build_social_network(df): """构建用户互动网络:节点=用户,边=互动关系(A@B则A→B)""" G = nx.DiGraph() # 有向图(互动是单向的) for _, row in df.iterrows(): user = row["user_id"] G.add_node(user) # 提取评论中@的用户(格式:@用户名) at_users = re.findall(r"@(\S+)", row["content"]) for at_user in at_users: G.add_edge(user, at_user) # 从当前用户指向@的用户 # 分析度中心性(节点的互动频率) degree_centrality = nx.degree_centrality(G) # 转换为DataFrame,取Top10互动中心用户 centrality_df = pd.DataFrame( list(degree_centrality.items()), columns=["user_id", "degree_centrality"] ).sort_values("degree_centrality", ascending=False).head(10) return G, centrality_df # 调用示例 G, centrality_top = build_social_network(df_sentiment) print("互动网络节点数:", G.number_of_nodes()) print("Top10度中心性用户:\n", centrality_top) ``` #### 5. 数据可视化模块 通过可视化直观呈现分析结果,如情感分布饼图、词云、网络关系图。 ```python import matplotlib.pyplot as plt from wordcloud import WordCloud import matplotlib.colors as mcolors from pyvis.network import Network # 1. 情感分布饼图 def plot_sentiment_pie(sentiment_stats): labels = sentiment_stats["sentiment_label"] sizes = sentiment_stats["count"] colors = ["#ff9999", "#99cc99", "#66b3ff"] # 消极、中性、积极 plt.figure(figsize=(6, 6)) plt.pie(sizes, labels=labels, colors=colors, autopct="%1.1f%%", startangle=90) plt.axis("equal") plt.title("情感倾向分布") plt.show() # 2. 词云可视化(基于分词结果) def plot_wordcloud(tokens_list): all_words = [word for sublist in tokens_list for word in sublist] word_freq = pd.Series(all_words).value_counts().to_dict() # 自定义渐变色词云 cmap = mcolors.LinearSegmentedColormap.from_list( "custom_cmap", ["#3498db", "#e74c3c", "#f39c12"] ) wc = WordCloud( font_path="simhei.ttf", # 中文需指定字体(如黑体) background_color="white", width=800, height=400, colormap=cmap, ).generate_from_frequencies(word_freq) plt.figure(figsize=(10, 6)) plt.imshow(wc, interpolation="bilinear") plt.axis("off") plt.title("评论词云") plt.show() # 3. 交互式社交网络可视化(Pyvis) def visualize_social_network(G): net = Network( directed=True, notebook=True, height="600px", width="100%", bgcolor="#222222", font_color="white" ) # 添加节点与边 for node in G.nodes(): net.add_node(node, size=10) # 节点大小可按中心性调整 for edge in G.edges(): net.add_edge(edge[0], edge[1]) # 布局优化(ForceAtlas2算法) net.barnes_hut() net.show("social_network.html") # 生成HTML文件,可在浏览器中交互查看 # 调用示例 plot_sentiment_pie(sentiment_stats) plot_wordcloud(df_processed["tokens"].tolist()) visualize_social_network(G) ``` ### 四、运行与结果 1. **运行方式**:将上述代码按模块整合(需补充停用词表、字体文件等资源),依次执行 `数据获取→预处理→分析→可视化` 函数。 2. **预期输出**: - 情感分析:得到每条评论的情感值与倾向,输出情感分布统计(如“积极占比45%、中性30%、消极25%”)。 - 词云:展示评论中高频词汇(如“喜欢”“好看”“垃圾”等,依数据而定)。 - 社交网络:生成交互式关系图,节点大小反映用户互动中心性,边表示互动方向(可在浏览器中缩放、拖拽查看)。 ### 五、总结与扩展 本项目通过完整的社交媒体数据分析流程,掌握了数据爬取、预处理、情感分析、网络分析与可视化的核心技术。未来可从以下方向扩展: - **模型优化**:替换为BERT等预训练模型做情感分析,提升准确率。 - **实时分析**:结合`Flask`/`Django`搭建Web服务,实时处理新发布的社交媒体数据。 - **多平台整合**:同时分析微博、抖音、Twitter等多平台数据,挖掘跨平台规律。 - **商业应用**:结合行业需求(如品牌舆情监测、产品口碑分析),输出决策建议。 ### 附:完整代码整合示例 (将上述模块函数按顺序调用,需根据实际场景调整数据来源、资源路径等) ```python # 完整代码示例(需根据实际情况调整) import requests import pandas as pd import re import jieba from snownlp import SnowNLP import matplotlib.pyplot as plt from wordcloud import WordCloud import matplotlib.colors as mcolors import networkx as nx from pyvis.network import Network # ---------------------- 1. 数据获取 ---------------------- def crawl_weibo_comments(weibo_url, page_num=5): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Cookie": "你的微博Cookie(需替换)", } comments = [] for page in range(1, page_num + 1): api_url = f"https://weibo.com/ajax/comments/show?id={weibo_url.split('/')[-1]}&page={page}" try: response = requests.get(api_url, headers=headers) data = response.json() for comment in data.get("data", []): item = { "user_id": comment["user"]["id"], "content": comment["text"], "create_time": comment["created_at"], "like_count": comment["like_counts"], } comments.append(item) time.sleep(1) except Exception as e: print(f"爬取第{page}页失败:{e}") return pd.DataFrame(comments) # ---------------------- 2. 数据预处理 ---------------------- def preprocess_data(df): df = df.drop_duplicates(subset=["content"]) df["content_clean"] = df["content"].apply( lambda x: re.sub(r"<.*?>|[\s+\.\!\/_,$%^*(+\”\’)]+|@\S+|#\S+”, “”, str(x))
)
def tokenize(text):
stopwords = [line.strip() for line in open(“stopwords.txt”, “r”, encoding=”utf-8″).readlines()]
words = jieba.cut(text)
return [word for word in words if word not in stopwords and len(word) > 1]
df[“tokens”] = df[“content_clean”].apply(tokenize)
return df

# ———————- 3. 情感分析 ———————-
def sentiment_analysis(df):
def get_sentiment(text):
if not text.strip():
return 0.5
s = SnowNLP(text)
return s.sentiments
df[“sentiment”] = df[“content_clean”].apply(get_sentiment)
df[“sentiment_label”] = df[“sentiment”].apply(
lambda x: “积极” if x > 0.6 else (“消极” if x < 0.4 else "中性") ) return df # ---------------------- 4. 社交网络分析 ---------------------- def build_social_network(df): G = nx.DiGraph() for _, row in df.iterrows(): user = row["user_id"] G.add_node(user) at_users = re.findall(r"@(\S+)", row["content"]) for at_user in at_users: G.add_edge(user, at_user) degree_centrality = nx.degree_centrality(G) centrality_df = pd.DataFrame( list(degree_centrality.items()), columns=["user_id", "degree_centrality"] ).sort_values("degree_centrality", ascending=False).head(10) return G, centrality_df # ---------------------- 5. 可视化 ---------------------- def plot_sentiment_pie(sentiment_stats): labels = sentiment_stats["sentiment_label"] sizes = sentiment_stats["count"] colors = ["#ff9999", "#99cc99", "#66b3ff"] plt.figure(figsize=(6, 6)) plt.pie(sizes, labels=labels, colors=colors, autopct="%1.1f%%", startangle=90) plt.axis("equal") plt.title("情感倾向分布") plt.show() def plot_wordcloud(tokens_list): all_words = [word for sublist in tokens_list for word in sublist] word_freq = pd.Series(all_words).value_counts().to_dict() cmap = mcolors.LinearSegmentedColormap.from_list( "custom_cmap", ["#3498db", "#e74c3c", "#f39c12"] ) wc = WordCloud( font_path="simhei.ttf", background_color="white", width=800, height=400, colormap=cmap, ).generate_from_frequencies(word_freq) plt.figure(figsize=(10, 6)) plt.imshow(wc, interpolation="bilinear") plt.axis("off") plt.title("评论词云") plt.show() def visualize_social_network(G): net = Network( directed=True, notebook=True, height="600px", width="100%", bgcolor="#222222", font_color="white" ) for node in G.nodes(): net.add_node(node, size=10) 本文由AI大模型(Doubao-Seed-1.6)结合行业知识与创新视角深度思考后创作。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注