2023软工K班个人编程任务

吴芯琪102101305 2023-09-14 22:02:52

(1.1)在Github仓库中新建一个学号为名的文件夹,同时在博客正文首行给出作业Github链接。(2')
作业链接:https://github.com/Novelty0826/SEwork

一、PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划6060
· Estimate· 估计这个任务需要多少时间600800
Development开发200160
Analysis· 需求分析 (包括学习新技术)400420
· Design Spec· 生成设计文档3040
Design Review· 设计复审60100
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)150120
· Design· 具体设计100150
· Coding· 具体编码200320
· Code Review· 代码复审100120
· Test· 测试(自我测试,修改代码,提交修改)200240
Reporting报告150120
· Test Repor· 测试报告10090
· Size Measurement· 计算工作量2020
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3020
· 合计24002780

二、任务要求的实现

(2.1)项目设计与技术栈。从阅读完题目到完成作业,这一次的任务被你拆分成了几个环节?你分别通过什么渠道、使用什么方式方法完成了各个环节?列出你完成本次任务所使用的技术栈。(5')

  • 本次任务一共分为六个环节,分别为:需求分析、知识学习、代码实现、运行测试、代码改进、总结汇报

  • 主要通过b站、csdn、ChatBot等渠道学习有关爬虫和数据可视化分析等内容

  • 技术栈:requests、re正则表达式、json、jieba、wordcloud、numpy、Image、pandas

(2.2)爬虫与数据处理。说明业务逻辑,简述代码的设计过程(例如可介绍有几个类,几个函数,他们之间的关系),并对关键的函数或算法进行说明。(20')

流程大致分为以下六个模块:分析搜索界面内容、bv号获取、cid获取、弹幕采集、导入excel统计数量、绘制词云图

img

代码的设计主要分为三个函数:采集弹幕、导入excel统计数量、绘制词云图
1)采集弹幕函数
part_1:通过开发者工具获得页面相关内容、采集页面信息、模拟浏览器上网

def get_search(v_keyword,v_max_page):
    for page in range(1,v_max_page +1):
        # 请求地址
        url = 'https://api.bilibili.com/x/web-interface/wbi/search/type'
        }
        # 请求头
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)……'
            'Referer': 'https://www.bilibili.com/video/',
            'Accept': 'application/json, text/plain, */*',
            'Cookie': 'buvid3=9BA66FD7-589E-4AF5-87E8-C695F18E4E55167635infoc;……'
         }
         params = {
            '__refresh__': 'true',
            '_extra': '',
            'context': '',
            'page': page,
            'page_size': 30,
            'from_source': '',
            'from_spmid': '333.337',
            'platform': 'pc',
            'highlight': '1',
            'single_column': '0',
            'keyword': v_keyword,
            'qv_id': 'zv2B6HhWqYvAFxesiXAQQFxOifMOsPoe',
            'ad_resource': '5654',
            'source_tag': '3',
            'gaia_vtoken': '',
            'category_id': '',
            'search_type': 'video',
            'dynamic_offset': 36,
            'web_location': '1430654',
            'w_rid': '0775703a753e9316d09c4bb77a9a5de0',
            'wts': '1694586356'
        }
        # 向页面发送请求
        r = requests.get(url, headers=headers, params=params)

part_2:通过分析数据获得综合排序视频的bv号

        for index in r.json()['data']['result']:
            bv_id = index['bvid']
            with open('bv_id_1.txt', mode='a', encoding='utf-8') as f:
                f.write(bv_id)
                f.write('\n')

part_3:通过分析数据获得各个视频的cid号,再通过api接口获得弹幕地址,采集弹幕、导出弹幕文本

                cid_url = 'https://api.bilibili.com/x/player/pagelist?bvid=' + bv_id + '&jsonp=jsonp'
                response = requests.get(url=cid_url, headers=headers).content.decode('utf-8')
                res_dict = json.loads(response)
                values = res_dict['data']
                for cid_values in values:
                    cid = cid_values.get('cid')
                    cid = str(cid)
                    # print(cid)
                    url_1 = 'https://api.bilibili.com/x/v1/dm/list.so?oid=' + cid
                    response = requests.get(url=url_1, headers=headers).content.decode('utf-8')
                    # print(response.text)
                    print(response)
                    content_list = re.findall('<d p=".*?">(.*?)</d>', response)
                    print(content_list)
                    # for 遍历输出内容
                    for content in content_list:
                        with open('弹幕文本.txt', mode='a', encoding='utf-8') as f:
                            f.write(content)
                            f.write('\n')
                        print(content)

