输入b站的视频URL返回弹幕可视化图

import json
from urllib import parse

import jieba
import matplotlib.pyplot as plt
import requests
from wordcloud import WordCloud
from xmltodict import parse

'''
语云图可以展示当前视频的关键字(首先剔除无用信息,例如 哈哈哈、啊啊啊)
折线图可以显示当前视频的热度走向(哪天火起来的等等)
后期可以补充折线图
'''
allContentAndTime = []  # 所有的弹幕和发送弹幕的时间
allContent = []  # 所有的弹幕
allWord = []  # 所有的词语


# 从URL得到BV
def from_URL_Get_BV(url):
    return url.split('/')[-1][:12]


# 从bv得到Cid
def from_Bv_Get_Cid(bv):
    # 拼接url
    url = 'https://api.bilibili.com/x/player/pagelist?bvid=' + str(bv) + '&jsonp=jsonp'
    # 设置爬虫的header
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"}
    # 得到网页内容
    response = requests.get(url, headers=headers)
    # 设置编码
    response.encoding = 'utf-8'
    # 得到html
    html = response.text
    # 转换成字典
    dic = json.loads(html)
    cid = dic['data'][0]['cid']  # 抓取cid
    return cid


# 从Cid获取弹幕
def from_Cid_Get_DanMu(cid):
    # 拼接url
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=' + str(cid)
    # 设置爬虫的header
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"}
    # 得到网页内容
    response = requests.get(url, headers=headers)
    # 设置编码
    response.encoding = 'utf-8'
    html = response.text
    # 将xml转为有序字典
    data = parse(html)
    allDanMu = data['i']['d']  # 得到d标签的数据(弹幕数据)
    global allContent, allContentAndTime  # 设置全局变量
    for i in range(len(allDanMu)):
        allData = str(allDanMu[i]['@p']).split(',')  # 抓去发布时间、发布人等数据
        time = allData[4]
        content = allDanMu[i]['#text']  # 抓去弹幕内容
        # 加入容器
        allContent.append(content)
        allContentAndTime.append(time + ":" + content)


# 爬虫流程
def parse_Html(url):
    bv = from_URL_Get_BV(url)
    cid = from_Bv_Get_Cid(bv)
    from_Cid_Get_DanMu(cid)


# 从弹幕到词
def from_Danmu_to_word():
    global allWord  # 设置全局变量
    # 每句话结尾用句号
    allContentToStr = '。'.join(allContent)
    # jieba分割词
    allWord = jieba.lcut(allContentToStr, cut_all=True)


# 从word转换为wordcould
def from_Word_To_WordCloud():
    # 设置字体格式(否则中文乱码)
    font_path = '/System/Library/Fonts/STHeiti Medium.ttc'
    wc = WordCloud(
        scale=9,  # 分辨率  数字越大 分辨率越高  制造时间越长
        stopwords=['哈', '哈哈', '哈哈哈', '哈哈哈哈', '哈哈哈哈哈'],  # 你不想要的数据
        background_color='white',  # 背景颜色
        max_font_size=60,  # 字体最大值
        random_state=20,  # 配色
        font_path=font_path  # 字体
    )
    # wordcloud需要的数据格式:数据以空格排列
    wordcloudData = ' '.join(allWord)
    # 生成词云
    myword = wc.generate(wordcloudData)
    # 展示词云图
    plt.imshow(myword)
    # 不展示x轴
    plt.axis('off')
    # plt展示
    plt.show()
    # 保存到本地
    myword.to_file('result.png')


if __name__ == '__main__':
    url = input('输入b站视频的URL:')
    parse_Html(url)
    print('共爬取到' + str(len(allContent)) + '条弹幕')
    from_Danmu_to_word()
    print('共分割为' + str(len(allWord)) + '个词语')
    from_Word_To_WordCloud()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值