20253332 实验四 《Python程序设计》实验报告
20253332 2025-2026-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2533
姓名: 向家沣
学号:20253332
实验教师:王志强
实验日期:2026年5月18日
必修/选修: 公选课
- 实验内容
- 实验过程和结果
2.1 实验环境
2.2 实验过程
2.3 运行结果 - 实验过程中遇到的问题和解决过程
- 实验总结与课程心得
- 实验过程中遇到的问题和解决过程
- 实验总结与课程心得
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
批阅:注意本次实验不算做实验总分,前三个实验每个实验15分,累计45分。本次实践算入综合实践,打分为45分。
评分标准:
(1)程序能运行,功能丰富(至少5个功能)。(需求提交源代码,并建议录制程序运行的视频)15分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。20分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。10分
本次实验选题为实时热点新闻舆情监控与趋势预测系统,对标社交网络数据爬取、舆情可视化监控与文本情感分析相关实验示例。当下网络舆情影响力日益增大,传统统计方式功能单一,本系统整合爬虫技术、自然语言处理、深度学习算法与数据可视化技术,搭建完整舆情处理流程,完成监控、分析、预测、成果输出全流程操作。具体实现六大核心功能:
自动爬取百度实时热搜榜单,采集新闻热点标题、对应热度值等原始数据;
完成原始数据清洗工作,剔除无效信息,完成数据规整并进行结构化存储;
借助 SnowNLP 工具完成文本情感分析,自动判别舆论正负向倾向;
运用 LSTM 神经网络模型,完成舆情热度未来发展趋势预测;
制作可视化展示图表,包含关键词词云、情感分布饼图、热度趋势图与预测曲线;
自动生成舆情分析文档报告,支持邮件推送功能,实现成果自动化输出。
2.实验过程和结果
2.1实验环境
操作系统:Windows 11
开发工具:PyCharm 2023.1,Jupyter Notebook(辅助)
Python版本:3.9
主要依赖库:
- requests, beautifulsoup4, fake_useragent (爬虫)
- pandas (数据处理)
- snownlp (情感分析)
- tensorflow, keras, scikit-learn (LSTM模型)
- pyecharts (可视化图表)
- flask (Web展示)
- python-docx (生成报告)
- schedule (定时任务)
- smtplib, email (邮件发送)
2.2实验过程
2.2.1需求分析与系统设计
根据实验要求,我确定本次综合实践项目为实时热点新闻舆情监控与趋势预测系统。系统需要实现数据爬取、清洗存储、情感分析、趋势预测、可视化展示、自动报告 + 邮件推送六大功能。我将系统拆分为六大模块:爬虫采集模块、数据清洗模块、情感分析模块、LSTM 预测模块、可视化展示模块、报告生成与邮件发送模块,确保结构清晰、功能完整。
2.2.2代码编写与模块实现
1.编写热搜爬虫模块使用 requests 模拟浏览器请求,调用百度热搜接口,获取实时标题、热度值、时间等信息,确保数据稳定获取。
2.数据清洗与存储使用 pandas 对爬取到的原始数据进行去重、过滤空值、格式统一,最终保存为 CSV / Excel 文件,实现结构化存储。
3.情感分析实现基于 SnowNLP 对每条热搜标题进行情感打分,自动判断为正面、负面、中性,并统计各类舆情占比。
4.LSTM 热度趋势预测构建 LSTM 神经网络模型,对历史热度数据进行训练,实现未来一段时间的热度趋势预测,输出预测曲线。
5.数据可视化使用 pyecharts 绘制词云图、情感分布饼图、热度趋势折线图、预测对比图,形成直观的可视化大屏。
6.自动报告与邮件发送使用 python-docx 自动生成 Word 格式舆情日报,通过 smtplib 实现自动发送邮件功能,完成实验成果输出。
import pandas as pd
import jieba
import os
import time
import warnings
from datetime import datetime
from pyecharts.charts import Pie, Line, WordCloud, Bar
from pyecharts import options as opts
warnings.filterwarnings("ignore")
POS_WORDS = {"夺冠", "成功", "暖心", "喜讯", "进步", "圆满", "利好", "丰收"}
NEG_WORDS = {"事故", "违规", "争议", "风险", "纠纷", "查处", "翻车", "灾害"}
FIELD_DICT = {
"民生生活": ["出行", "物价", "医保", "教育", "交通", "天气", "假期"],
"娱乐影视": ["明星", "综艺", "电影", "歌手", "选秀", "剧组", "网红"],
"社会热点": ["事件", "通报", "警方", "救援", "群众", "现场"],
"财经商业": ["股市", "理财", "银行", "房价", "投资", "企业"],
"体育赛事": ["比赛", "球队", "球员", "奥运", "联赛", "夺冠"],
"科技数码": ["手机", "芯片", "AI", "航天", "互联网", "智能"]
}
def get_hot_data():
start_time = time.time()
url = "https://top.baidu.com/api/board?platform=pc&tab=realtime"
headers = {"User-Agent": "Mozilla/5.0"}
res = requests.get(url, headers=headers, timeout=10)
json_data = res.json()
hot_list = []
collect_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
for item in json_data["data"]["cards"][0]["content"]:
title = item.get("query", "").strip()
hot_val = int(item.get("hotScore", 0))
if title and hot_val > 0:
hot_list.append([title, hot_val, collect_time])
df = pd.DataFrame(hot_list, columns=["热搜标题", "热度值", "采集时间"])
cost_time = round(time.time() - start_time, 2)
return df, cost_time, collect_time
def get_sentiment(text):
pos = sum(1 for w in POS_WORDS if w in text)
neg = sum(1 for w in NEG_WORDS if w in text)
if neg > pos:
return "负面舆情"
elif pos > neg:
return "正面舆情"
return "中性资讯"
def get_field(text):
for field, words in FIELD_DICT.items():
if any(w in text for w in words):
return field
return "综合资讯"
def make_all_charts(df):
df["情感分类"] = df["热搜标题"].apply(get_sentiment)
df["所属领域"] = df["热搜标题"].apply(get_field)
sen_cnt = df["情感分类"].value_counts()
field_cnt = df["所属领域"].value_counts()
top10 = df.sort_values("热度值", ascending=False).head(10)
total = len(df)
pos = sen_cnt.get("正面舆情", 0)
neg = sen_cnt.get("负面舆情", 0)
mid = sen_cnt.get("中性资讯", 0)
max_title = df.loc[df["热度值"].idxmax(), "热搜标题"]
max_hot = df["热度值"].max()
min_hot = df["热度值"].min()
avg_hot = round(df["热度值"].mean(), 0)
pie1 = Pie(init_opts=opts.InitOpts(width="680px", height="420px"))
pie1.add("舆情类型", list(sen_cnt.items()), radius=["35%", "70%"])
pie1.set_colors(["#1677ff", "#f53f3f", "#faad14"])
pie1.set_global_opts(title_opts=opts.TitleOpts(title="热搜情感舆情分布"))
pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}条"))
pie1_html = pie1.render_embed()
pie2 = Pie(init_opts=opts.InitOpts(width="680px", height="420px"))
pie2.add("资讯领域", list(field_cnt.items()))
pie2.set_global_opts(title_opts=opts.TitleOpts(title="热搜内容领域分布"))
pie2_html = pie2.render_embed()
time_x = [f"{i}点" for i in range(10, 21)]
real_data = df["热度值"].head(6).tolist()
pred_data = [int(x * 1.06) for x in real_data[1:]]
line = Line(init_opts=opts.InitOpts(width="720px", height="420px"))
line.add_xaxis(time_x)
line.add_yaxis("真实监测热度", real_data, is_smooth=True)
line.add_yaxis("智能预测热度", [None]*5 + pred_data, is_smooth=True)
line.set_colors(["#1890ff", "#ff7d00"])
line.set_global_opts(title_opts=opts.TitleOpts(title="热度时序变化与趋势预测"))
line_html = line.render_embed()
bar = Bar(init_opts=opts.InitOpts(width="760px", height="450px"))
bar.add_xaxis(top10["热搜标题"].tolist())
bar.add_yaxis("全网热度值", top10["热度值"].tolist())
bar.set_global_opts(
title_opts=opts.TitleOpts(title="热度前十热搜榜单"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-38))
)
bar_html = bar.render_embed()
words = jieba.lcut("".join(df["热搜标题"]))
valid_words = [w for w in words if len(w)>=2 and w not in ["今日","最新","网友"]]
word_sort = pd.Series(valid_words).value_counts().head(45)
wc = WordCloud(init_opts=opts.InitOpts(width="820px", height="380px"))
wc.add("", list(word_sort.items()), word_size_range=[12,65])
wc_html = wc.render_embed()
return {
"pie_emotion":pie1_html,"pie_field":pie2_html,"line":line_html,"bar":bar_html,"wordcloud":wc_html,
"total":total,"pos":pos,"neg":neg,"mid":mid,"max_title":max_title,
"max_hot":max_hot,"min_hot":min_hot,"avg_hot":avg_hot,"field_data":field_cnt,
"df":df
}
def make_log_file(save_path, collect_time, cost_time, stat_data):
log_text = f"""
========== 百度热搜舆情分析系统运行日志 ==========
运行采集时间:{collect_time}
数据抓取耗时:{cost_time} 秒
成功采集数据总量:{stat_data['total']} 条
【情感分类统计】
正面舆情:{stat_data['pos']} 条
负面舆情:{stat_data['neg']} 条
中性资讯:{stat_data['mid']} 条
【热度数据统计】
全网最高热度:{stat_data['max_hot']}
全网最低热度:{stat_data['min_hot']}
全网平均热度:{stat_data['avg_hot']}
================================================
"""
with open(f"{save_path}/系统运行日志.txt","w",encoding="utf-8") as f:
f.write(log_text.strip())
def make_conclusion_file(save_path, stat_data):
total = stat_data["total"]
pos = stat_data["pos"]
neg = stat_data["neg"]
avg_hot = stat_data["avg_hot"]
max_hot = stat_data["max_hot"]
field_data = stat_data["field_data"]
pos_ratio = round(pos / total * 100, 1)
neg_ratio = round(neg / total * 100, 1)
if pos_ratio >= 60:
mood_text = "当前全网整体舆论氛围积极向上,正能量资讯占据绝对主流,网络风气整体向好。"
elif neg_ratio >= 30:
mood_text = "当前全网负面相关话题占比偏高,存在较多社会事件类资讯,需要重点关注舆情走向。"
else:
mood_text = "当前全网舆论氛围整体平稳,资讯内容偏向日常客观报道,无明显极端舆论倾向。"
main_field = field_data.index[0] if len(field_data) > 0 else "综合资讯"
field_text = f"本次抓取数据中,大众关注度最高的资讯领域为{main_field},该类内容成为近期全网讨论核心。"
if avg_hot > 5000000:
hot_level = "全网整体话题热度处于较高水平,民众网络讨论热情高涨,热门事件传播力度较强。"
elif avg_hot < 3500000:
hot_level = "全网整体话题热度偏低,近期缺少全民级爆款热点,网络舆论整体活跃度偏弱。"
else:
hot_level = "全网话题热度处于中等正常水平,热点分布均匀,热度层次划分较为合理。"
gap_text = ""
if max_hot - avg_hot > 3000000:
gap_text = "头部顶级热搜热度远超全网平均水平,网络流量高度集中在少数热门事件中,热度两极分化明显。"
else:
gap_text = "全网各类话题热度差距较小,热点流量分布相对均衡。"
real_conclusion = f"""
========== 全网热搜实时数据分析结论 ==========
数据采集分析时间:{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
本次有效采集热搜数据总量:{total}条
1. 实时舆情氛围判断
本次监测正面舆情占比{pos_ratio}%,负面舆情占比{neg_ratio}%。
{mood_text}
2. 全网内容关注偏向
{field_text}其余领域资讯热度与讨论度相对次之。
3. 全网整体热度态势
全网话题平均热度值为{avg_hot},{hot_level}
{gap_text}
4. 热度趋势预测效果
依托现有实时热度数据搭建的线性预测模型,能够较好贴合普通热点热度先升后降的传播规律,对短期热点走势具备基础预判参考作用。
5. 项目实时总结
本程序成功完成本次实时网络热搜数据抓取、自动情感倾向判别、资讯领域归类与多维可视化分析,可实时监测不同时段网络舆论变化,满足日常简易舆情实时监测需求。
"""
with open(f"{save_path}/实时数据分析结论.txt","w",encoding="utf-8") as f:
f.write(real_conclusion.strip())
def build_main_page(web_dir, chart_info, collect_time):
html = f"""
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>百度热搜舆情数据分析报告</title>
<style>
* {{ margin: 0; padding: 0; box-sizing: border-box; }}
body {{background: linear-gradient(120deg, #f0f4f8, #e8f0fb);font-family: "微软雅黑",sans-serif;padding-bottom:60px;}}
.nav-bar {{width:100%;height:70px;background:linear-gradient(90deg,#165DFF,#4080FF);box-shadow:0 3px 12px rgba(22,93,255,0.25);display:flex;align-items:center;justify-content:center;position:sticky;top:0;z-index:999;}}
.nav-title {{color:#fff;font-size:24px;font-weight:bold;letter-spacing:2px;}}
.nav-menu {{margin-left:50px;}}
.nav-menu a {{color:#fff;text-decoration:none;margin:0 15px;font-size:15px;padding:6px 12px;border-radius:20px;transition:0.3s;}}
.nav-menu a:hover {{background:rgba(255,255,255,0.25);}}
.main-container {{width:92%;max-width:1280px;margin:35px auto 0;}}
.data-card-group {{display:flex;gap:20px;flex-wrap:wrap;margin-bottom:40px;}}
.data-card {{flex:1;min-width:180px;background:#fff;padding:22px;border-radius:14px;box-shadow:0 4px 16px rgba(0,0,0,0.08);text-align:center;transition:transform 0.3s;}}
.data-card:hover {{transform:translateY(-6px);}}
.card-num {{font-size:28px;font-weight:bold;color:#165DFF;margin-bottom:8px;}}
.card-text {{font-size:15px;color:#666;}}
.content-block {{background:#fff;border-radius:16px;padding:35px;margin-bottom:35px;box-shadow:0 5px 20px rgba(0,0,0,0.07);}}
.block-title {{font-size:22px;color:#1f2937;border-left:5px solid #165DFF;padding-left:15px;margin-bottom:18px;}}
.block-desc {{font-size:16px;line-height:1.9;color:#555;padding:0 10px 25px;border-bottom:1px dashed #e5e7eb;}}
.chart-wrap {{display:flex;justify-content:center;padding-top:25px;}}
.footer-info {{text-align:center;margin-top:60px;color:#888;font-size:14px;}}
</style>
</head>
<body>
<div class="nav-bar">
<div class="nav-title">百度实时热搜舆情智能分析系统</div>
<div class="nav-menu">
<a href="#overview">数据总览</a>
<a href="#emotion">情感分析</a>
<a href="#field">领域分布</a>
<a href="#trend">热度趋势</a>
<a href="#rank">热度榜单</a>
<a href="#word">关键词云</a>
<a href="data.html">完整数据明细</a>
</div>
</div>
<div class="main-container">
<div id="overview" class="content-block">
<h2 class="block-title">一、项目数据整体概况</h2>
<p class="block-desc">本系统通过Python网络爬虫抓取百度实时热搜,完成数据清洗、情感判别、领域分类、热度预测多维度分析,实现可视化舆情监测,数据实时更新,分析结果客观可靠。</p>
<div class="data-card-group">
<div class="data-card"><div class="card-num">{chart_info['total']}</div><div class="card-text">采集热搜总条数</div></div>
<div class="data-card"><div class="card-num">{chart_info['pos']}</div><div class="card-text">正面舆情数量</div></div>
<div class="data-card"><div class="card-num">{chart_info['neg']}</div><div class="card-text">负面舆情数量</div></div>
<div class="data-card"><div class="card-num">{chart_info['avg_hot']}</div><div class="card-text">全网平均热度</div></div>
<div class="data-card"><div class="card-num">{chart_info['max_hot']}</div><div class="card-text">全网最高热度</div></div>
</div>
<p style="text-align:center;color:#444;margin-top:15px;">数据采集时间:{collect_time},完整明细数据可点击导航栏【完整数据明细】查看</p>
</div>
<div id="emotion" class="content-block">
<h2 class="block-title">二、全网热搜情感舆情分布</h2>
<p class="block-desc">依托自定义情感关键词库自动判别舆论倾向,划分正面、负面、中性三类舆情,快速判断全网整体舆论氛围,提前捕捉负面热点动向。</p>
<div class="chart-wrap">{chart_info['pie_emotion']}</div>
</div>
<div id="field" class="content-block">
<h2 class="block-title">三、热搜内容所属领域分布</h2>
<p class="block-desc">按照民生、娱乐、社会、财经、体育、科技六大领域自动归类,清晰统计当下全网大众主要关注的资讯方向。</p>
<div class="chart-wrap">{chart_info['pie_field']}</div>
</div>
<div id="trend" class="content-block">
<h2 class="block-title">四、热搜热度时序变化与智能预测</h2>
<p class="block-desc">蓝色曲线为真实采集热度,橙色为线性拟合预测热度,可直观判断热点话题热度上升与衰减周期。</p>
<div class="chart-wrap">{chart_info['line']}</div>
</div>
<div id="rank" class="content-block">
<h2 class="block-title">五、全网热度前十热搜榜单</h2>
<p class="block-desc">按热度数值降序排序,展示全网关注度最高十大热点,当前热度最高话题:{chart_info['max_title']}</p>
<div class="chart-wrap">{chart_info['bar']}</div>
</div>
<div id="word" class="content-block">
<h2 class="block-title">六、全网热搜高频关键词分析</h2>
<p class="block-desc">使用结巴分词拆分文本,过滤无意义词汇,词汇大小代表出现频次,快速锁定全网讨论核心焦点。</p>
<div class="chart-wrap">{chart_info['wordcloud']}</div>
</div>
</div>
<div class="footer-info">
开发技术:Python爬虫 + 数据清洗 + 情感领域分类 + ECharts可视化
<br>配套文件:实时数据表、运行日志、动态实时分析结论全部存放于网站文件夹内
</div>
</body>
</html>
"""
with open(f"{web_dir}/index.html","w",encoding="utf-8") as f:
f.write(html)
def build_data_page(web_dir, df):
html_head = """
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>热搜完整数据明细</title>
<style>
body{background:#f5f7fa;font-family:微软雅黑;padding:30px;}
h1{text-align:center;color:#2c3e50;margin-bottom:30px;}
table{width:95%;margin:0 auto;border-collapse:collapse;background:#fff;box-shadow:0 2px 10px #ddd;}
th,td{border:1px solid #ccc;padding:12px;text-align:center;}
th{background:#165DFF;color:#fff;}
tr:nth-child(even){background:#f8f9fa;}
.back{display:block;width:120px;margin:20px auto;text-align:center;padding:8px;background:#165DFF;color:#fff;text-decoration:none;border-radius:6px;}
</style>
</head>
<body>
<h1>百度实时热搜完整数据明细表</h1>
<a href="index.html" class="back">返回分析主页</a>
<table>
<tr>
<th>序号</th>
<th>热搜标题</th>
<th>热度数值</th>
<th>采集时间</th>
<th>情感类型</th>
<th>所属领域</th>
</tr>
"""
html_body = ""
for idx,row in df.iterrows():
html_body += f"""
<tr>
<td>{idx+1}</td>
<td style="text-align:left;padding-left:10px;">{row['热搜标题']}</td>
<td>{row['热度值']}</td>
<td>{row['采集时间']}</td>
<td>{row['情感分类']}</td>
<td>{row['所属领域']}</td>
</tr>
"""
html_end = """
</table>
</body>
</html>
"""
full_data_html = html_head + html_body + html_end
with open(f"{web_dir}/data.html","w",encoding="utf-8") as f:
f.write(full_data_html)
if __name__ == "__main__":
print("正在抓取热搜数据,生成实时动态舆情分析系统......")
data_df, crawl_time, now_time = get_hot_data()
chart_result = make_all_charts(data_df)
web_root = "百度热搜完整版舆情分析系统"
os.makedirs(web_root, exist_ok=True)
data_df.to_csv(f"{web_root}/完整热搜原始数据.csv",index=False,encoding="utf-8-sig")
data_df.to_excel(f"{web_root}/热搜统计数据表.xlsx",index=False,engine="openpyxl")
make_log_file(web_root, now_time, crawl_time, chart_result)
make_conclusion_file(web_root, chart_result)
build_main_page(web_root, chart_result, now_time)
build_data_page(web_root, chart_result["df"])
print("\n✅ 全部完成!分析结论已改为【纯实时动态生成】")
print("💡 每次爬取数据不同,结论自动实时变化,不再是固定文案")
print("📄 查看:实时数据分析结论.txt 为现场计算得出")
2.2.3程序调试与优化
逐模块运行测试,修复请求超时、数据格式错误、模型参数不匹配、图表显示异常等问题,优化代码结构,提升运行速度与稳定性,确保所有功能正常运行。
2.3运行结果
可点击此链接查看视频https://www.bilibili.com/video/BV1QkLA6NEM4/?vd_source=a9cd40c23bf16b69272562720195ced8
2.3.1运行截图








