数据采集技术综合项目实战3(网络爬虫+数据预处理+数据可视化)附带详细步骤说明,干货满满

项目介绍及需求:

本项目主要是通过对b站电影弹幕进行采集并分析。1.获得弹幕高频词生成符合该电影特征、主题、角色等相关字段的词云图,通过词云图的方式对某部电影主题具体化。2.获取用户年内评论发布时间观生成时间的折线图,以便从侧面观察该电影在不同的年播放量。3.获取年内周内评论发布时间生成时间的折线图,以便观察每周用户的生活特性。

数据采集部分:

目标网址:【动画/奇幻】西游记之大圣归来(2015)_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1vs411d7eJ/?spm_id_from=333.337.search-card.all.click&vd_source=6ad54d82286ed98cdb21f8eb15b8df5f

爬虫思路分析:

1.确定采集目标:爬取“大圣归来”的弹幕包括用户、弹幕发布时间、弹幕具体内容、出现时间点、弹幕池、颜色等字段,如下图所示:

2.查看评论来源:打开网页源代码,按住“Ctrl+F”搜索相应评论,发现并无相关对应信息;但通过百度发现,B站的弹幕数据文件的url为“固定的url地址+视频的cid+.xml”。这里为:https://comment.bilibili.com/5119936.xml

在浏览器中对的步骤二获得的网址文件发起请求,如下图所示:

3.确定采集技术:由步骤二可见,每一个d标签内存储着每一条评论的具体信息,包括弹幕具体内容、出现时间点、用户ID等相关字段;这里直接使用BeautifulSoup解析方式直接对d标签中的内容进行采集(可有效减少代码量)。

解析后如下图所示:

分割数据:又步骤3可得,解析后得到的d标签内的p数据是字符串类型,这里(因为是用逗号分隔)则直接使用字符串的spilt方法对逗号进行分隔。

然后定义数据框,将分割后的内容放入数据框中。

5.控制台输出拼接完后的数据框信息,如下图所示:

输出数据框内数据:

通过data.to_csv ('file_name.csv', encoding='')语句即可将数据框保存为csv文件;如下图所示:

数据预处理部分:

预处理思路分析:

1.转变标准时间:先使用了apply函数和lambda函数来实现每个时间戳转换为对应的日期时间格式,并将转换后的日期时间以'%Y-%m-%d %H:%M:%S'的格式表示转换通过再通过pands库的to_datetime方法将发送时间进行转化,转化结果如下图所示(左边:转化前,右边:转化后):

结果演示:

原数据格式:

将时间戳转化为日期时间格式(此时为字符串):

将日期时间格式转化为标准时间:

2.数据探究:观察列表框内相关数据:通过value_counts()方法来查看该列中的元素出现了几次,通过shape()方法即可观察数据框剩余几行数据;通过columns()方法可看出清洗后的数据框的列索引。

数据可视化部分:

(1)根据评论分词出现频率生成词云图:

1.分词:导入jieba库,将拼接后的comment.csv文件进行读取,再对data_all中的content列中的每个文本进行分词操作,使用jieba.lcut函数对文本进行切词。

import pandas as pd
import jieba
from tkinter import _flatten
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from PIL import Image
import numpy

# 数据读取
comments = pd.read_csv('comment.csv',encoding='utf8')

# (1)分词
comment_cut = comments['comment'].apply(jieba.lcut)

2.去除停用词:读取名为stopword.txt的停用词文件,将文件中的停用词加载到stop_list列表中,然后将额外的词语'哈哈哈' 、 '哈哈哈哈' 、 '    ' 、 '呜呜' 、 '啊啊啊'等词添加到stop_list列表中。接着,对经过分词后的文本数据进行停用词过滤,去除stop_list中的词语。

# (2)去除停用词
with open('stopword.txt', encoding = 'utf-8' ) as f:
    stop_list = f.read()
# 扩充停用词表
stop_list = stop_list + '哈哈哈' + '哈哈哈哈' + '    ' + '呜呜' + '啊啊啊'

comment_after = comment_cut.apply(lambda x:[i for i in x if i not in stop_list])

3.统计词频:将经过停用词过滤后的文本数据转换为一个包含所有词语的列表words,然后使用pd.Series(words).value_counts()方法统计每个词语出现的频率,得到词频统计结果。

# (3)统计词频
word = _flatten(list(comment_after))
word_freq = pd.Series(word).value_counts()
print(word_freq)

4.生成词云图:根据本机内文字字体路径确定生成词云图的文字字体(font_path)、自定义背景图、背景颜色;若未定义文字字体这一步将导致生成图形的文字无法看见,最后通过to_file()方法保存词云图即可。

# (4)词云图的绘制
# 获取词云图背景轮廓
mask = numpy.array(Image.open("p1.png"))
# 创建词云图对象
wc = WordCloud(font_path = "C:/Windows/Fonts/msyh.ttc", mask=mask, background_color='white')
wc.fit_words(word_freq)
plt.imshow(wc)
plt.axis("off")
plt.show()
# 保存生成的词云图
wc.to_file('词云图.png')

