first commit

main
Your Name 3 months ago
commit 7d294f48da

@ -0,0 +1,238 @@
项目地址https://code.educoder.net/pux36pf8t/2024-Summer-Olympics
# 一、PSP表格
## 1.各个模块开发预估耗时
| PSP 阶段 | 预估时间(分钟) | 备注 |
| -------------------- | ---------------- | --------------------------------------- |
| **计划** | **90** | |
| - 需求分析 | 30 | 分析任务要求及功能 |
| - 制定计划 | 60 | 制定开发计划和时间表 |
| **开发** | **660** | |
| - 设计 | 60 | 设计模块和数据结构 |
| - 实现爬虫模块 | 180 | 使用Python实现爬虫爬取B站视频弹幕数据 |
| - 数据统计与处理模块 | 120 | 统计AI技术相关弹幕数据 |
| - 可视化模块 | 120 | 使用词云图等方式进行数据可视化 |
| - 数据结论与分析模块 | 90 | 分析AI技术应用的相关数据 |
| **测试** | **180** | |
| - 编写单元测试用例 | 60 | 编写测试代码和用例 |
| - 测试执行与问题修复 | 120 | 执行测试,发现并修复问题 |
| **发布** | **60** | |
| - 项目提交与发布 | 60 | 提交到仓库与发布 |
| **性能优化** | **120** | |
| - 性能分析与优化 | 120 | 使用工具分析性能瓶颈并优化代码 |
| **总结与文档** | **90** | |
| - 编写项目文档 | 90 | 编写项目总结、开发文档和用户手册 |
| **总计** | **1200** | 约20小时共1200分钟 |
## 2.各个模块上实际花费的时间
| PSP 阶段 | 实际时间(分钟) | 备注 |
| -------------------- | ---------------- | --------------------------------------- |
| **计划** | **100** | |
| - 需求分析 | 40 | 分析任务要求及功能 |
| - 制定计划 | 60 | 制定开发计划和时间表 |
| **开发** | **590** | |
| - 设计 | 70 | 设计模块和数据结构 |
| - 实现爬虫模块 | 200 | 使用Python实现爬虫爬取B站视频弹幕数据 |
| - 数据统计与处理模块 | 130 | 统计AI技术相关弹幕数据 |
| - 可视化模块 | 100 | 使用词云图等方式进行数据可视化 |
| - 数据结论与分析模块 | 90 | 分析AI技术应用的相关数据 |
| **测试** | **160** | |
| - 编写单元测试用例 | 70 | 编写测试代码和用例 |
| - 测试执行与问题修复 | 90 | 执行测试,发现并修复问题 |
| **发布** | **60** | |
| - 项目提交与发布 | 60 | 提交到仓库与发布 |
| **性能优化** | **100** | |
| - 性能分析与优化 | 100 | 使用工具分析性能瓶颈并优化代码 |
| **总结与文档** | **80** | |
| - 编写项目文档 | 80 | 编写项目总结、开发文档和用户手册 |
| **总计** | **1090** | 约18小时共1090分钟 |
# 二、任务要求的实现
## 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]业务逻辑
### [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 编码来处理中文字符。这有助于确保数据的完整性和可读性。

@ -0,0 +1,29 @@
#一.主任务要求
##1.数据获取
利用爬虫B站爬取所需弹幕数据搜索关键词“2024巴黎奥运会”爬取综合排序前300的所有视频弹幕。
##2.数据统计
统计AI技术应该方面的每种弹幕数量并输出数量排名前8的弹幕。
将统计的数据利用编程工具或开发包自动写入Excel表中。
##3.数据可视化
对采集的数据集进行可视化表示,制作词云图,越美观越好。
##4.数据结论
通过统计数据得出当前B站用户对于2024巴黎奥运会应用AI技术的主流看法。
#二.代码使用的技术栈
整个代码主要使用了python语言完成。
完成基本任务所使用的技术栈如下:
* Http请求requests
* Json解析json
* Excel写入pandas
* 词云生成wordcloud
* 文件输入流python自带内置的 open 函数

