python实现爬取指定bilibili视频的弹幕并制作词云

    先看下最终实现的效果

 

 具体实现思路是

    1.爬取带有弹幕信息的网页

    2.处理爬取得到的内容并提取所需要的弹幕信息,然后写入文本中

    3.通过词云库将文本处理成想要的图片

所需要用到的库

import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
import jieba
from wordcloud import WordCloud
from scipy.misc import imread
import matplotlib.pyplot as plt

首先爬取想要的信息

ps(哔哩哔哩的弹幕全部保存在  http://comment.bilibili.com/122512779.xml  中,红色字体为该视频的cid,可以在当前视频页通过:查看网页源代码—ctrl+f查找cid-出现的第一个9位cid,来获取)

url = 'http://comment.bilibili.com/.xml' #对方的url
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
res = requests.get(url=url, headers=header) #向对方网页发送请求
res.encoding = res.apparent_encoding #将编码设置为对方网页的编码,确保不会出现乱码
data = res.text #获取文本
soup = BeautifulSoup(data, 'lxml') #进行过滤操作,需要用到lxml包,无需导入。pip install lxml
d_list = soup.find_all('d')  #获取所有的d标签中的内容

然后提取其中的弹幕,将其放入文本中,最后通过jieba库处理成词语

dlst = []
for d in d_list:  # 循环拿出所有的d标签
    danmu = {}
    danmu['弹幕'] = d.text  # 获取文本信息
    # danmu['时间'] = datetime.datetime.now()
    # danmu['路径'] = url
    dlst.append(danmu)
df = pd.DataFrame(dlst)  # 转换成二维数组,类似于execl表格

f = open('sign.txt', 'w', encoding='utf-8')  # 打开文件
for i in df['弹幕'].values:  # 循环所有的文本信息
    pat = re.compile(r'[一-龥]+')  # 定义过滤数据的规则,所有的汉字
    filter_data = re.findall(pattern=pat, string=i)  # 执行过滤操作
    f.write("".join(filter_data))  # 写入文本
f.close()


f = open('sign.txt', 'r', encoding='utf8')
data = f.read()
result = " ".join(jieba.lcut(data))
f.close()

最后通过wordcloud库提供的方法将其转化为图片

color_mask = imread('th.png')

wc = WordCloud(
    font_path=r'C:\Windows\Fonts\STKAITI.TTF',
    width=1000,
    height=800,
    mask=color_mask,
    background_color='black'
)

wc.generate(result) #读取文本数据

wc.to_file('bili.jpg') #输出图片

plt.imshow(wc)
plt.show()

 

posted @ 2019-10-31 15:38  花红正合嗅  阅读(771)  评论(0编辑  收藏  举报