You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

9.1 KiB

@import "for_md.md"

2025软工K班个人编程任务

【作业链接】https://code.educoder.net/projects
【知士荟博客链接】请在此处填写知士荟本次作业博客链接

一、PSP表格

PSP阶段 任务内容 预估耗时(分钟) 实际耗时(分钟)
计划规划 需求分析、技术选型、任务分解 20 30
环境搭建 开发环境配置、依赖包安装 30 20
数据获取 B站弹幕爬虫实现 40 70
数据处理 数据清洗、统计分析 20 20
可视化实现 词云图、图表制作 20 10
测试优化 单元测试、性能优化 40 30
文档撰写 实验报告编写 100 50
总计 310 240

二、任务要求的实现

2.1项目设计与技术栈

技术栈:

  • 编程语言python
  • 爬虫工具request
  • 数据处理csv
  • 可视化云图python stylecloud库
  • 其他工具pytest,bs4,panda,csv

核心类与函数关系:

graph TD
    A[主程序] --> B[爬虫模块]
    A --> C[数据处理模块]
    A --> D[可视化模块]
    B --> E[网络请求]
    B --> F[数据解析]
    C --> G[数据清洗]
    C --> H[统计分析]

关键算法说明:

  • 弹幕去重使用Counter类进行自动去重和词频统计
  • 关键词提取方法使用提前准备好的keywords文件对爬取的数据进行提取
  • 排名统计逻辑:根据数据的词频排序

业务逻辑设计:

  1. 分析目标网站b站视频结构设计爬虫
  • 获得基础url_base
self.url_ref = 'https://search.bilibili.com/all?vt=83547368&keyword=LLM'
self.headers = {
    "Referer":
    self.url_ref,
    "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
}
self.url_interface_cid = "https://api.bilibili.com/x/v1/dm/list.so?oid={cid}"
self.url_page_base = "https://search.bilibili.com/all?vt=85151086&keyword=LLM&page={page}&o={offset}"
  • 获取LLM视频页面链接
  • 使用浏览器f12获取视频链接selector

alt text

"#i_cecream > div > div:nth-child(2) > div.search-content--gray.search-content > div > div > div > div.video.i_wrapper.search-all-list > div > div:nth-child(1) > div > div.bili-video-card__wrap > a"

  • 根据视频链接获取视频cid再根据cid通过b站弹幕API接口网站获取弹幕 url_interface_cid = "https://api.bilibili.com/x/v1/dm/list.so?oid={cid}"

    alt text

    提取结果:
    链接地址: https://www.bilibili.com/video/BV12N411x7FL/
    链接文本: 19.2万21208:10
    得到CID: 1308288574
    
    

    alt text 可以通过接口url+cid访问弹幕内容

  1. 对爬取的数据进行清洗使用关键字检索LLM
  • 使用tool.keywords.py提供的words库,使用re为word_filter实现关键词检索和口语化弹幕剔除
    class DanmakuFilter:
        """弹幕过滤器,去除口语化内容,保留专业讨论"""
    
        def __init__(self):
            # 定义语气词和口语化表达
            import tool.keywords as kw
            # 编译正则表达式
            self.colloquial_regex = re.compile('|'.join(kw.colloquial_patterns))
            self.llm_regex = re.compile('|'.join(kw.keywords), re.IGNORECASE)
    
    
  1. 对统计数据进行词云图绘制
  • 使用python的stylecloud对处理好的弹幕进行词云图绘制
    gen_stylecloud(
        text=text,  # 处理好的文本
        size=1024,  # 图片尺寸,越大越清晰
        font_path='msyh.ttc',  # 指定中文字体路径(如微软雅黑)
        output_name='ai_danmu_stylecloud.png',  # 输出文件名
        icon_name='fas fa-question-circle',
        custom_stopwords=['的', '了', '在', '是', '我', '有', '和', '机'],  # 自定义停用词
        palette='colorbrewer.qualitative.Set1_8',  # 使用预设配色方案
        # background_color='white',  # 背景色
        gradient='horizontal',  # 颜色渐变方向
        max_font_size=200,  # 最大字体大小
        max_words=500,  # 最多显示词数
    )
    
    

2.2接口测试

  • 测试方案:针对每个技术模块使用本地 name=='main'进行本地化测试