结果演示:

结论:由图可得该电影的受众者主要是来自观看西游记被孙悟空的优秀品质所“征服”的粉丝,从词云上即可看出观众的热情高涨!一致好评!

(2)生成弹幕发布数量随日期变化折线图

1.设置绘图参数:字体。

import matplotlib as mpl

mpl.use('TkAgg')

# 设置绘图属性
plt.rcParams['font.sans-serif'] = 'SimHei'

2.将在数据预处理部分的步骤1转化得到的标准时间‘发送时间’通过num = comments['发送时间'].dt.date.value_counts().sort_index()方法得到日期部分(去除时间部分),然后使用value_counts()函数对日期进行计数,得到每个日期出现的次数求和并排序赋值给num。

# 它使用dt.date将时间戳转换为日期部分(去除时间部分),然后使用value_counts()函数对日期进行计数,得到每个日期出现的次数
# 其中索引是日期,值是该日期出现的次数
num = comments['发送时间'].dt.date.value_counts().sort_index()

3.使用‘gglot’的绘图风格,使用matplotlib.pyplot的plot方法建立折线图,横坐标为num的索引(即日期在排序后的位置),纵坐标为num中对应日期出现的次数。

plt.style.use('ggplot')
plt.figure(figsize=(16, 9))
# 绘制折线图,横坐标为num的索引(即日期在排序后的位置),纵坐标为num中对应日期出现的次数。
plt.plot(range(len(num)), num)

4.最后使用matplotlib.pyplot的xticks方法设置x轴刻度标签、标题、倾斜度等。

# 取横坐标的每隔21个数据点的位置作为刻度
plt.xticks(range(len(num))[::21], num.index[::21], rotation = 40)
plt.ylabel('弹幕数量')
plt.title('弹幕发布数量随日期变化图')
plt.show()

结果演示:

结论:由图可得:该电影于2021年10月05日弹幕评论出现高峰点,大多数观众于该日对6年前的电影进行回味。

3生成弹幕发布数量周内发布折线图

1.与(2)中步骤1、2一致,唯一不同的是此处使用dt.dayofweek方法将发送时间列的时间戳转换为日期时间格式,并提取出日期部分转换为对应的星期几(用中文表示)。然后再将获得的星期几以顺序排好。

# 将发送时间列的时间戳转换为日期时间格式,并提取出日期部分
# 将日期转换为对应的星期几(用中文表示),并统计每个星期几的评论数量。
num = comments['发送时间'].dt.dayofweek.map({0:"周一", 1:"周二", 2:"周三", 3:"周四", 4:"周五", 5:"周六", 6:"周日"}).value_counts()
# 将获得的时间按顺序排好
num = num[['周一', '周二', '周三', '周四', '周五', '周六', '周日']]

2.与(2)中的步骤3一致,可举一反三。

结果演示:

结论:由图可知,大多数观众与周日会选择以观看电影的方式来缓解一周的工作压力。

注意:因文章篇幅问题,部分源代码以及用户发表评论分布图、随播放时间评论发布图等无法展现,如有需要,请在后台私信博主哦~

创作不易,请点个赞哦~

还有更多优秀作品在博主主页~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/559826.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS-静态库(SDK)的创建和使用

文章目录 一、静态库(SDK)二、创建静态库1.新建静态库模块2. 开发静态库内容3. 编译静态库 三、使用静态库1. 配置项目依赖2. 在应用中使用静态库3. 注意事项 四、打包错误1. library引用本地har包错误 一、静态库(SDK) 在Harmon…

【35分钟掌握金融风控策略6】决策树风控策略开发

目录 ​编辑 决策树 决策树原理 决策树生成 特征选择 决策树生成 决策树剪枝 决策树 决策树(Decision Tree)是一种强大的分类和预测方法,因其实践起来比较简单且具有较好的解释性,所以在金融风控领域应用广泛。决策树也是…

如何快速提高阿里国际、Shopee和速卖通产品的曝光率?

当卖家完成产品上传后,他们还能做些什么来进一步提升产品的曝光量呢?产品的曝光量无疑对店铺的销量具有显著影响,那么,如何有效地提升产品曝光量呢?又有哪些快速且实用的方法呢?今天,我们就来深…

【力扣 Hot100 | 第五天】4.20(回文链表)

1.回文链表 1.1题目 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例一: 输入:head [1,2,2,1] 输出:true示例二: 输入…

智慧城市标准化白皮书(2022版)发布

2022年7月25日,国家智慧城市标准化总体组2022年度全体会议召开期间,《智慧城市标准化白皮书(2022版)》正式发布。 城市作为一个复杂巨系统,是多元主体融合及多元活动集聚的复杂综合体。城市的运行发展关联 到发展、治…

康耐视visionpro-Cog2DSymbolTool操作操作工具详细说明

Cog2 DSymbolToolI功能说明: 二维码读取工具 Cog2 DSymbolTool操作说明: ①.打开工具栏,双击或点击鼠标拖拽添加Cog2DSymbolTool工具 ②.添加输入图像,右键“链接到”或以连线拖拽的方式选择相应输入图像。 ③.代码系统&#x…

