第10章 10.2 终极实战:仿抖音短视频全栈实战工具

📖 这是「uniapp 从入门到精通」系列第 45 / 45 章,也是本系列的终章。学完这一章,你就能把前面所有知识点串起来,做一个有点真实用的小工具。


上一章我们扒开了 uniapp 的源码,看了它是怎么用 Vue 的响应式原理实现数据绑定的。那一章有点硬,很多人直呼"烧脑"。

这一章咱们来点轻松的——动手做项目

你有没有遇到过这种情况:学了半天语法,看了一大堆教程,感觉"我懂了",但是一到真正要写个项目,就不知道从哪下手了?

这就是传说中的"一看就会,一写就废"。

今天咱们就来治这个病。我会带你做一个仿抖音短视频数据解析工具——虽然不是真的抖音,但能让你体验一把"全栈"的感觉:前端数据抓取、后端数据处理、接口封装。

别担心,代码都是抄了就能跑的。


1. 🎯 开场 3 分钟:为什么要学这个?

先问大家一个问题:

你有没有想过,抖音推荐给你的视频,是怎么知道你喜欢什么的?

说起来也不神秘——无非是记录你的\n\nSimple tech illustration expla\n\nAI comic creation scene, creat\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 个核心点:

  1. 列表和字典:Python 最重要的两种数据结构,列表是"有序收纳箱",字典是"带标签的档案袋"
  2. 函数和循环:把重复的逻辑封装成函数,用循环批量处理数据
  3. 文件读写:数据持久化,程序关闭也不丢数据

推荐延伸学习资源

  1. 📖 Python 官方文档 —— 遇到问题查官方,最权威
  2. 📖 《Python编程:从入门到实践》—— 写得最通俗的 Python 书之一
  3. 🎬 B站小甲鱼 Python 教程 —— 视频教程,适合喜欢看视频的同学

🎯 最后一章的碎碎念

恭喜你!能坚持看到这里的同学,都是狠人。

45 章的 uniapp 系列,从最基础的安装配置,到组件、API、状态管理、源码解析,再到今天这个实战项目——你已经在"会写小程序"这条路上迈出了很大一步。

但说实话,学完这个系列只是入门。真正的成长,是在做完第一个项目之后——遇到报错、百度搜答案、一遍遍改 bug 的过程。

所以我的建议是:

  • 多做项目:别光学不动手,哪怕是个计算器、待办清单也好
  • 学会搜答案:90% 的问题别人都遇到过,Google/百度是你的好帮手
  • 保持好奇:看到好玩的 App,想想它是怎么实现的,然后试着做出来

这个世界上的程序员分两种:一种是看完教程觉得"我懂了"的,另一种是写完代码发现满屏红字然后一个个解决的。

你,是第二种。


你在学习编程的过程中,遇到过最奇葩的报错是什么? 评论区聊聊,老粉优先回复!


📌 往期回顾
- 第 10 章 10.1 篇:uniapp 源码解析:响应式原理大揭秘
- 第 9 章:状态管理:Vuex/Pinia 实战

(全文完 🎉)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。