数据采集技术综合项目实战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…

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>() 这行代码就指明了…

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

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

项目实践:贪吃蛇

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

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

点击跳转到题目 方法&#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;并且内部延时…

客户端动态降级系统

本文字数&#xff1a;4576字 预计阅读时间&#xff1a;20分钟 01 背景 无论是iOS还是Android系统的设备&#xff0c;在线上运行时受硬件、网络环境、代码质量等多方面因素影响&#xff0c;可能会导致性能问题&#xff0c;这一类问题有些在开发阶段是发现不了的。如何在线上始终…

【命名空间详解】c++入门

目录 命名空间的定义 1.命名空间的正常定义 2.命名空间还可以嵌套 3. 命名空间可以合并 命名空间的使用 1.加命名空间名称及作用域限定符 2.使用using将命名空间中某个成员引入 3.使用using namespace 命名空间名称 引入 输入&#xff0c;输出 输出 命名空间的定义 …

Java技术学习|Git

学习材料声明 尚硅谷Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; GIt Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有…

英伟达大跳水!一夜暴跌10%,市值蒸发2000亿

相信大家已经在各大社交平台上看到了&#xff0c;英伟达一夜蒸发了2000亿美元&#xff01; GPT-3.5研究测试&#xff1a; https://hujiaoai.cn GPT-4研究测试&#xff1a; https://higpt4.cn Claude-3研究测试&#xff08;全面吊打GPT-4&#xff09;&#xff1a; https://hic…

大语言模型隐私防泄漏:差分隐私、参数高效化

大语言模型隐私防泄漏&#xff1a;差分隐私、参数高效化 写在最前面题目6&#xff1a;大语言模型隐私防泄漏Differentially Private Fine-tuning of Language Models其他初步和之前的基线微调模型1微调模型2通过低秩自适应进行微调&#xff08; 实例化元框架1&#xff09; 在隐…

Vue2 —— 学习(九)

目录 一、全局事件总线 &#xff08;一&#xff09;全局总线介绍 关系图 对图中的中间商 x 的要求 1.所有组件都能看到 2.有 $on $off $emit &#xff08;二&#xff09;案例 发送方 student 接收方 二、消息订阅和发布 &#xff08;一&#xff09;介绍 &#xff08…

虚拟机中的打印机,无法打印内容,打印的是白纸或英文和数字,打印不了中文

原因&#xff1a;打印机驱动设置不正确 解决方案&#xff1a; 打开打印机属性 -> 高级 -> 新驱动程序 下一页 -> Windows 更新 耐心等待&#xff0c;时间较长。 选择和打印机型号匹配的驱动&#xff0c;我选择的是&#xff1a; 虽然虚拟机和主机使用的驱动不…

跨境电商指南:防关联浏览器和云主机有什么区别?

跨境电商的卖家分为独立站卖家和平台卖家。前者会自己开设独立站点&#xff0c;比如通过 shopify&#xff1b;后者则是入驻亚马逊或 Tiktok 等平台&#xff0c;开设商铺。其中平台卖家为了扩大收益&#xff0c;往往不止开一个店铺&#xff0c;或者有店铺代运营的供应商&#xf…

皇后之战:揭秘N皇后问题的多维解法与智慧【python 力扣52题】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

Go之map详解

map的结构 map实现的两个关键数据结构 hmap 定义了map的结构bmap 定义了hmap.buckets中每个bucket的结构 // A header for a Go map. type hmap struct {count int // 元素的个数flags uint8 // 状态标记&#xff0c;标记map当前状态&#xff0c;是否正在写入B …

css层叠性,继承性,优先级

前言 本文概要&#xff1a;讲述css的三大特性&#xff0c;层叠&#xff0c;继承和优先级。 层叠性 描述&#xff1a;我们试想以下这种情况&#xff1a;我们定义了同一个选择器&#xff0c;但是定义的属性不同。属性有相同的也有不同的&#xff0c;那么最后我们这个页面会听谁的…