Hi~大家好,我是锋小刀。
不知道大家看视频有没有看弹幕的习惯,弹幕在一定的程度上反映了观众对视频的看法。通过分析弹幕,我们可以快速直观的知道观众对视频的看法。
本文以爬取综艺节目《哈哈哈哈哈》最新一期视频弹幕并绘制词云图为例,介绍爬取过程和绘制词云图。
一、分析网站
首先通过以下步骤找到存放弹幕的真实url:
通过分析url我们发现,url中的timestamp参数是会发生递增变化的,视频播放30秒变动一次,每次增加30秒,而视频一共3634秒,这里我们用{}进行替换。
代码语言:javascript复制https://mfm.video.qq.com/danmu?otype=json&callback=jQuery191039612593184238554_1608529693193&target_id=6296183376&vid=n0035xx89ka&session_key=15076,0,1608530041×tamp=15&_=1608529693224
https://mfm.video.qq.com/danmu?otype=json&callback=jQuery191039612593184238554_1608529693193&target_id=6296183376&vid=n0035xx89ka&session_key=15076,0,1608530041×tamp=45&_=1608529693224
https://mfm.video.qq.com/danmu?otype=json&callback=jQuery191039612593184238554_1608529693193&target_id=6296183376&vid=n0035xx89ka&session_key=15076,0,1608530041×tamp=85&_=1608529693224
另外,url中一些参数是没用的,我们可以适当删除,得到以下url:
代码语言:javascript复制https://mfm.video.qq.com/danmu?otype=json&target_id=6296187536&vid=e003555vftp&session_key=19888,0,1608536585×tamp={}&_=1608536580786
而数据格式为json格式,因此直接用json解析获取数据。
二、代码实现
代码语言:javascript复制import pandas as pd
import time
import requests
import json
df = pd.DataFrame()
headers = {'User-Agent': 'Googlebot'}
for i in range(15, 3645, 30):
url = "https://mfm.video.qq.com/danmu?otype=json&target_id=6296187536&vid=e003555vftp&session_key=19888,0,1608536585×tamp={}&_=1608536580786".format(i)
html = requests.get(url, headers=headers).text
t = json.loads(html) #解析数据
time.sleep(1)
for i in t['comments']: #提取数据
content = i['content']
text = pd.DataFrame({'弹幕': [content]}) #创建标题行
df = pd.concat([df, text]) #将数据存储在DataFrame中
df.to_csv('哈哈哈哈哈.csv', encoding='utf-8') #保存数据
运行后看下数据:
三、绘制词云图
导入库:
代码语言:javascript复制import jieba # 分词
import numpy as np # 矩阵运算
from matplotlib import pyplot as plt # 绘图,数据可视化
from wordcloud import WordCloud # 词云
from PIL import Image # 图片处理
读取文本内容,read按行读取:
代码语言:javascript复制text = open(r'.哈哈哈哈哈.csv', 'r', encoding="utf-8").read()
分词:
代码语言:javascript复制cut_text = jieba.cut(text)
join一下连接成字符串:
代码语言:javascript复制result = ' '.join(cut_text)
导入图片:
代码语言:javascript复制img=Image.open(r'.哈哈哈.jpg')
处理图片:
代码语言:javascript复制img_array = np.array(img)
设置字体、背景颜色:
代码语言:javascript复制wc = WordCloud(mask=img_array, font_path=r'.simhei.ttf', background_color='white')
生成词云图:
代码语言:javascript复制wc.generate(result)
保存词云图:
代码语言:javascript复制wc.to_file(r'.哈哈哈哈哈.jpg')
展示词云图:
代码语言:javascript复制plt.imshow(wc)
关闭坐标轴:
代码语言:javascript复制plt.axis('off')
运行后打开词云图:
代码语言:javascript复制plt.show()
运行后看一下效果,发现词语“哈哈”出现频率是最高的,看来节目是很搞笑的,果然节目名称没有取错,其次是“邓紫棋”、“鹿晗”、“王晨艺”、“张雨剑”等节目嘉宾。
换张图片看下:
绘制词云图的代码是可以重复利用的,只要换下图片、弹幕数据就可以了。