用Python爬取王冰冰vlog弹幕并制作词云 用Python爬取王冰冰vlog弹幕并制作词云

最近的“瓜”,多到我们措手不及,可谓是“热点不断”。作为程序员,我们还可能随时为此而加班。

各种评论视频“爆炸”网络,打开首页全是热点话题的内容,某知名UP主发布视频都要错下峰。

我就在思考:这么火爆的话题和内容,有没有一种通用的分析方法?答案是:抓取弹幕或者评论。

下面就让我们以冰冰vlog的视频弹幕为例,来进行分析。

一、获取方法

1.网页解析:网页结构可能随时会发生变化。

2.python第三方api:可能会有维护跟不上的问题。

经过简单对比,我选择第一种方法。

二、网页分析

爬取弹幕的关键是获取视频的cid,有些地方也叫oid。通过浏览器的开发者模式我们不难找到该视频的cid。我们通过https://comment.bilibili.com/+视频的cid+.xml就可以爬取该视频所有弹幕了。

用Python爬取王冰冰vlog弹幕并制作词云
用Python爬取王冰冰vlog弹幕并制作词云

用Python爬取王冰冰vlog弹幕并制作词云
用Python爬取王冰冰vlog弹幕并制作词云

 三、弹幕文件下载和解析

由于弹幕内容集中在xml文件里,我们需要对文件进行下载,使用xpath解析文件。

from lxml import etree
import  requests
import time
import jieba
import numpy as np
from PIL import Image
from wordcloud import WordCloud as wc
class Bilibili():
    """docstring for Bilibili"""
    def __init__(self,oid):
        self.headers={
        'Host': 'api.bilibili.com',
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cookie': 'finger=edc6ecda; LIVE_BUVID=AUTO1415378023816310; stardustvideo=1; CURRENT_FNVAL=8; buvid3=0D8F3D74-987D-442D-99CF-42BC9A967709149017infoc; rpdid=olwimklsiidoskmqwipww; fts=1537803390'

        }
        self.url='https://api.bilibili.com/x/v1/dm/list.so?oid='+str(oid)
        self.barrage_reault=self.get_page()

    # 获取信息
    def get_page(self):
        try:
            # 延时操作,防止太快爬取
            time.sleep(0.5)
            response=requests.get(self.url,headers=self.headers)
        except Exception as e:
            print('获取xml内容失败,%s' % e)
            return False
        else:
            if response.status_code == 200:
                # 下载xml文件
                with open('bilibili.xml','wb') as f:
                    f.write(response.content)
                return True
            else:
                return False

    # 解析网页
    def param_page(self):
        time.sleep(1)
        if  self.barrage_reault:
            # 文件路径,html解析器
            html=etree.parse('bilibili.xml',etree.HTMLParser())
            # xpath解析,获取当前所有的d标签下的所有文本内容
            results=html.xpath('//d//text()')
            return results

四、弹幕去重

重复的弹幕进行归类,未出现过的弹幕创建新的分类。为词频统计和词云做好准备。

    # 弹幕去重
    def remove_double_barrage(self):
        '''
        double_arrage:所有重复弹幕的集合
        results:去重后的弹幕
        barrage:每种弹幕内容都存储一遍
        '''
        double_barrage=[]
        results=[]
        barrage=set()
        for result in self.param_page():
            if result not in results:
                results.append(result)
            else:
                double_barrage.append(result)
                barrage.add(result)
        return double_barrage,results,barrage

五、弹幕重复次数统计和制作词云

我们在网上照一张“王冰冰”的照片,进行简单的处理,作为词云的轮廓图。

用Python爬取王冰冰vlog弹幕并制作词云
用Python爬取王冰冰vlog弹幕并制作词云

用Python爬取王冰冰vlog弹幕并制作词云
用Python爬取王冰冰vlog弹幕并制作词云

    # 弹幕重复次数和词云制作
    def make_wordCould(self):
        double_barrages,results,barrages=self.remove_double_barrage()
        # 重词计数
        with open('barrages.txt','w') as f:
            for barrage in barrages:
                amount=double_barrages.count(barrage)
                f.write(barrage+':'+str(amount+1)+'
')
                
        # 设置停用词
        stop_words=['','',',','.','?','!','']
        words=[]
        if results:
            for result in results:
                for stop in stop_words:
                    result=''.join(result.split(stop))
                words.append(result)
            # 列表拼接成字符串
            words=''.join(words)
            words=jieba.cut(words)
            words=''.join(words)
            bingbing=np.array(Image.open('冰冰.jpg'))
            w=wc(font_path='‪C:/Windows/Fonts/SIMYOU.TTF',
                 background_color='white',
                 width=900,
                 height=600,
                 max_font_size=15,
                 min_font_size =1,
                 max_words=3000,
                 mask=bingbing)
            w.generate(words)
            w.to_file('bingbing.jpg')
        
b=Bilibili(283851334)#视频的cid
b.make_wordCould()#绘制词云

统计结果:

用Python爬取王冰冰vlog弹幕并制作词云
用Python爬取王冰冰vlog弹幕并制作词云

 词云图效果:

 用Python爬取王冰冰vlog弹幕并制作词云
用Python爬取王冰冰vlog弹幕并制作词云

 六、总结

我对于B站的网页结构还有很多不熟悉的地方,或许还有其他更好的分析方法和技巧,最后的人形词云要设置合适的参数才能让人物的形象惟妙惟肖。该教程我参考了一些网友的方法,对提供技术分享的博主表示感谢。希望我们都能保持一颗学习的心,一直不断地探索吧。

参考博文:https://blog.csdn.net/weixin_36605200/article/details/82848020