alt text

alt text

2.3 数据统计接口性能改进

性能分析过程:

  • 使用cProfile对main函数的整个处理流程进行性能分析
import cProfile
import pstats
from io import StringIO
if __name__ == "__main__":
    # 爬虫性能分析部分
    scawler = Scawler()
    profiler = cProfile.Profile()
    profiler.enable()
    ls = scawler.work(1, 4)
    danmu_counter = analyze_danmu_statistics(ls)
    shower = Cloud_shower()
    shower.to_show(danmu_counter)

    profiler.disable()
    stream = StringIO()
    stats = pstats.Stats(profiler, stream=stream)
    stats.sort_stats('cumulative')  # 按累计时间排序
    stats.print_stats(20)  # 显示前20行
    print("\n=== 详细分析报告 ===")
    print(stream.getvalue())

性能分析图:

alt text

消耗最大函数分析:

alt text 不难发现性能主要消耗在request

改进思路:

  • 预计使用异步爬虫或多线程加上ip代理进行request的爬取速度优化和避免被ban

2.4 数据结论

数据样例展示

alt text

主要发现:

  1. LLM视频内学习打卡弹幕数量巨大
  2. 少有真正讨论LLM的弹幕内容内容更偏向于口语化评价
  3. 数据量过少无法得到充分信息

2.5 数据可视化界面展示

@import "for_md.md"

词云图实现:

  • 将数据转化为文本传入stylecloud自动生成对应词云图

词云图展示:

alt text


三、心得体会

技术收获:

1. 全栈数据科学技能提升

  • 掌握了完整的"数据采集→清洗→分析→可视化"工作流程
  • 实践了从网络爬虫到数据可视化的端到端项目开发
  • 学习了B站API接口调用和XML数据解析技术

2. 文本处理与自然语言处理技术

  • 实现了基于正则表达式的智能文本过滤系统
  • 掌握了关键词匹配和口语化内容识别算法

3. 工程化开发能力

  • 采用模块化设计,实现了高内聚低耦合的代码架构
  • 使用面向对象编程思想,设计了可扩展的类结构
  • 实践了类型提示、异常处理等Python实践

4. 数据可视化技术

  • 掌握了stylecloud词云生成技术
  • 学习了配色方案、字体优化等可视化美学设计
  • 实现了从原始数据到专业图表的自动化流程

遇到的问题与解决方案:

1. B站反爬虫机制挑战

  • 问题直接爬取容易被封IP动态加载内容难以获取
  • 解决方案模拟真实浏览器请求头使用官方API接口获取CID间接获取弹幕数据

2. 数据清洗复杂度高

  • 问题:弹幕包含大量口语化、情绪化内容,干扰专业分析
  • 解决方案:构建双层过滤系统(口语化模式匹配+专业关键词筛选)

3. 性能优化需求

  • 问题:大规模数据处理时效率低下
  • 解决方案使用Counter进行高效词频统计优化正则表达式匹配逻辑

4. 中文处理特殊性问题

  • 问题:中文分词、字体显示等技术难题
  • 解决方案:配置中文字体路径,使用专业的文本处理库

未来改进方向:

1. 技术架构升级

  • 引入异步爬虫提升数据采集效率
  • 集成机器学习模型进行智能内容分类
  • 添加数据缓存机制减少重复请求

2. 分析维度扩展

  • 增加情感分析功能,量化用户态度倾向
  • 实现时间序列分析,追踪观点演变趋势
  • 添加用户画像分析,识别不同群体关注点

3. 系统功能完善

  • 开发Web可视化界面提升用户体验
  • 实现定时自动爬取和报告生成
  • 添加数据导出和分享功能

项目总结:

本项目构建了一个专业级的大语言模型弹幕分析系统:

成长收获通过本项目全面提升了全栈开发能力、数据处理能力和工程化思维为未来从事数据科学和AI应用开发奠定了坚实基础。

个人成长: 通过本次项目,我不仅提升了编程技能和数据分析能力,更培养了解决复杂问题的系统思维。从需求分析到技术实现,从问题排查到性能优化,全过程锻炼了我的工程实践能力和创新思维,为未来从事更复杂的数据科学项目奠定了坚实基础。


参考资源

  • B站开放API文档
  • 相关技术博客
  • 数据处理工具文档