Python 抖音评论数据抓取分析
作者:Python学习与数据挖掘 发布时间:2023-03-22 15:30:20
张同学 10.4号开始发视频,视频的点赞量一直很高,11.17 号的视频达到了顶峰,收获 250w 个赞,之后关注量也开启了暴涨。
所以挖掘 11.17 号视频的评论,更有助于我们达成目的。另外,为方便大家更好的学习爬虫技术和数据可视化分析,完整版代码我放在文末。
1. 抓取数据
抖音出了 web 版,抓取数据方便了很多。
抓评论
滑到网页评论区,在浏览器网络请求里过滤包含comment的请求,不断刷新评论就可以看到评论的接口。
有了接口,就可以写 Python 程序模拟请求,获取评论数据。
请求数据要设置一定间隔,避免过大请求,影响别人服务
抓取评论数据有两点需要注意:
有时候接口可能返回空数据,因此需要多试几次,一般过了人工滑动验证后的接口基本可用
不同页面之间的数据可能会重复,所以需要跳页请求
2. EDA
11.17 号的视频有 12w 条评论,我只抓取了 1w 多条。
text列是评论。
先对数据做一些探索性的分析,之前介绍过几个EDA工具,可以自动产出基础的数据统计和图表。
这次我用的是ProfileReport
# eda
profile = ProfileReport(df, title='张同学抖音评论数据', explorative=True)
profile
评论时间分布
从评论的时间分布来看,由于发布的视频的时间是17号,所有17、18号评论发布量比较多。不过再往后甚至到了 12.9 号,仍然有不少新评论产生,说明视频热度确实很高。
评论的长度分布
大多数评论的字数在 20 以内,基本不超过 40 个字,说明都是短文本。
评论者身份
参与评论的人里, 99.8% 是没有认证身份的,说明评论用户里基本都是普通用户。
3. LDA
上面的统计数据还是太粗略了。但我们要想知道大家的感兴趣点在哪,又不可能细到把 1.2w 条评论全部看完。
所以需要对这些评论先做一次归类,相当于把数据升维,抽象。因为只有将数据升维,了解每个维度的含义和占比,才能帮助我们从全局角度掌握数据。
这里我用LDA算法对文本聚类,聚合在一起的评论可以看做属于同一个主题。
LDA算法的核心思想有两点:
具有一定相似性的文本会聚合在一起,形成一个主题。每个主题包含生成该主题需要的词,以及这些词的概率分布。以此可以人为推断出主题的类别。
每篇文章会它有在所有主题下的概率分布,以此可以推断出文章属于哪个主题。
比如,经过LDA算法聚类后,某个主题中,战争、军费这类词出现概率很高,那么我们可以将该主题归类为军事。如果有一篇文章属于军事主题的概率很高,我们就可以将该文章分为军事一类。
简单介绍完LDA的理论,下面我们来实战一下。
3.1 分词、去停用词
# 分词
emoji = {'可怜', '发呆', '晕', '灵机一动', '击掌', '送心', '泣不成声', '哈欠', '舔屏', '偷笑', '愉快', '再见', '666', '熊吉', '尬笑', '吐舌', '撇嘴', '看', '绿帽子', '捂脸', '呆无辜', '强壮', '震惊', '阴险', '绝', '给力', '打脸', '咖啡', '衰', '一起加油', '酷拽', '流泪', '黑脸', '爱心', '笑哭', '机智', '困', '微笑袋鼠', '强', '闭嘴', '来看我', '色', '憨笑', '不失礼貌的微笑', '红脸', '抠鼻', '调皮', '紫薇别走', '赞', '比心', '悠闲', '玫瑰', '抱拳', '小鼓掌', '握手', '奸笑', '害羞', '快哭了', '嘘', '惊讶', '猪头', '吐', '暗中观察', '不看', '啤酒', '呲牙', '发怒', '绝望的凝视', '大笑', '吐血', '坏笑', '凝视', '可爱', '拥抱', '擦汗', '鼓掌', '胜利', '感谢', '思考', '微笑', '疑问', '我想静静', '灵光一闪', '白眼', '泪奔', '耶'}
stopwords = [line.strip() for line in open('stop_words.txt', encoding='UTF-8').readlines()]
def fen_ci(x):
res = []
for x in jieba.cut(x):
if x in stopwords or x in emoji or x in ['[', ']']:
continue
res.append(x)
return ' '.join(res)
df['text_wd'] = df['text'].apply(fen_ci)
由于评论中有许多 emoji 表情, 我抽取了所以 emoji 表情对应的文本,生成 emoji 数组,用于过滤表情词。
3.2 调用LDA
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import numpy as np
def run_lda(corpus, k):
cntvec = CountVectorizer(min_df=2, token_pattern='\w+')
cnttf = cntvec.fit_transform(corpus)
lda = LatentDirichletAllocation(n_components=k)
docres = lda.fit_transform(cnttf)
return cntvec, cnttf, docres, lda
cntvec, cnttf, docres, lda = run_lda(df['text_wd'].values, 8)
经过多次试验,将数据分成 8 类效果较好。
选取每个主题下出现概率 top20 的词:
主题的词分布
从这些词概率分布,归纳各主题的类别,主题0 ~ 主题7分别是:居然看完、知道钥匙在哪、农村生活、喂狗、拍摄手法、还用锁门?、鸡蛋放盐多、袜子放枕头下。
统计主题占比:
主题占比
红色的是主题3(喂狗),占比最大,很多人评论是:以为要做给自己吃,没想到是喂狗的。我看的时候也是这样认为的。
其他各主题占比比较均匀。
经过主题分类后,我们可以发现,张同学不仅仅是农村生活引起了大家的关注,更多的是视频中大量反常态的镜头。
最后,用树状图展示各主题及对应的具体评论。
核心代码已经贴在文章里,完整代码如下方式领取。
代码
链接:https://pan.baidu.com/s/1FnIgkW2b_uVtQq1Z-i8PJA
提取码:1234
来源:https://blog.csdn.net/weixin_38037405/article/details/122389962


