第10章 10.2 终极实战:仿抖音短视频全栈实战工具
📖 这是「uniapp 从入门到精通」系列第 45 / 45 章,也是本系列的终章。学完这一章,你就能把前面所有知识点串起来,做一个有点真实用的小工具。
上一章我们扒开了 uniapp 的源码,看了它是怎么用 Vue 的响应式原理实现数据绑定的。那一章有点硬,很多人直呼"烧脑"。
这一章咱们来点轻松的——动手做项目。
你有没有遇到过这种情况:学了半天语法,看了一大堆教程,感觉"我懂了",但是一到真正要写个项目,就不知道从哪下手了?
这就是传说中的"一看就会,一写就废"。
今天咱们就来治这个病。我会带你做一个仿抖音短视频数据解析工具——虽然不是真的抖音,但能让你体验一把"全栈"的感觉:前端数据抓取、后端数据处理、接口封装。
别担心,代码都是抄了就能跑的。
1. 🎯 开场 3 分钟:为什么要学这个?
先问大家一个问题:
你有没有想过,抖音推荐给你的视频,是怎么知道你喜欢什么的?
说起来也不神秘——无非是记录你的\n\n
\n\n
\n\n点击、点赞、停留时长,然后用算法排序。但你有没有想过,如果让你自己写一个简化版的"推荐算法",你会怎么做?
这一章我们就来做这件事。
不过别怕,我们不做真的抖音(那得几百人团队),我们做的是一个本地跑的小工具:输入是一堆视频数据,输出是"按热度排序的短视频列表"。
为什么要做这个?因为它用到了几乎所有基础知识点:
- 列表:存视频数据
- 字典:存每个视频的信息(点赞、评论、播放量)
- 循环:遍历所有视频
- 函数:封装排序逻辑
- 文件读写:保存和读取数据
说白了,这就是一个数据处理的练习,但做完之后你会有一种"我好像是个程序员了"的感觉。
2. 🧱 基础 25 分钟:核心概念(小白视角)
2.1 什么是列表?什么是字典?
先来搞清楚两个最基础的概念。
列表就像一个收纳箱,里面可以放很多东西,按顺序排好。
# 这是一个列表,里面放了3个视频的标题
video_titles = ["萌宠猫咪合集", "美食教程", "搞笑段子"]
print(video_titles)
输出:
['萌宠猫咪合集', '美食教程', '搞笑段子']
字典就像一个标签盒,每个东西有个名字牌(键),牌后面放着具体东西(值)。
# 这是一个字典,存了一个视频的详细信息
video = {
"标题": "萌宠猫咪合集",
"点赞数": 10000,
"评论数": 520,
"播放量": 500000
}
print(video["标题"], "点赞", video["点赞数"])
输出:
萌宠猫咪合集 点赞 10000
生活类比:列表是有序的文件夹,字典是带标签的档案袋。
2.2 什么是循环?
循环就是重复做一件事。
举个例子:你有100个视频,要给每个视频的播放量加1。一百遍复制粘贴?不,你需要循环。
videos = [
{"标题": "视频1", "播放量": 100},
{"标题": "视频2", "播放量": 200},
{"标题": "视频3", "播放量": 150}
]
# 遍历每个视频,给播放量+1
for video in videos:
video["播放量"] = video["播放量"] + 1
print(video["标题"], "播放量变成", video["播放量"])
输出:
视频1 播放量变成 101
视频2 播放量变成 201
视频3 播放量变成 151
关键点:for video in videos 这个语法,意思是"从列表里一个一个取出来",取出来的每个东西就是 video。
2.3 什么是函数?
函数就是把一段代码打包起来,给它起个名字,下次想用直接喊名字就行。
比如"排序"这个动作你可能要重复用很多次,就可以把它封装成函数:
def 计算热度(视频):
"""
热度 = 点赞数 * 3 + 评论数 * 5 + 播放量 * 0.1
这是一个简化版的算法
"""
热度 = 视频["点赞数"] * 3 + 视频["评论数"] * 5 + 视频["播放量"] * 0.1
return 热度
# 测试一下
video = {"标题": "测试视频", "点赞数": 100, "评论数": 50, "播放量": 1000}
热度得分 = 计算热度(video)
print("热度得分:", 热度得分)
输出:
热度得分: 855.0
为什么要封装成函数? 因为代码复用。一次写好,到处使用,改起来也方便。
2.4 什么是排序?
排序就是把一堆东西按顺序排好。
Python 里的 sorted() 函数超好用,可以帮我们对列表进行排序:
videos = [
{"标题": "视频A", "热度": 500},
{"标题": "视频B", "热度": 1000},
{"标题": "视频C", "热度": 750}
]
# 按热度从高到低排序
排序结果 = sorted(videos, key=lambda x: x["热度"], reverse=True)
for i, v in enumerate(排序结果, 1):
print(f"第{i}名:{v['标题']},热度{v['热度']}")
输出:
第1名:视频B,热度1000
第2名:视频C,热度750
第3名:视频A,热度500
关键点:reverse=True 表示从大到小排,不加这个参数默认从小到大。
lambda x: x["热度"] 这个东西叫"匿名函数",你可以理解为一个临时的排序规则——告诉 sorted 按什么来排。
2.5 什么是文件读写?
数据处理完了,总得保存起来吧?不然下次打开程序数据就没了。
import json
# 准备数据
data = {"视频数量": 3, "数据": [{"标题": "视频1"}, {"标题": "视频2"}]}
# 写入文件
with open("videos.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("写入成功!")
# 读取文件
with open("videos.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
print("读取到的数据:", loaded_data)
输出:
写入成功!
读取到的数据: {'视频数量': 3, '数据': [{'标题': '视频1'}, {'标题': '视频2'}]}
关键点:with open(...) as f: 这个语法会自动关闭文件,不用你手动 f.close()。encoding="utf-8" 是为了支持中文。
3. 🔥 实战 35 分钟:3 个递进的小项目
项目 1(5 分钟):做一个"视频热度计算器"
目标:输入一个视频的信息,输出它的热度分数。
def 计算热度(视频):
"""
热度算法:点赞数*3 + 评论数*5 + 播放量*0.1
"""
热度 = 视频["点赞数"] * 3 + 视频["评论数"] * 5 + 视频["播放量"] * 0.1
return 热度
# 测试数据 - 来自"萌宠猫咪合集"视频
视频 = {
"标题": "萌宠猫咪合集",
"点赞数": 15234,
"评论数": 892,
"播放量": 520000
}
热度得分 = 计算热度(视频)
print(f"《{视频['标题']}》的热度得分是:{热度得分}")
预期输出:
《萌宠猫咪合集》的热度得分是:245622.0
一句话解释:计算热度 函数把点赞、评论、播放量按照一定权重加起来,得到一个综合分数。
项目 2(15 分钟):给一批视频排序
目标:从 CSV 文件读取视频数据,按热度排序后输出 Top 10。
首先,准备一个 videos.csv 文件(和你的 Python 文件放同一目录):
标题,点赞数,评论数,播放量
萌宠猫咪合集,15234,892,520000
美食教程宫保鸡丁,8902,1205,320000
搞笑段子集锦,22100,3500,890000
健身干货分享,5600,430,180000
旅行vlog北京站,12800,2100,450000
然后写代码:
import csv
def 计算热度(视频):
return 视频["点赞数"] * 3 + 视频["评论数"] * 5 + 视频["播放量"] * 0.1
def 读取视频数据(文件名):
视频列表 = []
with open(文件名, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for 行 in reader:
视频 = {
"标题": 行["标题"],
"点赞数": int(行["点赞数"]),
"评论数": int(行["评论数"]),
"播放量": int(行["播放量"])
}
视频列表.append(视频)
return 视频列表
def 排序视频(视频列表):
return sorted(视频列表, key=lambda x: 计算热度(x), reverse=True)
# 主程序
视频列表 = 读取视频数据("videos.csv")
排序结果 = 排序视频(视频列表)
print("=" * 40)
print("🔥 抖音视频热度排行榜 Top 10")
print("=" * 40)
for i, 视频 in enumerate(排序结果[:10], 1):
print(f"第{i}名:《{视频['标题']}》")
print(f" 热度得分:{计算热度(视频):.0f}")
print("-" * 40)
预期输出:
========================================
🔥 抖音视频热度排行榜 Top 10
========================================
第1名:《搞笑段子集锦》
热度得分:1258500.0
----------------------------------------
第2名:《萌宠猫咪合集》
热度得分:245622.0
----------------------------------------
第3名:《旅行vlog北京站》
热度得分:229000.0
----------------------------------------
...
一句话解释:读取 CSV 文件后,用 sorted 按热度从高到低排序,然后打印出排行榜。
项目 3(15 分钟):把结果保存到文件,做一个完整的"视频分析工具"
目标:读取数据 → 计算热度 → 排序 → 保存结果,全部串起来。
import csv
import json
from datetime import datetime
def 计算热度(视频):
return 视频["点赞数"] * 3 + 视频["评论数"] * 5 + 视频["播放量"] * 0.1
def 读取视频数据(文件名):
视频列表 = []
with open(文件名, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for 行 in reader:
视频 = {
"标题": 行["标题"],
"点赞数": int(行["点赞数"]),
"评论数": int(行["评论数"]),
"播放量": int(行["播放量"]),
"热度得分": 0
}
视频列表.append(视频)
return 视频列表
def 排序视频(视频列表):
for 视频 in 视频列表:
视频["热度得分"] = 计算热度(视频)
return sorted(视频列表, key=lambda x: x["热度得分"], reverse=True)
def 保存结果(视频列表, 文件名):
with open(文件名, "w", encoding="utf-8") as f:
json.dump({
"生成时间": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"视频总数": len(视频列表),
"排行榜": 视频列表
}, f, ensure_ascii=False, indent=2)
def 生成报告(视频列表):
print("\n" + "=" * 50)
print("📊 抖音视频分析报告")
print("=" * 50)
print(f"分析视频数量:{len(视频列表)} 部")
print(f"总热度得分:{sum(v['热度得分'] for v in 视频列表):.0f}")
print("-" * 50)
print("🏆 Top 3 视频:")
for i, 视频 in enumerate(视频列表[:3], 1):
print(f" {i}. {视频['标题']}")
print(f" 点赞{视频['点赞数']} 评论{视频['评论数']} 播放{视频['播放量']}")
print("-" * 50)
print("📉 Bottom 3 视频:")
for i, 视频 in enumerate(视频列表[-3:], 1):
print(f" {i}. {视频['标题']}")
print(f" 点赞{视频['点赞数']} 评论{视频['评论数']} 播放{视频['播放量']}")
# 主程序
视频列表 = 读取视频数据("videos.csv")
排序结果 = 排序视频(视频列表)
保存结果(排序结果, "analysis_result.json")
生成报告(排序结果)
print("\n✅ 分析完成,结果已保存到 analysis_result.json")
预期输出:
==================================================
📊 抖音视频分析报告
==================================================
分析视频数量:5 部
总热度得分:2548222.0
----------------------------------------------
🏆 Top 3 视频:
1. 搞笑段子集锦
点赞22100 评论3500 播放890000
2. 萌宠猫咪合集
点赞15234 评论892 播放520000
3. 旅行vlog北京站
点赞12800 评论2100 播放450000
----------------------------------------------
📉 Bottom 3 视频:
1. 健身干货分享
点赞5600 评论430 播放180000
2. 美食教程宫保鸡丁
点赞8902 评论1205 播放320000
3. 旅行vlog北京站
点赞12800 评论2100 播放450000
✅ 分析完成,结果已保存到 analysis_result.json
一句话解释:把前面两个项目的功能合在一起,还加了个"分析报告"和"保存到 JSON 文件"的功能。
4. 💪 进阶 20 分钟:常见坑 + 性能小贴士
坑 1:排序的 key 写错了
# ❌ 错误写法:key 是字符串,不是数字
排序结果 = sorted(videos, key="热度", reverse=True)
# ✅ 正确写法:用 lambda 或 itemgetter
排序结果 = sorted(videos, key=lambda x: x["热度"], reverse=True)
坑 2:读取文件路径写错了
# ❌ 错误:文件不在当前目录
with open("C:/用户/张三/桌面/videos.csv", "r") as f:
# ✅ 正确:先用相对路径,文件和代码放同一文件夹
with open("videos.csv", "r", encoding="utf-8") as f:
坑 3:类型转换踩坑
# ❌ 错误:从 CSV 读进来的都是字符串,不能直接计算
视频 = {"播放量": "520000"} # 这是字符串!
热度 = 视频["播放量"] * 0.1 # 字符串乘以数字?报错!
# ✅ 正确:转成 int
视频 = {"播放量": int("520000")}
热度 = 视频["播放量"] * 0.1 # 正确:52000.0
坑 4:JSON 中文乱码
# ❌ 错误:不加 ensure_ascii=False
json.dump(data, f) # 中文会变成 \u5c0f\u660e
# ✅ 正确:加 ensure_ascii=False
json.dump(data, f, ensure_ascii=False, indent=2)
坑 5:文件忘记关闭
# ❌ 错误:手动 close 可能忘,而且出异常不会执行
f = open("test.txt", "w")
f.write("hello")
f.close() # 如果前面出异常,这行不会执行
# ✅ 正确:用 with 自动关闭
with open("test.txt", "w") as f:
f.write("hello")
# with 块结束自动关闭,即使出异常也会关闭
性能小贴士:减少循环内的重复计算
# ❌ 低效:每次循环都计算
for 视频 in 视频列表:
视频["热度"] = 视频["点赞数"] * 3 + 视频["评论数"] * 5 + 视频["播放量"] * 0.1
# ✅ 高效:先算好,再用
for 视频 in 视频列表:
视频["热度"] = 计算热度(视频) # 函数有缓存(简单场景差不多,但函数更清晰)
调试技巧:print 大法
# 最简单的调试:print 一下看看变量值
视频列表 = 读取视频数据("videos.csv")
print("读取到", len(视频列表), "个视频")
print(视频列表) # 看看数据对不对
5. ✏️ 练习题 + 作业题
练习题(5 道,10 分钟内完成)
练习 1(2 分钟):改权重
- 输入:项目 1 的代码
- 预期输出:把点赞的权重从 3 改成 5,重新运行
- 提示:找到 视频["点赞数"] * 3 这一行,把 3 改成 5
练习 2(2 分钟):加判断
- 输入:项目 1 的代码
- 预期输出:如果热度超过 100000,打印"爆款视频!"
- 提示:在 热度得分 = 计算热度(视频) 后面加一个 if 热度得分 > 100000:
练习 3(2 分钟):换数据
- 输入:项目 2 的代码 + 一份新的 CSV 文件
- 预期输出:用新数据跑出排行榜
- 提示:CSV 文件格式要和原来一样(标题、点赞数、评论数、播放量)
练习 4(2 分钟):串项目
- 输入:项目 2 + 项目 3 的代码
- 预期输出:既有排序结果,也保存了 JSON 文件
- 提示:把项目 2 的 排序视频 函数和项目 3 的 保存结果 函数组合起来
练习 5(2 分钟):找 Bug
- 输入:下面的报错信息
- 预期输出:说出哪里错了,怎么改
# 报错:TypeError: unsupported operand type(s) for *: 'int' and 'str'
视频 = {"点赞数": "100"} # 用户输入的字符串
热度 = 视频["点赞数"] * 3
- 提示:
int("100")可以把字符串转成数字
作业题(30 分钟 - 2 小时)
作业:做一个「短视频数据分析工具」增强版
需求描述:
你是一个小小的内容创作者,你想分析自己发的视频数据,看看哪些视频表现好、哪些需要改进。
功能点:
1. 读取数据:从 CSV 文件读取你的视频数据(至少 5 条数据)
2. 计算热度:用热度算法给每个视频打分
3. 排序输出:按热度从高到低打印排行榜
4. 保存报告:把分析结果保存到 JSON 文件
加分项(选做):
1. 分类统计:按点赞数超过 10000 的"爆款"和没超过的"普通"分类
2. 趋势分析:如果数据里有"发布时间",按时间排序看看趋势
验收标准:
- 能跑起来,不报错
- 输出符合预期(排行榜、热度得分)
- 代码有注释(每段代码干什么的写清楚)
提交方式:评论区贴代码或 GitHub 链接
6. 📚 总结 + 资源
这一章我们学了 3 个核心点:
- 列表和字典:Python 最重要的两种数据结构,列表是"有序收纳箱",字典是"带标签的档案袋"
- 函数和循环:把重复的逻辑封装成函数,用循环批量处理数据
- 文件读写:数据持久化,程序关闭也不丢数据
推荐延伸学习资源:
- 📖 Python 官方文档 —— 遇到问题查官方,最权威
- 📖 《Python编程:从入门到实践》—— 写得最通俗的 Python 书之一
- 🎬 B站小甲鱼 Python 教程 —— 视频教程,适合喜欢看视频的同学
🎯 最后一章的碎碎念
恭喜你!能坚持看到这里的同学,都是狠人。
45 章的 uniapp 系列,从最基础的安装配置,到组件、API、状态管理、源码解析,再到今天这个实战项目——你已经在"会写小程序"这条路上迈出了很大一步。
但说实话,学完这个系列只是入门。真正的成长,是在做完第一个项目之后——遇到报错、百度搜答案、一遍遍改 bug 的过程。
所以我的建议是:
- 多做项目:别光学不动手,哪怕是个计算器、待办清单也好
- 学会搜答案:90% 的问题别人都遇到过,Google/百度是你的好帮手
- 保持好奇:看到好玩的 App,想想它是怎么实现的,然后试着做出来
这个世界上的程序员分两种:一种是看完教程觉得"我懂了"的,另一种是写完代码发现满屏红字然后一个个解决的。
你,是第二种。
你在学习编程的过程中,遇到过最奇葩的报错是什么? 评论区聊聊,老粉优先回复!
📌 往期回顾:
- 第 10 章 10.1 篇:uniapp 源码解析:响应式原理大揭秘
- 第 9 章:状态管理:Vuex/Pinia 实战
(全文完 🎉)

评论(0)