一、“高铁互殴”

最近「高铁互殴」是个热门话题, 身处局外, 信息是不全面的,没法做到客观公正。但看到大哥这个视频, 我自己是怕麻烦,不敢挺身而出的,所以很佩服东北大哥挺身而出这一行为,至于互殴双方对错与否不做评论。

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")  #存储位置



广而告之