bilibili视频弹幕爬取+词云

仅供学习交流研究使用

1. 爬取思路

爬取思路大致相通

  • 获取视频的弹幕api链接
  • 向服务器发起请求
  • 获取服务器返回的响应response
  • 解析html网页,得到想要的信息
  • 保存我们爬取的信息

2. 准备工作

首先,解析哔哩哔哩视频网页:

以为下面链接例

https://www.bilibili.com/video/BV1BS4y1m7c8?spm_id_from=444.41.0.0

解析后的链接:

https://www.ibilibili.com/video/BV1BS4y1m7c8

得到弹幕地址:

https://api.bilibili.com/x/v1/dm/list.so?oid=566429962

3. 解析网页

根据上图很容易得到正则表达式

原内容

<d p="269.39300,1,25,16777215,1649151255,0,129521ba,1023913961688771584,11">独角猫!</d>

re表达式

<d p=".*?">(.*?)</d>

然后直接匹配所有弹幕,得到弹幕列表

info_list = re.findall('<d p=".*?">(.*?)</d>', html)    # 直接使用re匹配弹幕
['独角猫!', '《水浒传》哈哈哈', '哦吼吼!!', '啊啊啊啊啊我好喜欢', '!!这个我在fnf里见过', '海绵宝宝的镜子!!!', '小紫晶~~', '海绵宝宝不是尼克卡通的角色吗', '卧槽up基岩后台,这都能放出来', '右上是甘宝妙世界!!', '探险时光!', '宇宙小子的紫晶!都是很有名的动画耶', '甘宝!!!', '好眼熟啊doge', '左边是宇宙小子的紫晶,右上是阿甘妙世界的甘宝', '卡通频道yyds', '好家伙飞天小女警可太爱了', '哈哈哈期待欸', '泡——泡——', '《今天》', '探险活宝yyds', '你~~~', '紫晶石,最左,出《史蒂文的宇宙》', '海绵宝宝   危', '好家伙,连瑞克的官方都开始整错误化了', 'DC狂喜!~', '对对!就是这个!我之前在QQ空间看到了 超级喜欢', '三天两觉!', '芬恩旁边是德克斯特的女主', '技技法的使用', '不愧是搓澡系列卡通', '探险活宝yyds', '右边紫色小人是《史蒂文宇宙》的紫晶', '有su里的狮子', '左边的是宇宙小子的紫晶', '(Brony狂喜)', '史蒂芬宇宙中的狮子!', '左上角是史蒂芬宇宙中的紫晶!', '爷孙大概率会双方都灭哈哈哈哈哈', '好家伙欢乐树啊', '欢乐树的朋友', '我学这个干嘛啊!!', '海绵宝宝的镜子!', '没准后面漫威挖走的编剧都是瑞莫制作组的卧底。【doge】', '双厨狂……喜欢小女警的和喜欢姥爷的都沉默了', '泡泡~', '左边的好像是史蒂芬宇宙里的紫晶', '哦~~~~~~', '我怎么看到了世界名画尖叫的中那个尖叫的人了?', '成龙历险记?!', '我以为我卡了', '迪士尼挖角华纳了属于是,漫威编剧使用dc故事板了属于是', '看探险活宝知结局', '小马宝莉', 'su!', '刚看完错误化的我', '芬宝,杰克', '怪诞yyds!', '探险时光!!!', '探险时光太棒了!', '大概率会是爷孙在两个不同阵营', '大战姥爷怎么也得dc第一反派团队(ttg)来啊)', '甚至是同一个制作组的部分成员', '《史蒂芬宇宙》《德克斯特的实验室》《阿甘妙世界》', '都是一个画风', '我为怪诞小镇呐喊!', '酷蒂!!!!', 'fnf(doge', '但是漫威的电影是越来越拉了hhh', '好像咱们水浒传啊!', '主角光环!', '哇一岁的熬夜人呢', 'CN!CN有很多好动画,属于华纳', 'as:我预判了你们预判的预判doge', 'AT赛高!!!!', '我怎么记得我老早之前就看过这个片段', '然后大电影一削再削', '欢乐树是吧', '旁边那个蓝色的猫是甘宝', '我看到阿达了!!!', '达文!!!→', '华纳哈哈哈哈哈哈哈哈哈哈哈', '恐惧之鸭', '但是水浒传是最先开创从人物小传到汇总叙事的网状结构的', '右下角是一个什么“...的实验室”', '何止水浒传封神榜也是,隋唐演义说岳全传最后都是一个套路', '迪士尼我也挺喜欢的', 'x超人设定六个念头灭多元宇宙', 'x超人:?', '我觉得瑞克和莫蒂只有莫爸或莫妈逃离', '兔兔儿', '什么时候开播呀?', '记仇的官方', '武士杰克!!', '《眼睛里什么都没有莫蒂》', '所以一天=10分钟', '整活频道', '喜欢这个', '哈哈哈,为了对应上东家把图片翻转了一下,导致字母反了', '安迪:后退!我要开始装b了!', '迪士尼乐园vs环球影城', '狮子!', '爱马士狂喜', '《子供向》', '[ohhhhh]', '阿宝——', '右上角是甘宝吧', '来咯~', '还有甘宝!《甘宝妙世界》!!', '宇宙小子', '《我会一直守护你的》', '错误化模组是吧', '注:fnf是二创,错误化fnf不是原版,反而是瑞莫东家的\u200b', '右上角蓝色的猫是阿甘妙世界', '肝帝忍不住叹气', '。。。其实DC电影除了最近的新蝙其他都不怎么行,主要是漫粉撑起来的热度', '合着编辑是不是看了水浒传的启发', '月光骑士', 'soon~', '成龙?', '《   水   浒   传   》', '会不会是姥爷搞出来的', '我都喜欢', '兔――――兔――――!!', '真.兔bug', 'x超人:?', '但是真的做出来也挺有意思啊', '《水浒传》', '错误化宇宙好评', '还有BF[doge]', "官方使用技能:''封锁'' 成功封锁了瑞克能力和装备 毕竟官方嘛 不能让某个角色能力过于突出 不然那样还怎么拍", '记仇.jpg', 'CN卡通还播出过阿甘妙世界史蒂芬宇宙', '克苏鲁挂件好漂亮', '还以为要讲欢乐树与他的朋友们', '右上角那个不会是《阿甘妙世界》吧', '住手!你们不要再打了,漫威和瑞莫都是我的翅膀啊!', '《子 集》', '章鱼哥家的镜子!', 'Amethyst!', '达文小天使', '甘宝', 'jake也是无敌设定', '右上角是甘宝还是甘妈', 'DokiDoki!', 'DC狂喜+1', '我还是喜欢兔八哥', '愚人节没有川辣酱w~', '其实那兔兔叫“蹦蹦”', 'CK级现实重构', '这是海绵宝宝家的镜子啦', 'unikitty!', '右上甘宝', '阿——宝——', 'DC的一生之敌', '泡泡花花', '兔八哥都被感染了???那没得玩了啊,它在阿布奎奇左转可以到任何地方', '阿甘妙世界里的甘宝', '兔八哥也没感染了', '有个达尔文!', '毛毛,武士阿杰,独角喵,', '迪斯尼 不好在于不能暴力血腥', '/&gt;', '回去叫我的孩子们看(', '飞添小奴靖!', '还有少年骇客', '错误化是吧', '错误化比如紫月', '这他妈不是周五夜放课错误化紫月里的人吗', '没有宇宙小子史蒂文,这点我不是很认可', '姥爷加到里面不就是无敌的存在吗??', '这不是错误化吗(doge', '施耐庵直呼内行', '说句难听的。我觉得这是个消费角色的烂活(', '你都不看吗', '飞天小女警', '迪士尼搞得漫威越来越拉?', '漫威的作品越来越拉了', '预告骗', '要想开启漫威多元宇宙就得需要一个非常了解多元宇宙的人。', '这整活多是一件美事啊', '任天堂大乱斗', '那是蹦蹦!蹦蹦!', '上面的黄字,他们本身就是一家', '矿卡兄弟好惨…', '@任天堂全明星大乱斗', '那个橙色的金鱼应该是阿达', '爷孙应该都在正常的那一方', '那BF肯定是主力输出', 'Bf:这么熟', '耶这不错误化呢', '树朋友警告', 'fnf把这部动画变成了模组', '成人', '全明星大乱斗', '“儿童动画”', '不是同人!', '国内一样的', '兔八哥说是不是没把我放在眼里杜皮狗说死', 'ben10在哪', '漫威比DC吊', '漫威的漫画丧尸宇宙', 'もプもプ即视感', '不会是瑞克整的吧', '阿甘妙世界 甘宝', '人家废了这么大劲其实就是为了耍你一次()', '杰克和芬恩', '大……战,姥爷还是精力充沛啊', '哈哈哈哈哈哈哈哈哈哈', '咱们裸熊的制片商', '左边那个是紫晶石吗', '666', '这是安迪?', '漫威在尚气和蜘蛛侠3之后就不行了', '难道不是华纳大战DC 迪士尼看戏吗', '密码难道是mylittlepony?', '再次吐槽', '多元宇宙', 'FNF', '挖走就写出了蜘蛛侠3这种烂中烂', '有没有可能是平行世界电视台节目', '为什么夜间频道有飞天小女警', '这个马设针不戳', 'missing No', '华纳可是有JOJO', '这不就是水浒传吗', '但漫威真的有种流水线电影的感觉', '漫威做爆米花的就不要瞎搞了吧…', '超级碗', '酷蒂阿飘大鼻!!!胆小狗!巧达!那个流氓金发男,哈哈哈哈', '怪不得那么多黄词', 'DC狗都不看', '老夫子不就是这样?', 'brony狂喜', '破败军团。。。', '这不是联盟破败咒的设定吗', '黑雾?', '可能瑞克都不觉得有啥事儿', '还有机器鸡', '好草率……', '帮22找面膜', '三重同框?', '前面的,bun-bun就是bunny的昵称', 'Lion', '你漫威挖墙脚就编出来个英雄无归这种脑锈剧情?', '《儿童动画》', '芬恩杰克', '这俩不是同一个体系啊?', '右上是阿甘妙世界', '阿甘妙世界!', '水浒传?', '错误化???', '有没有ben10', '错误化?', '阿甘妙世界和史蒂文宇宙!', '、', '成人游泳', '学罗素啊,直接把人码两排,对冲,分镜都省了', '飞天小女警我的童年呜呜呜呜呜', '小马袜子上有个比姥姥', '这是匹母马,彩虹小马里这是母马形象', '永远不要和搞笑动漫人物谈战力( ゚∀。)', '我记得有一个这种的游戏', '这事,是不是过去不了?、、', '全明星大乱斗', '这个不是这个不是周午夜放克的某个模组吗?', '有饼吧像水浒', '水浒传什么时候成复制篇了', '出一个电影吧求你了', '《夜间成人》', '兔兔人家叫蹦蹦。', '←错误化本来就是他们整的', '阿甘', '小马万岁', '这是错误化', '雄霸,帝释天也会吗', '成龙历险记吗这是', '类似于破败大事件', '错误化?', 'fxxk 华纳', 'gumball', '批量生产垃圾', '皮套大战', '出电影吗?', '我记得还有少年骇客', '比博燃', '德克斯特的实验室才是YYDS', '夏日大作战', 'as:啊原来能这么写。。。拿来吧你doge', '这是在影射新冠现状吧。。', '飞天小女警:可爱是吧?脑浆都你给打出来', '还有甘宝妙世界!', '看啊!那是[数据删除]!', 'hso', '小马安迪', '好耶', 'LION', 'AT!!', 'dc粉已经开始骂WB了', 'emmm,芬恩和杰克也遇到过这种事,看来他们两个来自没逃出寒冰王的代码的那个平行时空', '我怎么一点儿都不期待呢?', '童年回忆', '????', '????', '华纳总能想到杀死自己的办法', '老皮~', '可惜漫威最近作品不咋地', '两个人', '救世主该出现了', '哑巴打吧度~', '邪邪邪...典?', '嗯。。。少年骇客?', '问题是这么多角色戏份怎么安排,', 'DC要独立了', '佩奇吧', '水浒传', '阿甘妙世界,少年泰坦', 'robot chicken:有本事再说一次?', '毛毛', '独角兽小姐!', 'wow画得好精致啊', '看我iPho', 'FNF', '胆小狗', '飞天小女警?!', '太空大灌篮就有联动', '野兽巴蒂斯塔', '漫威剧情无聊爆炸', '漫威好无聊', 'Ben10', '无双大蛇3', '说漫威拉,也想想人家一年顶其制片厂3年的量,真要改那反应还不快', '迪士尼确实毒瘤', '啊这。。。', '这是错误化的开始', '???', '德克斯特', '马迷狂喜', '还有右边阿甘妙世界', '我要打十亿个', 'DC永远之敌', '甘宝→', '阿甘,紫晶', '来了来了', '你知道谁不会来吗?', '好耶【', '漫威现在拉了', 'happy tree friends', '真做出来就好了', '这个我也看过了 ', '看来诈骗片说的是对的', '这三全都错误化了', '错误化穿越各种动漫之间,所以几乎所有的漫画都逃不过', '裸熊也是', '错误化源头', '感人哈哈哈', '世界线收束', '牛逼', '把我癞皮狗大哥面子放哪!?', '要是杜皮黑化的话', '1000+', '理论上瑞克是不是能穿越到dc宇宙了', '天下间的闲人真的这么多太佩服了哈哈哈', '漫威,狗都不看', '来了', 'bf', '错误化', '说实话非常想能出一个电影(', '半天', '确实与水浒传的环节差不多', '粉红狮1', '联动!', '原来fnf里出现的错误化出自这里', '搞笑角色的战力!', 'ben10', '想看少年泰坦出击大战瑞克莫蒂', '阿甘妙世界', '抄袭水浒传', '这不是无敌破坏王的剧情', '30分钟内就不回来就没了', '水浒传的笑死我了', '水浒传笑死我了', '确实水浒传领先了一千年', '亂碼1/2', '在QQ空间看过这个预告片', '阿甘哎', '探险活宝  芜湖', '错误化', '吃豆人乱码(无端联想)', '德克斯特的实验室', '钢铁蜘蛛侠3:无家可归', '我记得BEN10也是这个公司的', '还有阿甘', '这个乱码给我一种叛逆的物语既视感', '貌似没得打。。', '复联4就是垃圾', '寄生虫+丧尸病毒?!', '三连支持', '老皮', 'FNF的错误化', '原来不是同人制做吗,怪不得质量那么高', '不可能绝对不可能', '什么全明星大乱斗', '飞头看着像,《杰森一家》里的男主 乔治杰森(摩登原始人的未来版)', '任天堂明星大乱斗?', '那网飞要不要全给他', 'amethyst', '飞天小女警童年啊', '感人→', '万一bill来了 咋办??', '我第一眼竟然没看出来有什么区别', '想想就刺激', '哈哈哈哈', '[ohhhhhhhh]', '德克斯特的实验室', '我', '阿甘妙世界!!!', '史蒂芬宇宙!!!!!', '帝烈魔', '那大概率adult swim会被粉丝喷死的,虽说原版的飞天小女警本来就有点成人幽默', '黑码会不会是打破平行世界后的其中之一的结果呢', '卡通频道的东家就是华纳', 'mlp!', '以前老喜欢看了', '來嘞', '宇宙小子里的粉红狮', '这个太丑了很明显基础不过关,马的基础,人的基础,它们混合起来,各个器官肌肉的组合,这个画师我觉得不应该放上来,', 'finn——', '漫威现在真的不行了', '哈哈哈哈哈', '哈哈哈哈哈对对对', 'Steven  Universe ', '毕竟关公战秦琼谁不爱呢', '老记仇了', '老大呢?快点儿啊', '基本上以前看的欧美动画最常见的logo要么是迪士尼要么就是cn这个了', '感人', '我喜欢ads搓澡漫画', '这事儿过不去了是吧', '迪士尼只会搞流水线,不知道挖这么些创意型编剧去干啥', '风暴要火!!!!', '之前不是有个同好做了片头吗,安迪怎么不继续用了?', '11点方向猪小弟', '看开头错误化,已经这么火了?瑞克和莫蒂都来整活', '十万个冷笑话', '这倒不一定啊少年泰坦告诉我们永远别跟卡通搞笑角色讲战斗', '这眼罩是邪恶莫蒂的?', '世界线收束', '40分钟', '!!!', '这不是错误化吗?', '爱酷一族', '飞天小女警和阿甘妙世界等等属于cn[卡通频道],as只是cn下辖面向成人的深夜档', '腾讯系vs阿里系?!', '右上角阿甘妙', '哦哦哦', '还想看克苏鲁', '大鼻子酷迪!!', '好早', '爱心熊??', '这不是错误化吗', '夜间电视这么刺激的吗', '等等爷孙用的小莫不对吧喂!', '阿甘妙世界', '确实,我电脑里有些电影也有乱码,烦', '好怪哦', '左上角是SU里的Amethyst!', '学来对抗美国自己', '这个我看了', '《贩罪》!!!', 'woc!', '右上角有阿甘!', '他甚至还笑了一下', '兔八哥有意思多了', '●REC', '漫威已经拉了', '想起了以前迪士尼通过制造舆论最终实费雪工作室倒闭的事情', '迪士尼毒瘤', '佛爷哥', '错误化?', 'Finn PB MC ', '好耶~', '儿 童 动 画', '胆小狗醒目', '幻视成龙草', '右上角是gumball', '所有风云人物都会出席', '细 你太细了,安迪', '水浒传', '薛吉', '这不就水浒套路吗', '错误化', '别的不说,这些被感染的角色看起来真的挺掉san的', '好早', '一共串了得十几个作品', '猎鹰与冬兵我就已经看得快吐出来了,洛基前几集直接退漫威坑', '6分钟', '阿甘妙世界?!?!?!?!?!?!?!', '妙啊', '六分钟', '都看过', '我学这个干嘛', '使用爱的力量!', '还能吃', '不就是某某宇宙吗?', '五分钟', '看之前先三连 ', '阿甘妙世界阿甘', '这乱码可以说是san值狂掉了', '飞天小女警也是AS的?', '好像还有少年骇客吧?', '我好早', '但漫威最近拉了啊', '来咯', '这里右上角是阿甘', '那这样的话。飞天小女警看来这次是不能活着回来了。doge', '离谱', 'popy', '早', '好', '11111111']

