目前,拳头制作的英雄联盟首部动画作品《双城之战》在腾讯视频独家播出。而事实再次证明,拳头是一家被游戏耽误的动画公司,《双城之战》首映非常成功,豆瓣评分9.2,5星评价占67.5%,。外网《双城之战》好评率高达98%,IMDb评分9.4。
今天,我们就来爬取《双城之战》的视频弹幕,看看观众们都说了什么。
通过对腾讯视频弹幕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的内容。
从图中可以看到,弹幕信息都放在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')
这里我们对弹幕关键词进行统计,并放入字典中。
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')
从图中可以看到,出现最多的是EDG、EDG牛(消音bi~)等关键词,看来EDG夺冠的影响还是很大的(这里祝贺EDG夺冠),其次是英雄联盟和动漫中的相关人物名字,金克丝和艾克都出现的次数最多。
今天我们爬取了腾讯视频《双城之战》的弹幕,并对弹幕进行了分析,感兴趣的同学可以对其它属性进行分析。