@ -0,0 +1,405 @@
AI伦理
模型训练
自适应算法
模型压缩
知识迁移
自动特征工程
量子计算与AI
计算机视觉算法
智能控制系统
自然语言处理模型
图像增强
人工智能架构
异常检测系统
智能机器人设计
虚拟助手应用
实时数据分析
智能推荐算法
语音识别模型
数据增强技术
自然语言生成模型
智能定位系统
高性能计算
AI驱动的分析
智能化决策
计算机视觉模型
深度生成模型
智能语音识别系统
模型评估
AI系统集成
模式分类
智能图像生成
语音识别优化
强化学习算法
数据处理框架
知识推理
数据分析平台
计算机视觉识别
生成模型应用
自动化图像处理
智能视频分析
AI优化技术
高级数据挖掘
自然语言接口技术
AI驱动的预测
机器人学习算法
智能数据挖掘
数据处理工具
AI模型优化
智能内容推荐
智能语音分析系统
AI实验平台
高级机器学习
深度神经网络应用
自动化决策支持系统
数据分析模型
智能虚拟助手
模型预测分析
图像识别工具
自然语言处理工具
智能诊断系统
计算机视觉系统
语音合成模型
数据智能平台
机器人智能平台
图像分类
计算机视觉应用程序
数据驱动优化
智能监控技术
语音交互平台
自然语言分析
深度学习应用
智能系统设计
机器学习平台
AI驱动的图像分析
实时预测分析
智能决策系统设计
自动化图像识别
数据分析工具包
自然语言处理框架
智能算法优化
图像处理算法
语音识别解决方案
强化学习应用
智能数据采集系统
计算机视觉技术平台
深度学习模型优化
智能语音处理
自动化系统设计
数据挖掘应用
智能算法应用
图像生成技术
自然语言处理系统
AI驱动的诊断工具
高级计算机视觉
智能内容生成
机器人技术应用
深度学习平台应用
实时语音处理
自动化数据分析
智能预测算法
语音助手技术
计算机视觉研究
智能诊断工具
数据处理技术
机器学习研究
自然语言生成技术
图像识别算法
智能决策模型
实时数据处理
语音数据分析
AI研究平台
计算机视觉应用案例
智能图像识别工具
模型训练技术
数据智能分析平台
语音识别研究
自动化预测工具
智能控制技术
深度学习模型应用
数据驱动系统
图像处理平台
计算机视觉数据集
自然语言处理应用
智能分析工具
语音识别解决方案
自动化数据挖掘
智能数据应用
高级人工智能技术
计算机视觉数据处理
智能图像分析平台
自然语言接口设计
机器人技术研究
深度学习框架
实时预测系统
智能语音解决方案
数据驱动决策支持
智能诊断平台
语音识别平台应用
计算机视觉算法研究
自动化内容生成工具
AI驱动的医疗分析
智能数据处理平台
图像分类系统
自然语言处理应用平台
机器人学习应用
数据智能技术
深度学习应用案例
智能内容分析
自动化分析系统
高级语音识别技术
AI技术平台
智能决策支持系统
语音合成系统
数据驱动图像处理
实时数据分析平台
计算机视觉研究平台
智能图像处理工具
自动化数据系统
深度学习技术
机器人智能分析平台
自然语言处理平台应用
AI驱动的系统优化
智能分析模型
计算机视觉应用技术
语音数据处理工具
智能数据集成
图像识别应用技术
自动化数据挖掘工具
实时数据处理平台
自然语言生成应用
智能预测系统
高级数据处理技术
机器人技术平台
计算机视觉应用框架
智能语音合成平台
深度学习平台工具
自动化分析平台
智能内容生成工具
数据驱动分析系统
实时图像处理
计算机视觉解决方案
AI驱动的算法优化
智能分析平台应用
语音识别技术平台
数据智能处理工具
深度学习系统
智能数据分析模型
自动化语音处理
计算机视觉应用工具
智能内容处理平台
自然语言分析工具
高级语音分析
AI技术解决方案
智能数据处理应用
实时智能分析
自动化数据集成
深度学习应用平台
语音处理系统
计算机视觉技术工具
智能预测应用
机器学习
深度学习
神经网络
自然语言处理
计算机视觉
语音识别
图像识别
强化学习
无监督学习
有监督学习
生成对抗网络
推荐系统
自动驾驶
人工智能
语义分析
数据挖掘
智能客服
聊天机器人
情感分析
预测分析
人脸识别
机器翻译
医疗影像分析
语音合成
语音助手
自动化流程
机器人流程自动化
智能家居
计算机辅助设计
智能制造
物联网
智能交通
金融科技
风险评估
个性化推荐
数据清洗
数据集成
实时分析
智能监控
智能分析
自动化测试
预测建模
推荐引擎
数据可视化
智能广告
语音分析
图像生成
智能合约
增强现实
虚拟现实
机器人
智能感知
大数据
数据处理
异常检测
智能规划
机器视觉
智能语音
内容生成
迁移学习
序列建模
智能助手
自动化决策
行为分析
语言模型
模式识别
图像分割
数据增强
自动化控制
知识图谱
语音识别系统
机器翻译系统
语义理解
智能语义
人工神经网络
核心网络
语音处理
智能检测
面部识别
机器人学习
数据标注
深度神经网络
动作识别
网络安全
精准医疗
药物发现
智能诊断
自动内容生成
风险管理
动态优化
语音对话
实时监控
模型优化
自然语言生成
信息检索
跨模态学习
人工智能伦理
智能预测
机器人导航
用户画像
机器视觉算法
深度强化学习
多模态学习
人工智能算法
智能计算
数据驱动
智能感知系统
自然语言理解
知识抽取
虚拟助手
智能感知技术
自动数据处理
智能硬件
增强智能
自适应学习
智能算法
人工智能研究
预测性维护
智能决策支持
自然语言接口
图像处理
人工智能应用
智能感应
自动问答系统
人工智能优化
智能数据分析
机器人技术
智能运维
智能金融
语音交互
数据驱动决策
智能医疗设备
机器人导航系统
虚拟现实体验
自动分类
计算机视觉应用
自然语言交互
机器学习模型
机器人智能
图像识别技术
自动化分析
智能语音识别
自动化优化
数据分析工具
智能化生产
智能预测模型
语音数据处理
机器人智能系统
自动化机器人
智能算法模型
图像识别应用
自然语言处理技术
智能决策系统
自动化监控
智能数据系统
语音识别技术
数据挖掘技术
自动化软件
智能应用程序
数据预测分析
智能系统集成
自动化数据处理
机器人感知
智能数据采集
机器学习技术
计算机视觉技术
智能传感器
虚拟助手系统
语音识别应用
自动化任务管理
智能监控系统
图像分析
智能决策模型
机器人应用
数据智能分析
深度学习算法
自动化处理系统
智能数据平台
语音交互系统
数据处理平台
智能语音合成
机器学习算法
智能图像识别
自动化技术
语音识别平台
深度学习平台
智能语义分析
图像识别系统
智能医疗系统
机器人智能应用
自然语言处理平台
智能数据处理
机器视觉技术
机器人智能分析
数据驱动技术
自动化决策系统
智能图像处理
语音处理技术
智能分析平台
计算机视觉系统
人工智能
智能
机器学习
自然语言处理
自动驾驶

