|
|
|
|
项目地址:https://code.educoder.net/pux36pf8t/2024-Summer-Olympics
|
|
|
|
|
|
|
|
|
|
# 一、PSP表格
|
|
|
|
|
|
|
|
|
|
## 1.各个模块开发预估耗时
|
|
|
|
|
|
|
|
|
|
| PSP 阶段 | 预估时间(分钟) | 备注 |
|
|
|
|
|
| -------------------- | ---------------- | --------------------------------------- |
|
|
|
|
|
| **计划** | **100** | |
|
|
|
|
|
| - 需求分析 | 35 | 分析任务要求及功能 |
|
|
|
|
|
| - 制定计划 | 65 | 制定开发计划和时间表 |
|
|
|
|
|
| **开发** | **685** | |
|
|
|
|
|
| - 设计 | 65 | 设计模块和数据结构 |
|
|
|
|
|
| - 实现爬虫模块 | 185 | 使用Python实现爬虫,爬取B站视频弹幕数据 |
|
|
|
|
|
| - 数据统计与处理模块 | 125 | 统计AI技术相关弹幕数据 |
|
|
|
|
|
| - 可视化模块 | 125 | 使用词云图等方式进行数据可视化 |
|
|
|
|
|
| - 数据结论与分析模块 | 95 | 分析AI技术应用的相关数据 |
|
|
|
|
|
| **测试** | **190** | |
|
|
|
|
|
| - 编写单元测试用例 | 65 | 编写测试代码和用例 |
|
|
|
|
|
| - 测试执行与问题修复 | 125 | 执行测试,发现并修复问题 |
|
|
|
|
|
| **发布** | **65** | |
|
|
|
|
|
| - 项目提交与发布 | 65 | 提交到仓库与发布 |
|
|
|
|
|
| **性能优化** | **125** | |
|
|
|
|
|
| - 性能分析与优化 | 125 | 使用工具分析性能瓶颈并优化代码 |
|
|
|
|
|
| **总结与文档** | **95** | |
|
|
|
|
|
| - 编写项目文档 | 95 | 编写项目总结、开发文档和用户手册 |
|
|
|
|
|
| **总计** | **1260** | 约21小时,共1260分钟 |
|
|
|
|
|
|
|
|
|
|
## 2.各个模块上实际花费的时间
|
|
|
|
|
|
|
|
|
|
| PSP 阶段 | 实际时间(分钟) | 备注 |
|
|
|
|
|
| -------------------- | ---------------- | --------------------------------------- |
|
|
|
|
|
| **计划** | **110** | |
|
|
|
|
|
| - 需求分析 | 45 | 分析任务要求及功能 |
|
|
|
|
|
| - 制定计划 | 65 | 制定开发计划和时间表 |
|
|
|
|
|
| **开发** | **615** | |
|
|
|
|
|
| - 设计 | 75 | 设计模块和数据结构 |
|
|
|
|
|
| - 实现爬虫模块 | 205 | 使用Python实现爬虫,爬取B站视频弹幕数据 |
|
|
|
|
|
| - 数据统计与处理模块 | 135 | 统计AI技术相关弹幕数据 |
|
|
|
|
|
| - 可视化模块 | 105 | 使用词云图等方式进行数据可视化 |
|
|
|
|
|
| - 数据结论与分析模块 | 95 | 分析AI技术应用的相关数据 |
|
|
|
|
|
| **测试** | **170** | |
|
|
|
|
|
| - 编写单元测试用例 | 75 | 编写测试代码和用例 |
|
|
|
|
|
| - 测试执行与问题修复 | 95 | 执行测试,发现并修复问题 |
|
|
|
|
|
| **发布** | **65** | |
|
|
|
|
|
| - 项目提交与发布 | 65 | 提交到仓库与发布 |
|
|
|
|
|
| **性能优化** | **105** | |
|
|
|
|
|
| - 性能分析与优化 | 105 | 使用工具分析性能瓶颈并优化代码 |
|
|
|
|
|
| **总结与文档** | **85** | |
|
|
|
|
|
| - 编写项目文档 | 85 | 编写项目总结、开发文档和用户手册 |
|
|
|
|
|
| **总计** | **1150** | 约19小时,共1150分钟 |
|
|
|
|
|
|
|
|
|
|
# 二、任务要求的实现
|
|
|
|
|
|
|
|
|
|
## 1.项目设计与技术栈
|
|
|
|
|
|
|
|
|
|
### [1]任务流程
|
|
|
|
|
|
|
|
|
|
这一次任务我拆分成如下流程:
|
|
|
|
|
|
|
|
|
|
(1)进行需求分析和任务规划
|
|
|
|
|
|
|
|
|
|
(2)实现编码过程(包括数据爬取、数据处理与统计分析、结果写入Excel、生成词云图)
|
|
|
|
|
|
|
|
|
|
(3)总结2024巴黎奥运会中应用AI技术的主流观点
|
|
|
|
|
|
|
|
|
|
(4)上传代码&&编写文档
|
|
|
|
|
|
|
|
|
|
### [2]代码使用的技术栈
|
|
|
|
|
|
|
|
|
|
整个代码主要使用了python语言完成。
|
|
|
|
|
|
|
|
|
|
完成基本任务所使用的技术栈如下:
|
|
|
|
|
|
|
|
|
|
* Http请求:requests
|
|
|
|
|
* Json解析:json
|
|
|
|
|
* Excel写入:pandas
|
|
|
|
|
* 词云生成:wordcloud
|
|
|
|
|
* 文件输入流:python自带内置的 open 函数
|
|
|
|
|
|
|
|
|
|
### [3]其他工具
|
|
|
|
|
|
|
|
|
|
对于上面的流程,我主要通过阅读相关书籍,阅读官方文档,借助搜索引擎,借助AI,观看视频等多种方式完成的。
|
|
|
|
|
|
|
|
|
|
代码测试主要使用pycharm的代码分析。
|
|
|
|
|
|
|
|
|
|
代码上传主要使用头歌。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 2.爬虫与数据处理
|
|
|
|
|
|
|
|
|
|
### [1]业务逻辑
|
|
|
|
|
|
|
|
|
|
共有6个函数
|
|
|
|
|
获取视频:ai:process_urls()
|
|
|
|
|
将视频aid转换成cid:process_aid_and_cid()
|
|
|
|
|
获取视频弹幕:fetch_danmu()
|
|
|
|
|
文件清理:clean_file()
|
|
|
|
|
数据统计输出:analyze_keywords_in_comments()
|
|
|
|
|
输出词云图:generate_wordcloud()
|
|
|
|
|
依次执行这六个函数
|
|
|
|
|
### [2]代码设计过程
|
|
|
|
|
|
|
|
|
|
#### (1)主要架构
|
|
|
|
|
|
|
|
|
|
这个代码的主要实现部分以BilibiliSpiderApplication作为整个程序的主类,执行主流程实现所有任务。
|
|
|
|
|
|
|
|
|
|
```def main():
|
|
|
|
|
#获取视频aid
|
|
|
|
|
process_urls(urls, headers)
|
|
|
|
|
print("获取视频aid完毕")
|
|
|
|
|
#将视频aid转换成cid
|
|
|
|
|
process_aid_and_cid('aid.txt', 'cid.txt', headers)
|
|
|
|
|
print("将aid转换成cid完毕,cid去重完成,结果已写回文件。")
|
|
|
|
|
#获取视频弹幕
|
|
|
|
|
fetch_danmu()
|
|
|
|
|
print("弹幕爬取完成。")
|
|
|
|
|
# 调用函数进行文件清理
|
|
|
|
|
print('开始清洗弹幕')
|
|
|
|
|
clean_file('comment.txt', 'cleaned_comment.txt')
|
|
|
|
|
print("弹幕清洗完毕")
|
|
|
|
|
#数据统计输出
|
|
|
|
|
print('开始数据统计')
|
|
|
|
|
analyze_keywords_in_comments('cleaned_comment.txt', 'keywords.txt', 'ai_technologies_count.xlsx')
|
|
|
|
|
#输出词云图
|
|
|
|
|
print("开始构建词云图")
|
|
|
|
|
generate_wordcloud('cleaned_comment.txt', 'stopwords.txt', '词云.png')
|
|
|
|
|
print("构建词云图完毕")
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
main()
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
另一方面,为了保证代码的简洁性和遵循单一职责的原则。做了一定程度的封装。将具体操作封装到process_urls,process_aid_and_ci,fetch_danmu等函数对外提供服务。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#### (2)完整性,可读性以及规范化
|
|
|
|
|
|
|
|
|
|
**完整性**:
|
|
|
|
|
|
|
|
|
|
使用if...else...语句对代码可能出现的异常进行输出;
|
|
|
|
|
|
|
|
|
|
**代码的低耦合和单一职责**:
|
|
|
|
|
```
|
|
|
|
|
def extract_ids_from_url(url, head, output_file='aid.txt'):
|
|
|
|
|
"""
|
|
|
|
|
从给定的 URL 中提取 IDs 并将其保存到指定的文件中。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
url (str): 要请求的 URL。
|
|
|
|
|
head (dict): 请求头,用于发起 HTTP 请求。
|
|
|
|
|
output_file (str): 存储提取的 ID 的文件路径,默认为 'aid.txt'。
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
# 发起 GET 请求
|
|
|
|
|
response = requests.get(url=url, headers=head)
|
|
|
|
|
# 确保请求成功,状态码在 200 到 299 之间
|
|
|
|
|
response.raise_for_status()
|
|
|
|
|
|
|
|
|
|
# 将响应内容解析为 JSON 格式
|
|
|
|
|
data = response.json()
|
|
|
|
|
|
|
|
|
|
# 检查响应数据是否包含 'data' 和 'result' 键
|
|
|
|
|
if 'data' in data and 'result' in data['data']:
|
|
|
|
|
items = data['data']['result']
|
|
|
|
|
# 提取每个条目的 'id' 字段
|
|
|
|
|
ids = [item['id'] for item in items]
|
|
|
|
|
|
|
|
|
|
# 以追加模式打开文件,并写入每个 ID
|
|
|
|
|
with open(output_file, 'a') as file:
|
|
|
|
|
for aid in ids:
|
|
|
|
|
file.write(f"{aid}\n")
|
|
|
|
|
|
|
|
|
|
print(f"IDs have been saved to {output_file}")
|
|
|
|
|
else:
|
|
|
|
|
print("Unexpected response format") # 如果响应格式不符合预期,输出提示信息
|
|
|
|
|
|
|
|
|
|
except requests.RequestException as e:
|
|
|
|
|
# 捕获并打印请求相关的错误
|
|
|
|
|
print(f"Request error: {e}")
|
|
|
|
|
except KeyError as e:
|
|
|
|
|
# 捕获并打印键错误
|
|
|
|
|
print(f"Key error: {e}")
|
|
|
|
|
except Exception as e:
|
|
|
|
|
# 捕获并打印其他类型的异常
|
|
|
|
|
print(f"An error occurred: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def process_urls(urls1, headers1, output_file='aid.txt'):
|
|
|
|
|
"""
|
|
|
|
|
遍历 URL 列表,并对每个 URL 调用 extract_ids_from_url 函数进行处理。
|
|
|
|
|
|
|
|
|
|
参数:
|
|
|
|
|
urls1 (list): 包含 URL 的列表。
|
|
|
|
|
headers1 (dict): 请求头,用于发起 HTTP 请求。
|
|
|
|
|
output_file (str): 存储提取的 ID 的文件路径,默认为 'aid.txt'。
|
|
|
|
|
"""
|
|
|
|
|
for url in urls1:
|
|
|
|
|
extract_ids_from_url(url, headers1, output_file)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**可读性**:加入详细的注释,变量命,函数名,方法名见名知意。
|
|
|
|
|
|
|
|
|
|
**规范化**:
|
|
|
|
|
|
|
|
|
|
变量、函数、类命名严格遵守蛇形命名法。
|
|
|
|
|
使用pycharm代码分析插件分析代码,尽量消除警告。
|
|
|
|
|
|
|
|
|
|
## 3.数据统计接口部分的性能改进
|
|
|
|
|
算法选择:选择合适的算法进行数据分析,避免使用复杂度过高的算法。
|
|
|
|
|
数据预处理:在分析之前对数据进行预处理,减少分析时的计算量。
|
|
|
|
|
|
|
|
|
|
## 4.数据结论的可靠性
|
|
|
|
|
|
|
|
|
|
结论:从关键词的出现次数可以得出以下结论:
|
|
|
|
|
|
|
|
|
|
观看奥运会时,用户几乎没有产生对ai应用技术方面的想法,可以认为绝大多数人对巴黎奥运会ai应用了何种技术毫不关心。
|
|
|
|
|
|
|
|
|
|
**综上所述,当前B站用户主要对“AI”及相关技术在2024巴黎奥运会的应用保持极低的关注度,而对比赛精彩的讨论相对较多。**
|
|
|
|
|
|
|
|
|
|
主要通过生成的Excel数据集以及词云图,通过自己分析+ChatGPT导入文件分析,得出最终结论。
|
|
|
|
|
|
|
|
|
|
## 5.数据可视化界面的展示
|
|
|
|
|
|
|
|
|
|
**[1]词云图组件**:展示最受欢迎的AI相关关键词及其出现频率。词云图采用颜色和字体大小来体现关键词的热度,较大的字体和亮眼的颜色代表出现频率高的词汇。
|
|
|
|
|
|
|
|
|
|
**[2]Excel文件**:展示每个关键词的具体出现次数。相比词云图,Excel表能够提供更精确的数值信息。
|
|
|
|
|
|
|
|
|
|
# 三、心得体会
|
|
|
|
|
**[1]. 理解 API 接口**
|
|
|
|
|
了解接口文档
|
|
|
|
|
B站提供了多种 API 接口来获取弹幕数据。熟悉这些接口的文档是至关重要的。API 文档通常包含了请求的 URL 格式、所需的参数以及返回的数据结构等信息。在爬取弹幕数据时,我发现了解这些细节有助于构建正确的请求,从而获取准确的数据。
|
|
|
|
|
构建请求
|
|
|
|
|
在构造 API 请求时,我学会了如何使用适当的参数来获取特定的视频弹幕数据。例如,视频的 cid(内容 ID)是获取弹幕的关键参数,而 date 参数可以指定具体的日期,这对于获取特定时间段的弹幕非常有用。
|
|
|
|
|
**[2]. 处理反爬虫措施**
|
|
|
|
|
使用合适的请求头
|
|
|
|
|
B站会对频繁的请求进行限制,因此在爬取过程中,使用合适的请求头(如 User-Agent)可以帮助模拟正常的浏览器请求,减少被封禁的风险。
|
|
|
|
|
**[3]. 数据处理与存储**
|
|
|
|
|
清洗数据
|
|
|
|
|
弹幕数据中可能包含噪声或无用的信息。在爬取数据后,需要对其进行清洗,去除无关内容,并提取出有用的信息。使用正则表达式来提取中文弹幕是一个有效的方法,但也需要对匹配的规则进行调整,以确保准确性。
|
|
|
|
|
存储数据
|
|
|
|
|
将弹幕数据存储到文件或数据库中时,需要考虑到数据的格式和结构。在我的实践中,我使用了文本文件来存储弹幕数据,并采用 UTF-8 编码来处理中文字符。这有助于确保数据的完整性和可读性。
|
|
|
|
|
|