三十行代码爬取B站弹幕并生成词云

本文介绍了一种方法,通过Python代码从B站的BV号中获取视频的cid,进而抓取弹幕内容,并使用词云工具生成可视化结果。此过程涉及网络请求、正则表达式匹配及词云生成等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

因为B站的AV号变成了BV号,所以代码有了些许的改动

import requests
import json
import re
from wordcloud import WordCloud


# 用BV号得到cid号
def get_cid(bv):
    bv = bv.strip('BV1')
    url = f'https://api.bilibili.com/x/player/pagelist?bvid={bv}&jsonp=jsonp'
    res = requests.get(url)
    res_text = res.text
    res_dict = json.loads(res_text)
    cid = res_dict['data'][0]['cid']
    return cid


# 用cid号获取弹幕
def get_bullet_chat(cid):
    url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={cid}'
    res = requests.get(url)
    res.xml = res.content.decode('utf-8')
    patt = re.compile('<d.*?>(.*?)</d>')
    bullet_list = patt.findall(res.xml)
    return bullet_list


# 生成词云
def wold_could(bullent):
    bullent = str(bullent)  # 因为获取的弹幕是list,但是词云得是str类型
    wold_could_png = WordCloud(font_path='msyh.ttc').generate(bullent)
    wold_could_png.to_file('弹幕.png')


if __name__ == '__main__':
    bv = 'BV1Jz411b7zG'  # 用的是华农兄弟的视频
    cid = get_cid(bv)
    bullent = get_bullet_chat(cid)
    wold_could(bullent)

在Python中,爬取B(Bilibili)视频弹幕生成通常需要通过几个步骤完成: 1. **安装所需库**:首先,你需要安装`requests`库用于发送HTTP请求,`bs4`库用于解析HTML,以及`pydub`处理音频转文本(因为B弹幕通常是基于视频时间戳显示的),`jieba`进处理,`wordcloud`库用来生成。 2. **获取视频信息**:访问视频页面,使用`requests.get()`获取HTML源码,然后通过BeautifulSoup解析出视频ID,以便后续构造URL。 3. **下载弹幕数据**:找到B的API或者使用第三方工具(如`bilibili_api`),根据视频ID获取弹幕字幕文件,它是一个.json格式的数据,包含了弹幕的文字和对应的时间点。 4. **提取文字**:遍历弹幕文件,提取每个弹幕的文字内容,忽略非汉字字符。 5. **语音转文本**:如果你想要使用视频声音作为上下文,可以先用`pydub`将音频转换成文本。注意,这一步不是必需的,但可以增加的关联度。 6. **分与统计**:使用`jieba`对提取出来的文字进统计每个语的出现频率。 7. **生成**:最后使用`wordcloud`库创建图,你可以自定义字体、颜色、大小等参数,展示最常出现的语。 ```python # 示例代码片段 import requests from bs4 import BeautifulSoup import json from pydub import AudioSegment from jieba import lcut from wordcloud import WordCloud def get_video_info(url): # ... 获取视频ID ... video_id = 'VXXXXXXXXXXXXX' # 替换为你实际的视频ID response = requests.get(f'https://api.bilibili.com/x/v2/dm/get?mid={video_id}&danmu_type=0') data = json.loads(response.text) # 提取文字和频次 words = [] for item in data['data']['items']: words.extend(lcut(item['info'])) word_counts = collections.Counter(words) # ... 进其他处理 ... # 生成 wordcloud = WordCloud(...).generate_from_frequencies(word_counts) wordcloud.to_file('bilibili_danmu_wordcloud.png')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值