我挺喜欢看B站up主-老师好我叫何同学 , 所以今天就用bsite库采集一下何同学的视频信息及评论数据,每个视频的评论以csv文件存储于data/comments内。
本文涉及
pandas读取数据
选取某列
多个dataframe的合并
dataframe中某字段(series)的统计
中文分词
词频统计
os库文件操作
一、视频
何同学视频相关信息
import pandas as pd
df = pd.read_csv('data/videos.csv')
df.head()
author | bvid | aid | mid | created | length | comment | description | pic | play | subtitle | title | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 老师好我叫何同学 | BV1TV411S7pw | 414410641 | 163637592 | 1598786594 | 05:31 | 11874 | 动画:joyteeth yami\n特效:flashyami\n感谢九老师对本期视频的巨大帮助! | https://i2.hdslb.com/bfs/archive/cf4dbe6189b8d... | 5236179 | NaN | 【何同学】“看不见”的未来 小米透明电视使用体验 |
1 | 老师好我叫何同学 | BV1Nt4y1D7pW | 626524324 | 163637592 | 1596370232 | 10:33 | 174259 | 3D动画:joyteeth\n开头特效:flashyami\n制片:九老师\n感谢木头老师对... | https://i2.hdslb.com/bfs/archive/3c1a8b5f76251... | 10823508 | NaN | 【何同学】我拍了一张600万人的合影... |
2 | 老师好我叫何同学 | BV1Xi4y1x7eM | 540601597 | 163637592 | 1588766418 | 05:04 | 17924 | 简介:\n滑屏程序:罗工\n网站 :银翼的魔术师MX\n动画:何同学 joyteeth ch... | https://i2.hdslb.com/bfs/archive/d8713881cbcaf... | 6378068 | NaN | 【何同学】我用一万行备忘录做了个动画... |
3 | 老师好我叫何同学 | BV1wV411d7Dc | 412909688 | 163637592 | 1587561038 | 05:25 | 17201 | 感谢233同学帮助制作本期视频\n感谢橙同学借我的Mate XS | https://i2.hdslb.com/bfs/archive/a5f5b0e965137... | 4995826 | NaN | 【何同学4K】3299真香?iPhone SE使用体验 |
4 | 老师好我叫何同学 | BV1YK4y1C7CU | 882566744 | 163637592 | 1585658950 | 07:51 | 23851 | 感谢@贰_33为本期视频加了音效\n开头是对马男波杰克S04E06的拙劣模仿 | https://i2.hdslb.com/bfs/archive/67b9aed25aa4c... | 6082972 | NaN | 【何同学】一只鸽子的自白 |
1.1 播放量
视频平均播放量(单位: 万)
df['play'].mean()/10000
379.38345675675674
1.2 评论量
# 视频平均评论量
df['comment'].mean()
12769.243243243243
# 评论总量
df['comment'].sum()
472462
1.3 视频时长
视频平均时长(单位: min)
def minute2second(minute):
info = minute.split(':')
return int(info[0])*int(info[1])
df['length'].apply(minute2second).mean()/60
3.433333333333333
1.4 词频统计
对何同学视频的description字段数据进行汇总,分词、词频统计
import jieba
import re
# 整理数据
df['description'] = df['description'].astype(str)
description = ''.join(df['description'])
#清洗数据
description = ''.join(re.findall('[\u4e00-\u9fa5]+', description))
# 分词&词频统计个
words = jieba.lcut(description)
wordfreqs = []
for word in set(words):
freq = words.count(word)
wordfreqs.append((word, freq))
# 保存结果
data = pd.DataFrame(wordfreqs, columns=['word', 'freq'])
data.to_csv('output/视频词频.csv', index=False)
1.5 关键词
使用stylecloud进行词云图可视化
import stylecloud
stopwords = open('data/stopwords.txt', encoding='utf-8').read().split('\n')
stylecloud.gen_stylecloud(file_path='output/视频词频.csv',
font_path='data/SourceHanSansCN-Regular.otf',
output_name='output/何同学的视频关键词.png',
size=500,
custom_stopwords=stopwords)
output/何同学的视频关键词.png)
二、评论
2.1 评论文件查看
所有评论csv数据存储于data/comments文件夹内,查看下csv
import os
os.listdir('data/comments')
['19780443.csv',
'28684677.csv',
'540601597.csv',
'79091085.csv',
'.DS_Store',
'412909688.csv',
'23278605.csv',
'17703816.csv',
'15196234.csv',
'69358135.csv',
'60043361.csv',
'54737593.csv',
'35049732.csv',
'882566744.csv',
'414410641.csv',
'19205223.csv',
'27469164.csv',
'42349835.csv',
'29437173.csv',
'81516881.csv',
'15147368.csv',
'47180907.csv',
'66210564.csv',
'49432234.csv',
'33249554.csv',
'16581287.csv',
'33489311.csv',
'22042515.csv',
'43248892.csv',
'20209991.csv',
'37220850.csv',
'74166406.csv',
'30630027.csv',
'92699533.csv',
'32146794.csv',
'44080002.csv',
'52466874.csv',
'626524324.csv']
## 评论文件个数(视频个数)
len(os.listdir('data/comments'))
38
2.2 查看某评论csv
评论文件夹内有很多字段,这里以 data/comments/626524324.csv 文件为例。该文件对应的视频为
【何同学】我拍了一张600万人的合影...
import pandas as pd
df = pd.read_csv('data/comments/626524324.csv')
df.head()
content | device | like | rcount | ctime | avatar | level | sex | sign | uname | mid | oid | diag | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 谢谢你为了一个个不知所云的网名特意做了这张照片。\n我也会记得曾有人如此地在意过一个我,尽管... | NaN | 15940 | 130 | NaN | http://i1.hdslb.com/bfs/face/9b63957c5d35e4eaa... | 5 | 保密 | 羽猫今天码字了吗? | Vf羽猫 | 45165730 | 626524324 | 原评论 |
1 | [热词系列_泪目]真的好感动啊……明明是陌生人的我们被温柔地连在一起了 | NaN | 509 | 0 | NaN | http://i1.hdslb.com/bfs/face/6848c37c1b0389013... | 5 | 保密 | NaN | 梧越 | 1502390 | 626524324 | 原评论 |
2 | 真的太浪漫了太有心了,不知道怎么夸了,全程张着嘴看完的,何同学真的太值得粉了![打call] | NaN | 283 | 0 | NaN | http://i2.hdslb.com/bfs/face/1ad0b2e00938fe40c... | 5 | 女 | 菜鸟就是我了 | _Real_me | 200720380 | 626524324 | 原评论 |
3 | 我们和小何是双向的爱啊 | NaN | 126 | 0 | NaN | http://i1.hdslb.com/bfs/face/13fe65d8c9350e92d... | 4 | 保密 | NaN | 子服呀 | 411480205 | 626524324 | 原评论 |
4 | 没啥说的,转就是了 | phone | 37913 | 141 | NaN | http://i2.hdslb.com/bfs/face/c1733474892caa459... | 6 | 男 | 商务合作/广告/宣传片/影视摄制私信 | 影视飓风 | 946974 | 626524324 | 原评论 |
2.3 评论词频统计
文件比较多,处理过程较慢
import pandas as pd
import os
#获取所有csv路径
files = os.listdir('data/comments')
files = ['data/comments/'+f for f in files if 'csv' in f]
dfs = []
#打开所有的csv, 合并多个df
for file in files:
df = pd.read_csv(file)
dfs.append(df)
alldf = pd.concat(dfs)
alldf.head()
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/IPython/core/interactiveshell.py:3063: DtypeWarning: Columns (2,3,4,6,10,11) have mixed types.Specify dtype option on import or set low_memory=False.
interactivity=interactivity, compiler=compiler, result=result)
content | device | like | rcount | ctime | avatar | level | sex | sign | uname | mid | oid | diag | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | “麻麻,你看又来啦”哈哈哈哈哈哈 | phone | 1585 | 4 | NaN | http://i0.hdslb.com/bfs/face/02198be3bfa559e74... | 5 | 保密 | xzq 鞋 来打 胶 | 热爱薛洁洁的阿新 | 86366894 | 19780443 | 原评论 |
1 | 2020年来打破[微笑] | NaN | 6 | 0 | NaN | http://i0.hdslb.com/bfs/face/1496caccaea826e53... | 3 | 保密 | 这个b很懒,什么也没留下( ˘•ω•˘ ) | 来自星星的冰心 | 496314607 | 19780443 | 原评论 |
2 | 回复 @来自星星的冰心 :哈哈哈哈哈哈哈 | phone | 2 | 0 | NaN | http://i0.hdslb.com/bfs/face/02198be3bfa559e74... | 5 | 保密 | xzq 鞋 来打 胶 | 热爱薛洁洁的阿新 | 86366894 | 19780443 | 原评论 |
3 | 两年1200赞1回复,是真滴惨 | NaN | 1 | 0 | NaN | http://i1.hdslb.com/bfs/face/c72123fd8ba16689e... | 5 | 男 | NaN | 黑兔不吃草 | 338868054 | 19780443 | 原评论 |
4 | 听口音就怀疑是太原小后生了 姐姐我太喜欢你这种有才华的人了哈哈 | phone | 2573 | 52 | NaN | http://i2.hdslb.com/bfs/face/286d8afc470353007... | 4 | 保密 | NaN | Du锦荣 | 7926058 | 19780443 | 原评论 |
#评论数
len(alldf)
440898
数据采集时遇到网络问题,所以跟之前的评论总数472462对不上.
评论者性别分布
为了省事,这里假设评论者只发一条评论,直接对alldf的sex字段进行性别统计
alldf['sex'].value_counts()
保密 228191
男 128857
女 83848
sex 2
Name: sex, dtype: int64
alldf['sex'].value_counts(normalize=True)
保密 0.517560
男 0.292260
女 0.190176
sex 0.000005
Name: sex, dtype: float64
没想到保密的占了一半,如果排除保密,还是男粉多一些。
评论者设备分布
alldf['device'].value_counts()
phone 88384
pad 20793
android 5003
unknown 1671
device 2
Name: device, dtype: int64
alldf['device'].value_counts(normalize=True)
phone 0.762898
pad 0.179477
android 0.043184
unknown 0.014423
device 0.000017
Name: device, dtype: float64
本文代码和数据集
下载链接:https://pan.baidu.com/s/1rDlhFhEniGv2CsZ9OqO7Iw 密码:1fv7
近期文章
Python网络爬虫与文本数据分析
bsite库 | 采集B站视频信息、评论数据
rpy2库 | 在jupyter中调用R语言代码
tidytext | 耳目一新的R-style文本分析库
reticulate包 | 在Rmarkdown中调用Python代码
plydata库 | 数据操作管道操作符>>
plotnine: Python版的ggplot2作图库
七夕礼物 | 全网最火的钉子绕线图制作教程
读完本文你就了解什么是文本分析
文本分析在经管领域中的应用概述
综述:文本分析在市场营销研究中的应用
plotnine: Python版的ggplot2作图库
小案例: Pandas的apply方法
stylecloud:简洁易用的词云库
用Python绘制近20年地方财政收入变迁史视频
Wow~70G上市公司定期报告数据集
漂亮~pandas可以无缝衔接Bokeh
YelpDaset: 酒店管理类数据集10+G
“分享”和“在看”是更好的支持!