2023软工K班个人编程任务

102101315王辉凡 2023-09-14 22:20:57

作业链接 

一、PSP表格

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

 

二、任务要求的实现

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

 

任务环节

      我把它分成了4个环节。

      第一个环节:查资料。由于我没有学过python和爬虫,所以我首先是在b站看了很多教程和实战案例。

      第二个环节:需求分析与进一步学习。通过1天的了解与学习,我了解到爬虫具体的需求,然后进一步的学习。

        第三个环节:代码编写实战。在感觉差不多的时候我就开始编写代码,遇到不懂的就去百度和CSDN上查找。

        第四个环节:分析与总结。采用PyCharm图形化性能测试工具Profile

技术栈

        这次任务用的就是python,包括requests,Beautiful Soup解析库,json,re正则表达式模块,pandas,matplotlib,openpyxl,numpy,wordcloud等。

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

a) 爬虫逻辑

        查看网页的内容后,一个网址页面下20个视频,这里只采集15页的视频数据(共300个视频),因此基本爬虫逻辑如下:

【分页网址的url采集】——> 【单个视频url的采集】——> 【进入视频播放页面获取数据信息】——> 【打开存放弹幕的网页】 ——> 【按照要求爬取数据并存放到数据库】

b) 设计过程

1、通过2-4页网址的梳理,可以看出分页网址的规律,也就是最后面的“page=”之后数字发生变化,而且对应着具体的页码,那么获取前15页的分页网址,就可以使用下面的方式:

urllist = []
for i in range(1,21):
    ui = f"https://search.bilibili.com/all?keyword=%E6%96%B0%E5%9E%8B%E5%86%A0%E7%8A%B6%E7%97%85%E6%AF%92%E8%82%BA%E7%82%8E&order=click&duration=0&tids_1=0&page={i}"
    urllist.append(ui)
    
print(urllist)

然后对该这串代码进行封装:


def get_outer_urls(n):
        '''
        【分页网址url采集】
        n:爬取页数
        结果:得到分页网页的list
        '''
        lst = []
        for i in range(1, 21):
            ui = f'https://api.bilibili.com/x/web-interface/search/all/v2?page={i}&keyword=日本核污染水排海'
            lst.append(ui)

        return (lst)

2、设置请求头和cookies

这个没什么好说的,爬虫基本要求

3、接下来就要找这个页面下每个视频的bvid,每个B站的视频都有自己专属的bvid,可以通过这个来进入这个视频的页面,以此来获取视频的更多信息(这个bvid困了我三天,一直爬不好)

def bivurl(url, n):
        response = requests.get(url, headers=dic_headers)
        json_dict = json.loads(response.text)
        return json_dict["data"]["result"][11]["data"][n]["bvid"]

4、得到了bvid之后就可以得到每个视频的链接,在这之后就可以开始获取弹幕接口,即cid

bvid_url = "https://www.bilibili.com/video/" + bivurl(url, k)
            r=requests.get(url=bvid_url,headers=dic_headers)
            cid = re.search(r'"cid":(\d*),', r.text).group(1)

5、有了cid也就有了弹幕的地址,那么就可以开始爬取弹幕

cid_url = f"https://comment.bilibili.com/{cid}.xml"
            r2 = requests.get(cid_url,headers=dic_headers)
            r2.encoding = r2.apparent_encoding
            dmlst = re.findall('<d p=".*?">(.*?)</d>', r2.text)

我将他保存到dmlst里。

6、最后一步,将弹幕保存到txt里面

            for index in dmlst:
                with open('弹幕.txt', mode='a', encoding='utf-8') as f:
                    f.write(index)
                    f.write("\n")

运行结果:

7、词云图绘制

img=imageio.imread(r'F:\python\python1\08560450980210de7e93aedf1c5734d0.png')
f = open(r'F:\python\python1\弹幕.txt',encoding='utf-8')
text = f.read()
text_list=jieba.lcut(text) #利用jieba进行分词
cut_word=' '.join(text_list)  #将列表转换成字符串
#词云图配置
wt=wordcloud.WordCloud(
    width=500,
    height=500,
    background_color='white',
    font_path='msyh.ttc',
    scale=15,
    mask=img,
    stopwords = {"的", "是", "吧","啊","了","!"}
)
wt.generate(cut_word)  #加载词云图
wt.to_file('词云.png')  #输出词云图

 

 

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

数据结论弹幕数据表明了B站的用户对于日本核污染水排海是持反对观点的,都十分痛恨日本这一行为。
这个结论是我通过筛选出现次数最多的前20条弹幕的数据得出的,在这些弹幕中“保护海洋”、“保护地球”、“坚决抵制”、“反对排放”、“!”等字样的出现次数较多,具体的数据如下图所示:

(3.5)可视化界面的展示

这个是用python代码打印出来的
 

上面这个太丑了,我就用微词云重新做了一份 

三、心得体会

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

这次作业太痛苦了,卡在bvid那边卡了三四天,熬了两三个晚上都没有解决。对于我这个0基础python的人来说真的痛苦。但是收获确实不少,对python也有了一定的了解,更重要的是我学会爬虫的小皮毛了,对于知识的查找能力也哟有不少提升。但是回忆起来还是满满的心痛。

  1.  

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

118

社区成员

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

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