爬取哔哩哔哩上的弹幕制作词云

捣鼓一下爬虫,刚好这两天《姜子牙》的预告片挺火,就看看他的弹幕吧。

需求很简单:1.爬取哔哩哔哩视频网站的弹幕 2.制作词云图

在网上了解到哔哩哔哩的弹幕是放在cid对应的xml文件里面,首先找到这个cid,直接把他放在url里面请求获取到弹幕内容。

import requests

from bs4 import BeautifulSoup

import bs4

import re

#获取弹幕数据:在视频播放网页打开deverloper console,打开

#Network栏,找到https://api.bilibili.com/x/player/videoshot?aid=79004812&cid=135199764&jsonp=jsonp

#中的cid,请求cid对应的xml文件就是弹幕内容

r = requests.get('http://comment.bilibili.com/135199764.xml')

print(r.status_code)

#转换编码

r.encoding = 'utf-8'

r.text

返回内容:

然后对返回的内容进行提取,常用的解析方法有:这BeautifulSoup库,正则表达式,XPath。这里用BeautifulSoup库来解析。

#xml文件解析,

bs = BeautifulSoup(r.text)

print(bs.prettify()) #prettify()格式化换行标签的函数

datalist = '' #将弹幕拼成一个字符串

clist = bs.d.parent.contents

for child in clist:

    cstr = child.string

    if child.name == 'd':

        datalist += cstr

然后进一步用正则表达式去除字符串中的特殊字符,标点符号等。

#去掉标点符号和特殊字符

pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|!|,|。|?|·|……|"') # 定义正则表达式匹配模式

string_data = re.sub(pattern, '', datalist) # 将符合模式的字符去除

string_data

最后结果:

词频统计和画词云图:先用jieba库进行分词,然后使用词频统计库collections来统计词频,输出前10看看效果,通常在统计词频的过程中,我们会对一些语气词等做一些优化,排除一些语气词和不恰当的词。这里输出词云时可以自定义背景图片,词云里有中文需要将字体设置为支持中文的字体,不然会显示乱码。

import jieba # 结巴分词

import numpy as np

import wordcloud # 词云展示库

import collections # 词频统计库

from PIL import Image # 图像处理库

import matplotlib.pyplot as plt # 图像展示库

#分词

cutlist = jieba.cut(string_data,cut_all=False)#精确分词

objlist = []

removelist = [u'的', u',',u'和', u'是', u'随着', u'对于', u'对',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',

                u'通常',u'如果',u'我们',u'需要',u'我', u'啊',u'这', u'吧', u'你',u'看', u'啊啊啊', u'吗', u'可以'] # 自定义去除词库,去除口语等

for word in cutlist:

    if word not in removelist:

        objlist.append(word)

#统计词频

word_count = collections.Counter(objlist)

word_count_top10 = word_count.most_common(10)

print(word_count_top10)#输出检查

#画词云图

mask = np.array(Image.open('images/wordcloud.jpg')) # 定义词频背景

wc = wordcloud.WordCloud(

    mask=mask, # 设置背景图

    max_words=200, # 最多显示词数

    font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式

    max_font_size=100 # 字体最大值

)

wc.generate_from_frequencies(word_count) # 从字典生成词云

image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案

wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案

plt.imshow(wc) # 显示词云

plt.axis('off') # 关闭坐标轴

plt.show() # 显示图像

输出词云图

你可能感兴趣的:(爬取哔哩哔哩上的弹幕制作词云)