一、“高铁互殴”
最近「高铁互殴」是个热门话题, 身处局外, 信息是不全面的,没法做到客观公正。但看到大哥这个视频, 我自己是怕麻烦,不敢挺身而出的,所以很佩服东北大哥挺身而出这一行为,至于互殴双方对错与否不做评论。
5月2日四川成都,一名女孩独自乘坐高铁从老家到成都东,她座位后的三个座位一共坐了两个大人三个小孩,孩子在玩游戏时多次撞到女孩的椅背。女孩称自己忍了很多次,也回头进行劝说。孩子的妈妈对着女孩嘶吼说:他们是小孩子,你至于吗?孩子爸爸开始辱骂女孩,女孩回嘴时被孩子妈妈扇了一个耳光,女孩气不过回了手。一名东北大哥看不下去了,起身对双方进行劝说。事后女孩称对于东北大哥的热心出手,也是非常感谢。
二、数据采集
今天就用这个代码,采集视频 https://www.bilibili.com/video/BV1ys4y1g7qt/ 的评论和弹幕。
- get_video_comments(bv, max_page=10, speed=1, encoding=‘utf-8’) 获取评论
- get_video_danmaku(bv, encoding=‘utf-8’) 获取弹幕
这两函数在 网络爬虫(付费) | 使用Python采集B站弹幕和评论数据 内可以下载到的。
#每页有20个评论。据此计算页码数
get_video_comments(bv='BV1ys4y1g7qt',
max_page=250,
speed=1,
encoding='utf-8')
get_video_danmaku(bv='BV1ys4y1g7qt', encoding='utf-8')
三、数据分析
爬虫函数运行结束后,
以评论数据为例,
3.1 导入数据
import pandas as pd
df = pd.read_csv('comments_BV1ys4y1g7qt.csv')
df.head()
#记录数
len(df)
2585
3.2 词频统计
词频统计
import re
import jieba
#pyecharts版本2.0.1
#汇总文本
text = ''.join(df['comment'].tolist())
#清洗数据
text = ''.join(re.findall('[\u4e00-\u9fa5]+', text))
#分词
words = jieba.lcut(text)
words = [w for w in words if len(w)>=2]
#词频统计
wordfreqs = []
for word in set(words):
freq = words.count(word)
wordfreqs.append((word, freq))
#词频排序
wordfreqs = sorted(wordfreqs, key=lambda k:k[1], reverse=True)
#显示前20个
wordfreqs[:20]
Run
[('大哥', '766'),
('东北', '519'),
('孩子', '444'),
('这种', '254'),
('一个', '200'),
('小孩', '199'),
('就是', '195'),
('自己', '175'),
('父母', '155'),
('家长', '154'),
('不是', '148'),
('真的', '146'),
('支持', '136'),
('什么', '133'),
('这样', '127'),
('没有', '126'),
('这个', '125'),
('他们', '120'),
('直接', '112'),
('遇到', '102')]
3.3 保存到xlsx中
词频统计保存到xlsx中
df2 = pd.DataFrame(wordfreqs, columns=['word', 'freq'])
#df2.to_csv('高铁互殴-词频统计.csv', index=False)
df2.to_excel('高铁互殴-词频统计.xlsx', index=False)
#显示前5个词
df2.head()
3.2 词云图
使用pyecharts(版本号2.0.1)绘制词云图,
import pyecharts.options as opts
from pyecharts.charts import WordCloud
#绘制词云图
wordfreqs = [(w, str(f)) for w,f in wordfreqs]
wc = WordCloud()
wc.add(series_name="", data_pair=wordfreqs, word_size_range=[20, 100])
wc.set_global_opts(
title_opts=opts.TitleOpts(title="高铁互殴", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
),
tooltip_opts=opts.TooltipOpts(is_show=True))
wc.render("高铁互殴.html") #存储位置