B站弹幕下载分析

最近迷上了指环王加霍比特人,今天终于看完了。然后挺好其弹幕内容。然后爬取弹幕内容并进行分析B站弹幕下载分析_第1张图片
我们发现多有的弹幕都在一个这个里面
这就是一个cid了 cid可以在源代码中找到
B站弹幕下载分析_第2张图片
B站弹幕下载分析_第3张图片
emmm。到啦这里你们是不是想到了什么
对,是的只要找到cid就可以获取到弹幕内容了。很聪明
看代码
代码是

#_*_coding:utf-8_*_
#作者       :  Deth
#创建时间    : 2020/4/9 23:27
#文件       : BV号弹幕. py
# IDE       : PyCharm
#_*_coding:utf-8_*_
#作者       :  Deth
#创建时间    : 2020/4/9 20:41
#文件       : demo. py
# IDE       : PyCharm
import requests
import re
import lxml
from bs4 import BeautifulSoup
import jieba
from pyecharts.charts import *
import pyecharts.options as opt

class Bidanmu(object):
    def __init__(self):
        self.url = 'http://comment.bilibili.com/{}.xml'
        self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36(KHTML, like Gecko) '
                          'Chrome/52.0.2743.116 Safari/537.36'}

    def get_cid(self,urlbv):
        """
        根据你传入的urlbv获取你的cid的值
        :param urlbv:
        :return:
        """
        r = requests.get(url=urlbv, headers=self.headers) #请求网址进行源码查找cid
        pattern_cid = '\"bvid\":\".*?\",\"cid\":(\d+),' #匹配cid
        pattern_title = 'title=\"(.*?)\"' #匹配文章标题
        self.cid = re.search(pattern_cid, r.text).group(1)
        self.title = re.search(pattern_title,r.text).group(1)
        print(self.title,self.cid)
        self.getinfo()
        return

    def getinfo(self):
        """
        获取弹幕内容
        """
        data = requests.get(url=self.url.format(self.cid))
        data.encoding = 'utf-8'
        soup = BeautifulSoup(data.text,'lxml')
        infos = soup.find_all('d')
        self.comments = [info.text for info in infos]
        self.save()
        return

    def save(self):
        """
        保存弹幕内容
        :return:
        """
        # comments = self.getinfo()
        with open('./txt/{}.txt'.format(self.title),'a+',encoding='utf-8') as f:
            for i in self.comments:
                f.write(i)
                f.write('\n')
        self.danmufenxi()

    def danmufenxi(self):
        """
        进行弹幕分析
        :return:
        """
        dict = {}
        text = open('./txt/{}.txt'.format(self.title),'r',encoding='utf-8').read()
        txt = jieba.lcut(text,cut_all=False) # 利用jieba进行分词
        #对分好词进行筛选 大于五的不要
        for word in txt:
            if len(word) >=5:
                continue
            else:
                dict[word] = dict.get(word,0) +1
        li = list(dict.items())
        # print(li)
        li.sort(key=lambda x:x[1],reverse=True) #进行排序
        x_data,y_data = [],[]
        for i in li[:20]:
            x_data.append(i[0])
            y_data.append(i[1])

        # print(x_data,y_data)
        print(li)
        #绘制柱状图
        bar = (
            Bar()
            .add_xaxis(x_data)
            .add_yaxis('次数',y_data)
            .set_global_opts(title_opts=opt.TitleOpts(title='{}词频统计柱状图'.format(self.title[:10])),
                             datazoom_opts=opt.DataZoomOpts(range_start=0))
            # .render('{}词频统计.html'.format(self.title))
        )
        #绘制词云图
        ciyun = (
            WordCloud()
            .add(series_name='',data_pair=li[:50],word_size_range=[6,66])
            .set_global_opts(title_opts=opt.TitleOpts(title='{}词频统计词云图'.format(self.title[:10])))
        )
        #进行图标组合
        page = Page(layout=Page.DraggablePageLayout)
        page.add(
            bar,
            ciyun,
        )
        # 生成html文件
        page.render('./html/{}.html'.format(self.title))


if __name__ == '__main__':
    bv = input('请输入bv号:')
    urlbv = 'https://www.bilibili.com/{}'.format(bv)
    # urlbv = " " # 如果不知道bv号就直接输入网址把上面的取消
    bd = Bidanmu()
    bd.get_cid(urlbv)


程序路径
B站弹幕下载分析_第4张图片
输出
柱状图
B站弹幕下载分析_第5张图片
词云图B站弹幕下载分析_第6张图片
关于bv号
在这里插入图片描述

你可能感兴趣的:(python,可视化)