2)导入execel表格统计弹幕数量函数

def get_excel():
    with open('弹幕文本.txt', 'r', encoding='utf-8') as file:
        lines = file.readlines()
    line_counts = {}
    for line in lines:
        content = line.strip()  # 去除行尾换行符等空白字符
        if content in line_counts:
            line_counts[content] += 1
        else:
            line_counts[content] = 1

    df = pd.DataFrame(list(line_counts.items()), columns=['弹幕', '出现次数'])
    df_sorted = df.sort_values(by='出现次数', ascending=False)
    df_sorted.to_excel('结果统计.xlsx', index=False)

excel统计情况如下

img

3)绘制词云图函数

def get_wordcloud():
    f = open('弹幕文本.txt', encoding='utf-8')
    txt = f.read()
    print(txt)
    string = ' '.join(jieba.lcut(txt))
    print(string)
    mask = np.array(Image.open("photo_4.png"))
    wc = wordcloud.WordCloud(
        width=1000,
        height=700,
        background_color='white',
        font_path='msyh.ttc',
        scale=15,
        colormap='Blues',
        mask=mask
    )
    # wc.recolor()
    wc.generate(string)
    wc.to_file('词云图.png')

(2.3)数据统计接口部分的性能改进。记录在数据统计接口的性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(例如可通过VS /JProfiler的性能分析工具自动生成),并展示你程序中消耗最大的函数。(6')

此部分未做成

(2.4)数据结论的可靠性。介绍结论的内容,以及通过什么数据以及何种判断方式得出此结论(6')

  • 结论:对于“日本核污染水排海”这一国际事件,大部分b站用户表现出极大的反对意见,对“日本核污染水排海”进行谴责与批评,相当一部分网友提倡保护海洋,反对排放。

  • 结论依据:通过爬取了相关词条下视频的大量弹幕,弹幕数量多达十万余条,数量之大更具有可靠性。分析弹幕的过程中,我统计了发布数量前二十的弹幕,“反对排放”位居第一,多达2430条,接着是“保护海洋”,多达1429条,“见证历史”642条,由此可见我国民众对日本核污水排海这一事件的关心以及态度。

(2.5)数据可视化界面的展示。在博客中介绍数据可视化界面的组件和设计的思路。(15')

主要分为两个内容:词云图以及弹幕Top20的柱形图。词语图用了oython的jieba库进行分词处理,统计各词的频次,然后利用wordcloud库生成词云图,词云图修改了轮廓形状以及字体颜色,增加美观性。弹幕Top20柱形图在excel自带的作图功能实现。

img

img

三、心得体会

(3.1)在这儿写下你完成本次作业的心得体会,当然,如果你还有想表达的东西但在上面两个板块没有体现,也可以写在这儿~(10')

  • 不敢想象,如果没有这项作业我会变得多么活泼开朗。咳咳,就是对于一个几乎没有python基础的人来说这项作业真的不简单,一开始没有什么头绪,在b站看了不少弹幕爬虫视频才慢慢摸索出一点点门道,但是问题是我要怎么批量爬取而不是只爬取一个视频,然后我又四处寻找,终于找到了我的救命视频解决我的问题,接着就是怎么绘制词云图和统计弹幕数量,其中表扬一下ChatBot,真是我的好帮手。

  • 通过这次任务我也体会到了自学的重要性,课堂上的东西远远不够。在完成项目的过程中,遇到了诸多问题,有的问题也真的让我非常崩溃,但是最后也都差不多解决了,解决不了的就随它去,心态也比以前好多了。

  • 整个作业完成下来,算是对爬虫有的大概的认识,但是因为时间紧迫,其实有很多问题还是没有太弄懂,处于一个一知半解的状态,前期预留的时间不够,以后再有任务一定做好规划,但是没有关系,留着以后慢慢琢磨吧,整体收获还是很大的。

...全文
32 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

116

社区成员

发帖
与我相关
我的任务
社区描述
2023福州大学软件工程K班
软件工程 高校 福建省·福州市
社区管理员
  • kevinkex
  • Devil angel
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