数据采集技术综合项目实战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 mplmpl.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.mzph.cn/pingmian/1093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Vue项目使用kindEditor富文本编译器以及上传图片

第一步 npm install kindeditor第二步&#xff0c;建立kindeditor.vue组件 <template><div class"kindeditor"><textarea :id"id" name"content" v-model"outContent"></textarea></div> </templa…

Android中logcat日志、ANR日志、trace日志的介绍与分析方法

Logcat日志 在Android开发中&#xff0c;日志是开发者在应用程序中添加的一种输出信息的记录方式&#xff0c;用于查看应用程序在运行时的状态、调试信息、错误信息等。Android日志可以帮助开发者追踪应用程序的行为、诊断问题并进行调试。Android提供了一系列的日志输出方法&…

使用 vllm 运行 Llama3-8b-Instruct

使用 vllm 运行 Llama3-8b-Instruct 0. 引言1. 安装 vllm2. 运行 Llama3-8b-Instruct 0. 引言 此文章主要介绍使用 vllm 运行 Llama3-8b。 1. 安装 vllm 创建虚拟环境&#xff0c; conda create -n myvllm python3.11 -y conda activate myvllm安装 Ray 和 Vllm&#xff0c…

富格林:致用查明暗箱黑幕技巧

富格林认为&#xff0c;投资现货黄金对于新手投资者来说是一个很好的选择&#xff0c;但是在进行投资之前需要了解一些基本的技巧和策略用以查明暗箱黑幕。事实上&#xff0c;现货黄金市场充满着丰富的交易机会&#xff0c;以及并存的交易风险&#xff0c;因此投资者要想在这其…

动态规划——状态压缩dp

acwing291.蒙德里安的梦想 #include<iostream> #include<cstring>using namespace std;const int N 12, M 1 << N;long long int f[N][M]; //f[i][j]表示第i列j状态有多少个可行解 int n, m; bool st[M]; //st[i]表示合并列的状态i是否合法int main() {wh…

10分钟快速部署 Doris 集群

部署 Doris 集群通常涉及多个步骤&#xff0c;包括下载和解压软件包、配置 FE 和 BE 节点以及启动服务。下面是在三台 Linux 服务器上部署一个包含三个 FE (Frontend) 和三个 BE (Backend) 的 Doris 集群的详细步骤&#xff1a; 服务器ip&#xff1a;192.168.0.103、192.168.0.…

02_补充)docker学习 docker在线安装tomcat等,docker容器常用指令

01中安装好docker后&#xff0c;本章学习使用docker拉取tomcat&#xff0c;nginx&#xff0c;jdk等镜像&#xff0c;并创建容器启动测试 常用命令 # 基本信息查看 docker version # 查看docker的版本号&#xff0c;包括客户端、服务端、依赖的Go等 docker info # 查看系统(…

【vue3】插件@tsparticles/vue3、tsparticles实现粒子特效

文章目录 一、安装依赖二、全局引入三、使用 一、安装依赖 npm i tsparticles/vue3 npm i tsparticles二、全局引入 // main.js import Particles from tsparticles/vue3 import { loadFull } from tsparticlesconst app createApp(App) app.use(Particles, {init: async (e…

java泛型知多少

Java 泛型了解么&#xff1f; 泛型是一种在编译时提供类型安全检查的机制,可以增加我们代码的可读性和安全性。泛型可以在编译时期对泛型参数进行校验来指定选入对象的类型&#xff0c;比如 ArrayList<Person> persons new ArrayList<Person>() 这行代码就指明了…

【设计模式】6、bridge 桥接模式

六、bridge 桥接模式 桥接设计模式 复杂逻辑拆分&#xff1a; 如果需要完成复杂的逻辑&#xff0c;可以把复杂逻辑设计为接口&#xff0c;内部再拆分为若干接口。这样复杂的逻辑会被拆分开&#xff0c;方便解耦。 例如&#xff1a;如果遥控器控制设备。可以遥控器设计为复杂…

销售经理(多继承/虚基类)

