鱼C论坛

 找回密码
 立即注册
查看: 600|回复: 2

[作品展示] b站弹幕密度排序,寻找高能瞬间

[复制链接]
发表于 2019-2-11 15:48:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 幽梦三影 于 2019-8-9 12:57 编辑
  1. import random
  2. import re
  3. from collections import Counter

  4. import requests
  5. from lxml import etree


  6. class Danmu_Analyser:
  7.     def __init__(self, url):
  8.         self.url = url
  9.         self.long_time = ""
  10.         self.headers = {
  11.             'User-Agent': "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
  12.             'Referer': 'https://t.bilibili.com/pages/nav/index',
  13.             'Cookie': "你的b站cookie"
  14.         }

  15.     def transform_date(self, t):
  16.         m, s = divmod(int(t), 60)
  17.         h, m = divmod(m, 60)
  18.         result = "%02d:%02d:%02d" % (h, m, s)
  19.         return result

  20.     def get_cid(self):
  21.         text = requests.get(self.url, headers=self.headers).content.decode()
  22.         cid = re.findall(r'cid":(\d+?),', text)
  23.         self.long_time = re.findall(r'"duration":(\d+?),"vid', text)[0]
  24.         return cid

  25.     def get_data(self):
  26.         data = []
  27.         for cid in self.get_cid():
  28.             new_url = "https://comment.bilibili.com/{}.xml".format(cid)
  29.             html = requests.get(new_url).content.decode()
  30.             html = bytes(bytearray(html, encoding='utf-8'))
  31.             select = etree.HTML(html)
  32.             data_dict = {}
  33.             data_dict['danmu'] = select.xpath('//d/text()')
  34.             data_dict['send_time'] = select.xpath('//d/@p')
  35.             data.append(data_dict)
  36.         return data

  37.     def data_deal(self):
  38.         all_data = []
  39.         f = self.get_data()
  40.         danmu = f[0]["danmu"]
  41.         send_time = f[0]["send_time"]
  42.         data = list(zip(danmu, send_time))
  43.         for i in data:
  44.             t = i[1].split(",")[0].split(".")[0]
  45.             t = self.transform_date(t)
  46.             data_dict = {}
  47.             data_dict["send_time"] = t
  48.             data_dict["danmu"] = i[0]
  49.             all_data.append(data_dict)
  50.         return all_data

  51.     def analyse(self):
  52.         data = self.data_deal()
  53.         send_time = [i["send_time"] for i in data]
  54.         all_damu = [{"name": i["danmu"], "value": random.randint(1, 10)} for i in data]

  55.         long_time = [self.transform_date(i) for i in range(int(self.long_time) + 1)]
  56.         s = Counter(send_time)
  57.         r = {}
  58.         for i in long_time:
  59.             if i in s.keys():
  60.                 r[i] = s[i]
  61.             else:
  62.                 r[i] = "0"
  63.         return r, all_damu

  64.     def write_js_file(self):
  65.         html = '''
  66.             <!DOCTYPE html>
  67.         <html lang="en">
  68.         <head>
  69.             <meta charset="UTF-8">
  70.             <title>Title</title>
  71.         </head>
  72.         <body>
  73.             <div id="main" style="width: 1700px;height: 700px;"></div>
  74.             <script src="echarts.js"></script>
  75.         <script>
  76.             let data = ''' + str(self.analyse()[0]) + ''';
  77.             let y = Object.values(data);
  78.             let x = Object.keys(data);
  79.             var myChart = echarts.init(document.getElementById('main'));
  80.             myChart.setOption({
  81.             title: {
  82.                 text: 'bilibili弹幕密度'
  83.             },
  84.             xAxis: {
  85.                 data: x
  86.             },
  87.             yAxis: {},
  88.             series: [{
  89.                 name: '弹幕',
  90.                 type: 'bar',
  91.                 data: y
  92.             }]
  93.         });
  94.         </script>
  95.         </body>
  96.         '''
  97.         with open("./echarts/index.html", "w") as f:
  98.             f.write(html)

  99.     def write_danmu(self):
  100.         html = '''
  101.         <!DOCTYPE html>
  102. <html lang="en">
  103. <head>
  104.     <meta charset="UTF-8">
  105.     <title>词云图</title>
  106.     <script src="./echarts.js"></script>
  107.     <script src="./echarts-wordcloud.js"></script>
  108. </head>
  109. <body>
  110. <div id="main" style="width: 1700px;height: 700px;"></div>
  111. <script type="text/javascript">
  112.     var mychart = echarts.init(document.getElementById("main"));
  113.     var jsonlist = ''' + str(self.analyse()[1]) + ''';
  114.     // 五角星图片
  115.     image = "data:image/png;base64,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";
  116.     var maskImage = new Image();
  117.     maskImage.src = image;
  118.     var option = {
  119.         title: {
  120.             text: '词云图',
  121.             left: 'center'
  122.         },
  123.         series: [
  124.             {
  125.                 maskImage:maskImage,
  126.                 type: 'wordCloud',
  127.                 // 设置字符大小范围
  128.                 sizeRange: [6, 66],
  129.                 rotationRange: [-45, 90],
  130.                 textStyle: {
  131.                     normal: {
  132.                         color: function () {
  133.                             return 'rgb(' + [
  134.                                 Math.round(Math.random() * 160),
  135.                                 Math.round(Math.random() * 160),
  136.                                 Math.round(Math.random() * 160)
  137.                             ].join(',') + ')';
  138.                         }
  139.                     }
  140.                 },
  141.                 data: jsonlist
  142.             }
  143.         ]
  144.     };
  145.     maskImage.onload = function(){
  146.         mychart.setOption(option)
  147.     };
  148. </script>

  149. </body>
  150. </html>'''
  151.         with open("./echarts/word.html", "w") as f:
  152.             f.write(html)


  153. if __name__ == "__main__":
  154.     av = input("请输入av号:")
  155.     danmu_analyser = Danmu_Analyser(f"https://m.bilibili.com/video/av{av}.html")
  156.     while 1:
  157.         try:
  158.             danmu_analyser.write_danmu()
  159.             break
  160.         except requests.exceptions.ConnectionError:
  161.             continue
复制代码


                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-11 16:09:39 | 显示全部楼层
阿伟死了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-24 15:58:32 | 显示全部楼层
6666666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 03:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表