猜你喜欢
- 问题描述??输入一个正整数n在n*n的方阵内填入1,2,3,4…n*n,要求填成蛇形。(回旋的向中间收敛)样例输入:4样例输出:不必严格按照
- 前言在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的。Python是动态类型语言,也就是说不
- 缓存的介绍在 * 站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面当一个网
- 今天我升级MYSQL到5.1的时候遇到的。写出来共享以下。1、[root@localhost mysql]# scripts/mysql_i
- 关于数据可视化的模块,之前已经分享过很多了,小伙伴们可以到历史文章中搜索,不过都是静态的可视化数据展示效果。这几天刚刚发现的这款动态数据可视
- 【OpenCV】⚠️高手勿入! 半小时学会基本操作 ⚠️ 概述模板概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大.
- 本文实例讲述了Python实现的ftp服务器功能。分享给大家供大家参考,具体如下:python 具备强大的网络编程功能,而且代码简介,用简单
- 什么是Nacos英文全称Dynamic Naming and Configuration Service,Na为naming/nameSer
- 从cnblogs看到的代码,作者的代码随便不兼容firefox但,有助于大家学习为什么下面的代码兼容了firefox,大家可以对比下,有助于
- 基本介绍Pinia 是 Vue.js 的轻量级状态管理库官方网站:pinia.vuejs.org/pinia和vuex4一样,也是vue官方
- 绘制直线图,确定x范围和y的范围代码:import matplotlib.pyplot as pltimport numpy as npxp
- 题目:汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材。除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,
- 今天开始学习数据库,由于我对微软不怎么感冒,所以就不用他家的产品了本来想装ORACLE的,不过太大了,看着害怕对于我这种喜欢一切从简的人来说
- Flask提供了多种身份认证方式,其中基于Token的身份认证是其中一种常用方式。基于Token的身份认证通常是在用户登录之后,为用户生成一
- 一直以来都对编译器和解析器有着很大的兴趣,也很清楚一个编译器的概念和整体的框架,但是对于细节部分却不是很了解。我们编写的程序源代码实际上就是
- 1. 扩展Tensor维度相信刚接触Pytorch的宝宝们,会遇到这样一个问题,输入的数据维度和实验需要维度不一致,输入的可能是2维数据或3
- 除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现
- 一、需求分析有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录。现在需要读取这些txt文件,判断key是否在数据仓库中。
- 所有平台的Mysql下载地址为:MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台。
- 使用suds这个第三方模块from suds.client import Clienturl = 'http://ip:port/?