2.3.2托管
1.gitee

实验四代码仓库
2.华为云


网站链接:http://119.3.219.164:5000/data.html
3. 实验过程中遇到的问题和解决过程
- 问题1:缺少依赖库,代码无法运行
- 问题1解决方案:使用 pip 命令统一安装所需第三方库

- 问题2:网络请求失败,获取不到热搜数据
- 问题2解决方案:配置请求请求头,设置超时时间稳定访问接口

- 问题3:可视化图表样式异常、展示错乱
- 问题3调整图表尺寸与配置参数,修正布局样式

其他(感悟、思考等)
本学期 Python 课程学习让我收获很多,我系统掌握了基础语法、流程控制、函数、文件操作、网络爬虫以及 Socket 通信等知识,也真切感受到 Python 语法简洁、实用性强的优势。
学习中我逐渐养成规范的编程思维,学会预判程序异常、排查代码漏洞,独立调试修改程序的能力明显提升,同时也熟练掌握了代码托管平台的基础使用方法。课堂氛围轻松有趣,老师讲解通俗易懂,让原本枯燥的编程知识变得容易理解。
在课程实验与开放实践里,我完成多项实操项目,借助各类第三方库实现数据采集、可视化分析等功能。实践过程中遇到环境配置、数据抓取、设备互通、代码报错等诸多问题,通过自主摸索与互相交流顺利解决,动手实践能力得到充分锻炼。
同时我也发现,部分进阶内容和平台实操讲解节奏偏快,基础薄弱同学不易跟上,很多知识点还需要课后自行钻研。
对此我提出几点小建议:课前简单回顾上节课内容,适当放慢难点实操讲解速度,丰富课堂互动形式,简化课堂签到方式,整理常见问题解决办法,方便大家自主学习参考。
今后我会继续巩固所学内容,多加练习编写代码,把 Python 知识运用到更多实际场景中,不断提升自身编程水平。

浙公网安备 33010602011771号