大家好,我是天空之城,今天给大家带来,爬取B站弹幕制作词云图。
以下内容部分来自公众号数据分析与统计学之美,号主是大牛,有需要的加他。
首先打开一个b站视频https://www.bilibili.com/video/BV1PK4y1b7dt?t=1,
来到开发者模式,打开network,搜索pagelist,就会找到第一个api接口,https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp,
打开这个网址,我们就会发现一个cid号码,{“code”:0,“message”:“0”,“ttl”:1,“data”:[{“cid”:201056987,“page”:1,“from”:“vupload”,“part”:“JAY-MOJITO_完整MV(更新版)”,“duration”:189,“vid”:"",“weblink”:"",“dimension”:{“width”:1920,“height”:1080,“rotate”:0}}]},
把这个cid号码跟下面这个api网址oid号码拼接,
就可以得到我们想要的弹幕网址https://api.bilibili.com/x/v1/dm/list.so?oid=XXX
下面就水到渠成了
# 数据的爬取
#%%
import requests
import json
import chardet
import re
from pprint import pprint
# 1.根据bvid请求得到cid
def get_cid():
url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp'
res = requests.get(url).text
json_dict = json.loads(res)
#pprint(json_dict)
return json_dict["data"][0]["cid"]
# 2.根据cid请求弹幕,解析弹幕得到最终的数据
"""
注意:哔哩哔哩的网页现在已经换了,那个list.so接口已经找不到,但是我们现在记住这个接口就行了。
"""
def get_data(cid):
final_url = "https://api.bilibili.com/x/v1/dm/list.so?oid=" + str(cid)
final_res = requests.get(final_url)
final_res.encoding = chardet.detect(final_res.content)['encoding']
final_res = final_res.text
pattern = re.compile('(.*?)')
data = pattern.findall(final_res)
#pprint(final_res)
return data
# 3.保存弹幕列表
def save_to_file(data):
with open("dan_mu.txt", mode="w", encoding="utf-8") as f:
for i in data:
f.write(i)
f.write("\n")
cid = get_cid()
data = get_data(cid)
save_to_file(data)
#%% md
# 词云图的制作
#%%
import pandas as pd
import numpy as np
import re
import jieba
# %%
# 读取评论数据
df = pd.read_csv('danmu2.csv', header=0, encoding='utf-8').astype(str)
# df.head()
# %%
def filter_str(desstr, restr=''):
# 过滤除中文以外的其他字符
res = re.compile("[^\u4e00-\u9fa5^,^,^.^。^【^】^(^)^(^)^“^”^-^!^!^?^?^]")
return res.sub(restr, desstr)
# %%
df['text'] = df['text'].apply(filter_str)
df.head()
# %% md
## jieba分词
# %%
def get_cut_words(content_series):
# 读入停用词表
stop_words = []
with open("stop_words.txt", 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
stop_words.append(line.strip())
# 添加关键词
my_words = ['a', 'b']
for i in my_words:
jieba.add_word(i)
# 自定义停用词
my_stop_words = []
stop_words.extend(my_stop_words)
# 分词
word_num = jieba.lcut(content_series.str.cat(sep='。'), cut_all=False)
# 条件筛选
word_num_selected = [i for i in word_num if i not in stop_words and len(i) >= 2]
return word_num_selected
# %%
text1 = get_cut_words(content_series=df.text)
text1[:5]
import stylecloud
from IPython.display import Image
stylecloud.gen_stylecloud(text=' '.join(text1), collocations=False,
# palette='cartocolors.qualitative.Pastel_5',
font_path=r'C:\Windows\Fonts\msyh.ttc',
#icon_name='fas fa-dragon',
#icon_name='fas fa-dog',
#icon_name='fas fa-cat',
#icon_name='fas fa-dove',
icon_name='fab fa-qq',
# icon_name='fas fa-plane',
icon_name='fas fa-smile',
size=400,
output_name='词云1.png')
还可以更改配色参数,让词云图实现不同的颜色
https://jiffyclub.github.io/palettable/tableau/
palette=‘tableau.BlueRed_6’,