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

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

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

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

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

一、获取方法

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

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

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

二、网页分析

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

三、弹幕文件下载和解析

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

1from lxml import etree 2import  requests 3import time 4import jieba 5import numpy as np 6from PIL import Image 7from wordcloud import WordCloud as wc 8class Bilibili(): 9    """docstring for Bilibili""" 10    def __init__(self,oid): 11        self.headers={ 12        'Host': 'api.bilibili.com', 13        'Connection': 'keep-alive', 14        'Cache-Control': 'max-age=0', 15        'Upgrade-Insecure-Requests': '1', 16        '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', 17        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 18        'Accept-Encoding': 'gzip, deflate, br', 19        'Accept-Language': 'zh-CN,zh;q=0.9', 20        'Cookie': 'finger=edc6ecda; LIVE_BUVID=AUTO1415378023816310; stardustvideo=1; CURRENT_FNVAL=8; buvid3=0D8F3D74-987D-442D-99CF-42BC9A967709149017infoc; rpdid=olwimklsiidoskmqwipww; fts=1537803390' 21 22        } 23        self.url='https://api.bilibili.com/x/v1/dm/list.so?oid='+str(oid) 24        self.barrage_reault=self.get_page() 25 26    # 获取信息 27    def get_page(self): 28        try: 29            # 延时操作,防止太快爬取 30            time.sleep(0.5) 31            response=requests.get(self.url,headers=self.headers) 32        except Exception as e: 33            print('获取xml内容失败,%s' % e) 34            return False 35        else: 36            if response.status_code == 200: 37                # 下载xml文件 38                with open('bilibili.xml','wb') as f: 39                    f.write(response.content) 40                return True 41            else: 42                return False 43 44    # 解析网页 45    def param_page(self): 46        time.sleep(1) 47        if  self.barrage_reault: 48            # 文件路径,html解析器 49            html=etree.parse('bilibili.xml',etree.HTMLParser()) 50            # xpath解析,获取当前所有的d标签下的所有文本内容 51            results=html.xpath('//d//text()') 52            return results 53

四、弹幕去重

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

1# 弹幕去重 2def remove_double_barrage(self): 3    ''' 4    double_arrage:所有重复弹幕的集合 5    results:去重后的弹幕 6    barrage:每种弹幕内容都存储一遍 7    ''' 8    double_barrage=[] 9    results=[] 10    barrage=set() 11    for result in self.param_page(): 12        if result not in results: 13            results.append(result) 14        else: 15            double_barrage.append(result) 16            barrage.add(result) 17    return double_barrage,results,barrage 18

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

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

1# 弹幕重复次数和词云制作 2def make_wordCould(self): 3    double_barrages,results,barrages=self.remove_double_barrage() 4    # 重词计数 5    with open('barrages.txt','w') as f: 6        for barrage in barrages: 7            amount=double_barrages.count(barrage) 8            f.write(barrage+':'+str(amount+1)+'\n') 9             10    # 设置停用词 11    stop_words=['【','】',',','.','?','!','。'] 12    words=[] 13    if results: 14        for result in results: 15            for stop in stop_words: 16                result=''.join(result.split(stop)) 17            words.append(result) 18        # 列表拼接成字符串 19        words=''.join(words) 20        words=jieba.cut(words) 21        words=''.join(words) 22        bingbing=np.array(Image.open('冰冰.jpg')) 23        w=wc(font_path='‪C:/Windows/Fonts/SIMYOU.TTF', 24             background_color='white', 25             width=900, 26             height=600, 27             max_font_size=15, 28             min_font_size =1, 29             max_words=3000, 30             mask=bingbing) 31        w.generate(words) 32        w.to_file('bingbing.jpg') 33     34b=Bilibili(283851334)#视频的cid 35b.make_wordCould()#绘制词云 36

统计结果:

词云图效果:

六、总结

我对于B站的网页结构还有很多不熟悉的地方,或许还有其他更好的分析方法和技巧,最后的人形词云要设置合适的参数才能让人物的形象惟妙惟肖。

该教程我参考了一些网友的方法,对提供技术分享的博主表示感谢[1]。希望我们都能保持一颗学习的心,一直不断地探索吧。

参考资料

[1]

参考文章: https://blog.csdn.net/weixin\_36605200/article/details/82848020

本文转转自微信公众号凹凸数据原创https://mp.weixin.qq.com/s/KlyzFRmTf8no9DpzqJZ6Pg,可扫描二维码进行关注: 如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

被“词云”包围的冰冰会更好看吗?安排

(https://imghelloworld.osscnbeijing.aliyuncs.com/b299933deefc692934e8cc6141ab3894.png)大家好,我是小五🐶昨天「凹凸数据」发了一篇张同学投稿的文章《用Python爬取王冰冰vlog弹幕并制作词云(https://mp.weixin.qq.com/

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''