英雄联盟《双城之战》视频弹幕爬取并分析输出词云

目前,拳头制作的英雄联盟首部动画作品《双城之战》在腾讯视频独家播出。而事实再次证明,拳头是一家被游戏耽误的动画公司,《双城之战》首映非常成功,豆瓣评分9.2,5星评价占67.5%,。外网《双城之战》好评率高达98%,IMDb评分9.4。
今天,我们就来爬取《双城之战》的视频弹幕,看看观众们都说了什么。

弹幕爬取

url分析

我们先打开《双城之战》第一集,找到弹幕相关的url。
英雄联盟《双城之战》视频弹幕爬取并分析输出词云_第1张图片

通过对腾讯视频弹幕url的分析,首先通过暴力法删减各参数。
原url为https://mfm.video.qq.com/danmu?otype=json&callback=jQuery191011407213043930708_1636363404138&target_id=7514340188%26vid%3Dp0041eyvryu&session_key=0%2C22%2C1636363405×tamp=1185&_=1636363404180 删减为https://mfm.video.qq.com/danmu?target_id=7514340188%26vid%3Dp0041eyvryu×tamp=1185。此时我们发现选取不同集数时target_id会发生变化,因此判断target_id与集数有关。而通过观察timestamp发现,timestamp应该是弹幕的时间戳,是首项为15,公差为30的等差数列,即隔30秒将加载新弹幕数据。因此此项将影响我们对弹幕的爬取。我们进一步将url精简为https://mfm.video.qq.com/danmu?target_id=7514340188%26vid%3Dp0041eyvryu

《双城之战(普通话版)》第一集弹幕爬取。

url = "https://mfm.video.qq.com/danmu?target_id=7514340188%26vid%3Dp0041eyvryu"
# 伪装请求头
headers ={
     "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"}

n = 1 #这里统计爬取次数
for timestamp in range(15,30,30): #第一集40分08秒,所以我们直接从15爬到2400,间隔30
    params = {
     'timestamp':timestamp} #这里更新timetamp
    
    print(f"正在爬取第{
       n}次弹幕")
    n += 1
    
    response = requests.get(url, headers=headers,params=params) #爬取数据
    res_json = response.json() 
   
    time.sleep(1) # 防止被封IP
        
    for i in res_json['comments']:
        # 保存为CSV文件
        content = i['content']  # 弹幕内容
        name = i['opername']  # 用户名
        upcount = i['upcount']  # 点赞数
        user_degree = i['uservip_degree']  # 会员等级
        timepoint = i['timepoint']  # 发布时间
        comment_id = i['commentid']  # 弹幕ID
        cache = pd.DataFrame({
     '用户名': [name], '弹幕内容': [content], '会员等级': [user_degree],'评论时间点': [timepoint], '评论点赞': [upcount], '评论id': [comment_id]})
        df = pd.concat([df, cache])

这里我们可以看一下res_json的内容。
英雄联盟《双城之战》视频弹幕爬取并分析输出词云_第2张图片
从图中可以看到,弹幕信息都放在comments中,里面存放着每条弹幕的信息,包括id,内容,时间点,用户昵称等。

我们用同样的方法爬取三集的弹幕信息。

数据处理

import numpy as np
import pandas as pd
import jieba
from PIL import Image
from wordcloud import WordCloud

合并数据并过滤信息

这里我们先将三集弹幕汇总,并删除包含nan值的行。

df1 = pd.read_csv("双城之战01.csv",header = 0,encoding="utf-8",dtype=str)
df2 = pd.read_csv("双城之战02.csv",header = 0,encoding="utf-8",dtype=str)
df3 = pd.read_csv("双城之战03.csv",header = 0,encoding="utf-8",dtype=str)

# 合并三集弹幕
df = pd.concat([df1,df2,df3])

#过滤不需要的字段
df = df[["用户名","弹幕内容","评论点赞","集数"]]

#删除包含nan值的行
df.dropna(axis=0,how='any')

jieba弹幕分词

这里我们对弹幕关键词进行统计,并放入字典中。

time_count = {
     } #定义一个空字典,方便统计弹幕频率

# 加载停用词表
stop_words = [line.strip() for line in open(r"停用词表.txt", 'r', encoding='utf-8').readlines()]
stop_words += [' ', '\xa0'] #观察数据,添加两个停用词

# 通过观察弹幕数据,添加几个比较重要的关键词
my_words = ['牛逼', '英雄联盟','EDG牛逼','我们是冠军']
for i in my_words:
    jieba.add_word(i)

#jieba分词
for line in df['弹幕内容']:
    print(line)
    content = jieba.lcut(line)
    for word in content:
        if word not in stop_words:
            time_count[word] = time_count.get(word,0) + 1

排序筛选

我们筛选频率前100的关键词。

# 对弹幕关键词出现频率进行排序
content = sorted(time_count.items(), key=lambda x:x[1], reverse=True)

# 选取出现频率最高的100个关键词
seg_list = ' '.join([d_order[i][0] for i in range(1,100)])

词云图制作

# 这里我们导入背景图
bg = np.array(Image.open(r"jinx.jpeg"))

wc = WordCloud(
    width=1400, height=2200, #设置词云画布大小
    font_path='C:/Windows/Fonts/simfang.ttf',  # 设置字体,这里我们导入本机的字体
    mask=bg,  # 设置背景图片,即我们刚刚导入的图片
    background_color='white',  # 设置背景颜色
    max_font_size=150,  # 设置字体最大值
    max_words=200,  # 设置最大显示字数
    ).generate(content)

wc.to_file('wordcloud.jpg')

下面是输出结果。
英雄联盟《双城之战》视频弹幕爬取并分析输出词云_第3张图片

从图中可以看到,出现最多的是EDG、EDG牛(消音bi~)等关键词,看来EDG夺冠的影响还是很大的(这里祝贺EDG夺冠),其次是英雄联盟和动漫中的相关人物名字,金克丝和艾克都出现的次数最多。

总结

今天我们爬取了腾讯视频《双城之战》的弹幕,并对弹幕进行了分析,感兴趣的同学可以对其它属性进行分析。

你可能感兴趣的:(笔记,python,中文分词)