进程已结束,退出代码为 0

4. 全部代码

4.1 爬取弹幕代码部分

import requests
import re


def getHtml(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = 'utf-8'
        # print(r.text)
        return r.text
    except:
        return 'error...'


def parseHtml(html, info_list):
    info_list = re.findall('<d p=".*?">(.*?)</d>', html)     # 直接使用re匹配弹幕
    # print(info_list)
    return info_list


def saveInfo(info_list):
    for info in info_list:
        with open('./download_file/bilibili_comments.txt', mode='a', encoding='utf-8') as f:
            f.write(info)
            f.write('\n')
    print('哔哩哔哩弹幕爬取完!!!')


if __name__ == '__main__':
    comments = []
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=566429962'
    html = getHtml(url)
    comments = parseHtml(html, comments)
    saveInfo(comments)

4.2 词云代码部分

import jieba
import wordcloud  # 词云
import imageio    # 自定义词云样式

img = imageio.imread('./files/python.png')      # 需要png透明图

f = open('./files/bilibili_comments.txt', encoding='utf-8')
text = f.read()
# print(text)
text_list = jieba.lcut(text)                   # 分词, 得到词语列表
# print(text_list)
str = ' '.join(text_list)                      # 以空格合并列表,变成字符串
# print(str)

wc = wordcloud.WordCloud(
    width=640,
    height=480,
    background_color='white',                 # 默认黑色
    font_path='msyh.ttc',                     # 字体
    # 停用词
    stopwords={'我', '的', '是', '了', '不', '啊', '都', '吗', '这', '吧', '化', '这个', '就', '看', '在', '不是', '也', '和', '有', '里'}
    , mask=img
    # , contour_width=3
    # , contour_color='green'                 # 默认black
    # , include_numbers=False
    # , min_word_length=0
)

wc.generate(str)
wc.to_file('./files/output2.png')
print('词云生成完成!!!')

5. 效果

5.1 弹幕

5.2 词云

6. 总结

总体来说很简单。

除了,要有弹幕api的链接,并且要会运用re正则表达式

posted @ 2022-04-07 09:02  Oraer  阅读(1007)  评论(0编辑  收藏  举报