@ -0,0 +1,286 @@
import requests
import re
import pandas as pd
from collections import Counter
import jieba
import wordcloud
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)
def process_aid_and_cid(aid_file_path, cid_file_path, headers):
# 打开 aid 文件,并读取其中的所有 aid
with open(aid_file_path, 'r') as file:
aids = [line.strip() for line in file if line.strip()]
count = 0
# 打开 cid 文件(以追加模式),准备写入 cid 数据
with open(cid_file_path, 'a') as file:
# 遍历每个 aid构造请求 URL 并获取对应的数据
for aid in aids:
url = f'https://api.bilibili.com/x/player/pagelist?aid={aid}'
response = requests.get(url=url, headers=headers).json()
# 遍历响应数据中的每个条目,提取 cid
for item in response.get('data', []):
cid = item['cid']
# 将 cid 写入文件
file.write(f"{cid}\n")
count += 1
# 输出处理进度
print(f"Processed: {count} CIDs")
def remove_duplicates(file_path):
# 读取 cid 文件中的所有 cid
with open(file_path, 'r') as file:
cids = [line.strip() for line in file if line.strip()]
# 使用字典去除重复的 cid
unique_cids = list(dict.fromkeys(cids))
# 将去重后的 cid 写回文件
with open(file_path, 'w') as file:
for cid in unique_cids:
file.write(cid + '\n')
# 输出去重完成的提示
# 调用 remove_duplicates 函数,去除 cid 文件中的重复项
remove_duplicates(cid_file_path)
def fetch_danmu():
# 读取 cid 文件
print("开始爬取弹幕")
with open('cid.txt', 'r') as file:
cids = [line.strip() for line in file if line.strip()]
for cid in cids:
url = f'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid={cid}&date=2024-08-31'
response = requests.get(url=url, headers=headers)
response.encoding = 'utf-8'
# 匹配弹幕内容
content_list = re.findall('[\u4e00-\u9fa5]+', response.text)
content = '\n'.join(content_list)
# 将弹幕写入 comment.txt
with open('comment.txt', mode='a', encoding='utf-8') as f:
f.write(content + '\n')
# 定义需要过滤的关键词或短语
keywords_to_remove = [
'出错啦',
'错误号',
'由于触发哔哩哔哩安全风控策略',
'该次访问请求被拒绝'
]
# 定义一个正则表达式模式,用于匹配需要删除的内容
pattern = re.compile('|'.join(re.escape(keyword) for keyword in keywords_to_remove))
def clean_file(input_file, output_file):
with open(input_file, 'r', encoding='utf-8') as infile, open(output_file, 'w', encoding='utf-8') as outfile:
for line in infile:
# 如果行中不包含需要过滤的关键词,则写入输出文件
if not pattern.search(line):
outfile.write(line)
def analyze_keywords_in_comments(comments_file, keywords_file, output_excel_file):
# 读取评论文件
with open(comments_file, 'r', encoding='utf-8') as file:
comments = file.readlines()
# 读取关键词列表
with open(keywords_file, 'r', encoding='utf-8') as file:
keywords = [line.strip() for line in file]
# 定义一个列表用于存储评论中的 AI 技术应用
ai_technologies = []
# 遍历评论,统计每个关键词的出现次数
for comment in comments:
for keyword in keywords:
if keyword in comment:
ai_technologies.append(keyword)
# 统计每个技术的出现次数
tech_counts = Counter(ai_technologies)
# 将统计结果转换为 DataFrame
df = pd.DataFrame(tech_counts.items(), columns=['AI Technology', 'Count'])
# 将 DataFrame 写入 Excel 文件
df.to_excel(output_excel_file, index=False)
# 排序并提取前 8 名的数据
top_8 = df.sort_values(by='Count', ascending=False).head(8)
# 输出前 8 名的数据
print(top_8)
def generate_wordcloud(text_file, stopwords_file, output_image_file, font_path='msyh.ttc'):
# 加载停用词
def load_stopwords(file_path):
with open(file_path, encoding='utf-8') as f:
stopwords = set(f.read().strip().split('\n'))
return stopwords
# 读取停用词
stopwords = load_stopwords(stopwords_file)
# 读取文本文件
with open(text_file, encoding='utf-8') as f:
txt = f.read()
# 分词并过滤停用词
words = jieba.lcut(txt)
filtered_words = [word for word in words if word not in stopwords]
# 将处理后的词汇拼接成字符串
word_string = ' '.join(filtered_words)
# 生成词云
wc = wordcloud.WordCloud(
width=700,
height=700,
background_color='white',
font_path=font_path
)
wc.generate(word_string)
# 保存词云图
wc.to_file(output_image_file)
urls = ['https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=10&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=324&web_location=1430654&w_rid=420b5e834d7dd54d76f4fba1b7b1e665&wts=1725152144',
'https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=8&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=252&web_location=1430654&w_rid=7fdf1d4b3f7d534c993f50173d02de3f&wts=1725152135',
'https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=7&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=216&web_location=1430654&w_rid=6749123b8b393589cc7c80c1e93ada58&wts=1725152132',
'https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=6&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=180&web_location=1430654&w_rid=74f00cf5195a9ec7ef3d57e347704770&wts=1725152128',
'https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=5&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=144&web_location=1430654&w_rid=e914e50a0da59031c553d631ac5f1fde&wts=1725152124',
'https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=4&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=108&web_location=1430654&w_rid=c622f59f9e1360765b62f0e0bc858fa1&wts=1725152121',
'https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=3&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=72&web_location=1430654&w_rid=a60e99a470fa19919a071c865dd1583f&wts=1725152115',
'https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=2&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=36&web_location=1430654&w_rid=8fc24d10311ce5e5730a84daadbbb6b3&wts=1725152102',
'https://api.bilibili.com/x/web-interface/wbi/search/type?category_id=&search_type=video&ad_resource=5654&__refresh__=true&_extra=&context=&page=9&page_size=42&from_source=&from_spmid=333.337&platform=pc&highlight=1&single_column=0&keyword=2024%E5%B7%B4%E9%BB%8E%E5%A5%A5%E8%BF%90%E4%BC%9A&qv_id=2vsSEmfb9hpudunbhxw9KMMxggdECjVp&source_tag=3&gaia_vtoken=&dynamic_offset=288&web_location=1430654&w_rid=a9cbd6c813f6d27561d5f0d583c0ed76&wts=1725153457',
] # 替换为实际的URL
headers = {
'cookie':'buvid4=686CE350-75FA-4921-C069-8D0E582FF02993159-024082507-y91msXDi8JTSAtvVtdhJkQ%3D%3D; buvid3=313C6A34-4C14-0939-EBE8-332F809D2EF655028infoc; b_nut=1725087454; CURRENT_FNVAL=4048; _uuid=10E7EC991-7B18-9A8B-78AA-C95F55102347103610infoc; rpdid=|(JlklRl)~Y|0J\'u~kl|)~l|l; header_theme_version=CLOSE; enable_web_push=DISABLE; is-2022-channel=1; fingerprint=f90b71618c196fb8806f458403d943fb; buvid_fp_plain=undefined; bili_ticket=eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjU4Njk1NzEsImlhdCI6MTcyNTYxMDMxMSwicGx0IjotMX0.x0CsQ6o6lx4IcK82uHYJjDq_WMedyzoqa081au5YPug; bili_ticket_expires=1725869511; bp_t_offset_1074062089=974427929414991872; buvid_fp=f90b71618c196fb8806f458403d943fb; SESSDATA=e74a05df%2C1741267229%2Ce876a%2A91CjDqLgub8fAVML6ADiSzb56IvMh3z61KnSnawN0g_c1h5emTp3cU9qrpFxgDEzzpawASVkpfc01rblFpaUxDRHViNXpJdGhweEdNY2VDdEJ0N1hvMU92SWdLcG5Dclg5dlZmV29aMWZfX2ZSWHJ5VVN3ZHRkc0ZaLU9COHdmeDR2T0tmSXlvdmt3IIEC; bili_jct=addb604342937a4322aa12322c11bc2c; DedeUserID=3546758143544046; DedeUserID__ckMd5=65316417021aa6ed; sid=7yti0jp9; b_lsid=D810C241D_191CEE2FE76; bsource=search_bing; home_feed_column=5; browser_resolution=1455-699',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0'
}
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()

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save