Pytest精通指南(22)钩子函数-重复执行(pytest-repeat)

文章目录 前言应用场景插件安装参数分析使用方式一:命令行使用方式二:配置文件使用方式三:装饰器 前言 pytest框架中的**重复测试(pytest-repeat)**插件的用途是允许在运行测试用例时进行多次循环,以更全面…

2024年开通最新版云开发cms步骤,开始开发微信小程序前的准备工作,认真看完奥!

小程序官方有改版了,搞得石头哥不得不紧急的再新出一版,教大家开通最新版的cms网页管理后台 一,技术选型和技术点 1,小程序前端 wxml css JavaScript MINA原生小程序框架 2,数据库 云开发 云数据库 云…

中毒的电脑插U盘也会中毒吗?U盘中毒了不显示数据怎么办

随着数字技术的快速发展,U盘作为数据存储和传输的重要工具,广泛应用于我们的日常生活和工作中。然而,U盘在带来便利的同时,也带来了潜在的安全风险。当一台中毒的电脑插入U盘时,U盘是否也会被感染?如果U盘中…

PHP 爬虫如何配置代理 IP(CURL 函数)

在 PHP中 配置代理IP&#xff0c;可以通过设置 CURL 库的选项来实现&#xff0c;代码如下&#xff1a; 当然你要有代理ip来源&#xff0c;比如我用的这个 代理商 &#xff0c;如果想服务稳定不建议找开源代理池&#xff0c;避免被劫持。 <?php // 初始化cURL会话 $ch cu…

C++中的stack(容器适配器)

目录 一、成员函数 一、构造函数 二、入栈 三、出栈 四、判空 empty () 五、栈大小 size 六、取栈顶元素 top 七、入栈 emplace 八、交换函数 swap 二、非成员函数重载 一、关系运算符重载 二、交换函数 C中的stack不再是容器&#xff0c;而是容器适配器 注意&a…

[InternLM训练营第二期笔记]4. XTuner 微调 LLM:1.8B、多模态、Agent

该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。 该笔记是第四节课&#xff0c;学习大语言模型微调的基本概念&#xff0c;以及利用XTuner工具进行微调。 0. 什么是LLM中的微调 0.1 两种Finetune范式 微调的目的是为了让foundation模型在特定的领域更好地发挥…

力扣练习题(2024/4/18)

1不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线不与任何其他连线&#xff08;非水平线…

mysql按季度统计数据

最近遇到按表里得交付时间换成季度取统计&#xff0c;如下&#xff1a; select sp.Id,sp.title,QUARTER(sp.expected_delivery_time) dateStr,CONCAT(DATE(MIN(sp.expected_delivery_time)),至,DATE(MAX(sp.expected_delivery_time))) dateStr2,sp.DemandType,sp.IndustryGrou…

【人工智能基础】状态空间搜索

状态空间法 状态空间&#xff1a;一个问题全部可能的状态以及其关系的集合。 状态空间图&#xff1a;以图的形式表示问题的状态空间&#xff0c;节点对应状态&#xff0c;边对应状态转移算子&#xff0c;边上的权对应转移所需的代价 问题的解&#xff1a;是从最开始状态到目…

BP使用和弱口令漏洞

目录 一、BP使用 1.BP设置 2.Proxy 3.Reapter 4.Decord 5.Intruder 二、弱口令爆破 1.服务弱口令爆破 2.验证码绕过 一、BP使用 1.BP设置 设置代理的监听端口: 这里设置为本机的9090端口 2.Proxy 浏览器要挂代理&#xff0c;设置为本机的9090端口 打开拦截功能 当浏览…

Youtube DNN

目录 1. 挑战 2. 系统整体结构 3.召回 4. 排序 5. 训练和测试样本的处理 1. 挑战 &#xff08;1&#xff09;规模。很多现有的推荐算法在小规模上效果好&#xff0c;但Youtobe规模很大。 &#xff08;2&#xff09;新颖度。Youtobe语料库是动态的&#xff0c;每秒都会有…

Windows如何安装JDK

JDK和JRE简介 JDK&#xff1a;Java Development ToolKit java开发工具包&#xff0c;包含JRE针对java程序开发者 JRE&#xff1a;Java Runtime Environment java程序的运行环境针对java使用者来说 下载JDK&#xff0c;进入官网下载 Oracle官网 双击下载好之后的exe文件&#…

关于Python中install edge_tts记录

如下代码&#xff1a; #!/usr/bin/env python3""" Basic audio streaming example.This example shows how to stream the audio data from the TTS engine, and how to get the WordBoundary events from the engine (which could be ignored if not needed).…

分保、等保、关保、密评之间联系与区别

分保、等保、关保、密评之间联系与区别 什么是“三保一评”分保等保关保密评 相关的法律法规依据分保等保关保密评 分保工作简介分保工作流程分级保护技术要求 等保工作简介关保工作简介密评工作简介三保一评联系与区别 什么是“三保一评” 分保 涉密信息系统分级保护 指涉密信…