根据下图类之间的继承关系&#xff0c;以及main和输出定义&#xff0c;定义Staff类、Saleman类、Manager类和SaleManager类。 Staff类包含的数据成员有编号&#xff08;num)&#xff0c;姓名&#xff08;name)&#xff0c;基本工资&#xff08;basicSale&#xff09;。Saleman类…

pytorch中模型训练的学习率动态调整

pytorch动态调整学习率 背景手动设置自动衰减的学习率pytorch中的torch.optim.lr_schedulertorch.optim.lr_scheduler.ExponentialLRtorch.optim.lr_scheduler.StepLRtorch.optim.lr_scheduler.MultiStepLRtorch.optim.lr_scheduler.ReduceLROnPlateau 背景 在神经网络模型的训…

项目实践:贪吃蛇

引言 贪吃蛇作为一项经典的游戏&#xff0c;想必大家应该玩过。贪吃蛇所涉及的知识也不是很难&#xff0c;涉及到一些C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。这里我会介绍贪吃蛇的一些思路。以及源代码也会给大家放到文章末尾。 我们最终的…

优雅的最大公约数函数

记录一个极其优雅的最大公约数方法 // 递归形式 int gcd(int a, int b) {return b 0 ? a : gcd(b, a % b); }这里求最大公约数的方法使用了辗转相除法&#xff0c;只是比循环求最大公约数的方法更加优雅与简洁&#xff1a; // 迭代形式 int gcd(int a, int b) {while(b ! 0…

电大搜题微信公众号:福建开放大学学子的学习新篇章

在当今信息化时代&#xff0c;学习已经成为每个人不可或缺的一部分。福建开放大学&#xff0c;作为广播电视大学的重要一员&#xff0c;始终致力于为学生提供优质、灵活的教育资源。而电大搜题微信公众号的推出&#xff0c;更是为福建开放大学的学子们带来了全新的学习体验&…

【数学】常用等价无穷小及其注意事项示例

常用极限 lim ⁡ x → 0 sin ⁡ x x 1 \lim_{x \to 0} {\frac{\sin x}{x}}1 limx→0​xsinx​1 lim ⁡ x → 0 ( x 1 ) 1 x e \lim_{x \to 0} {(x1)^\frac{1}{x}}e limx→0​(x1)x1​e lim ⁡ n → ∞ a n 1 \lim_{n \to \infty} {\sqrt[n]{a}}1 limn→∞​na ​1 lim ⁡ n…

数组中两个字符串的最短距离---一题多解(贪心/二分)

点击跳转到题目 方法&#xff1a;贪心 / 二分 目录 贪心&#xff1a; 二分&#xff1a; 贪心&#xff1a; 要找出字符串数组中指定两个字符串的最小距离&#xff0c;即找出指定字符串对应下标之差的最小值 思考&#xff1a;如果是直接暴力求解&#xff0c;需要两层for循环…

VLOOKUP函数使用,为什么会报错“引用有问题”?

VLOOKUP函数的使用非常广泛&#xff0c;在excel2007版之后的软件中&#xff0c;使用VLOOKUP函数也许会遇到这样的场景&#xff0c;明明公式是没有问题的&#xff0c;公式还会报错“引用有问题”。 一、报错场景 输入公式后&#xff0c;回车确认&#xff0c;显示如下报错&…

xilinx cpri ip 开发记录

CPRI是无线通信里的一个标准协议&#xff0c;连接REC和RE的通信。 Xilinx有提供CPRI IP核。 区别于其它通信协议&#xff0c;如以太网等&#xff0c;CPRI是一个同步系统。 这就意味着两端的Master和Slave应当是同源时钟的&#xff0c;两边不存在频差&#xff0c;并且内部延时…

mysql 行锁,间隙锁,临键锁,锁范围和死锁实际例子实战

文章目录 背景锁介绍表默认数据测试唯一键记录存在事务1事务2结论 唯一键记录不存在事务1事务2结论 范围查询事务1事务2结论 普通索引存在事务1事务2总结 普通索引不存在事务A事务B结论 死锁例子 背景 想了解下RR事务如何防止幻读的&#xff0c;以及一个实际的死锁例子 锁介绍…