118
社区成员
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 20 |
Development | 开发 | 120 | 240 |
· Analysis | · 需求分析 (包括学习新技术) | 20 | 180 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 240 | 500 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 40 | 20 |
Reporting | 报告 | 30 | 80 |
· Test Repor | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 20 |
· 合计 | 720 | 1290 |
(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也有了一定的了解,更重要的是我学会爬虫的小皮毛了,对于知识的查找能力也哟有不少提升。但是回忆起来还是满满的心痛。