整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          python爬取7w+「贅婿」彈幕,發現彈幕比劇還精彩

          .前言

          在上一篇文章【[以『贅婿』為實戰案例,手把手教會你用python爬取『愛奇藝』視頻彈幕]】,教會了大家如何爬取愛奇藝彈幕

          本文將在上文的基礎上繼續完善,爬取更多的彈幕數據進行可視化分析!

          同樣還是以『贅婿』為例,下面將爬取全部彈幕數據,約7w+條數據!!!

          2.采集數據

          1.尋找url




          上文介紹到,每一集都需要通過查看數據把獲取彈幕的url

          因此,我們需要去獲取這些的彈幕url!!!

          
          tv_name_list =[
          '',
          '/54/00/7973227714515400',
          '/57/00/4779805474835700',
          '/37/00/1016845483273700',
          '/77/00/8679935826337700',
          '/46/00/7197533339804600',
          '/48/00/8042213977424800',
          '/98/00/2262609044749800',
          '/94/00/1699488619659400',
          '/47/00/1805374511564700',
          '/46/00/1933721047194600',
          '/08/00/7232026471250800',
          '/59/00/8982352350925900',
          '/43/00/4702797553454300',
          '/38/00/2151107991923800',
          '/93/00/8357465155589300',
          '/29/00/2071693573022900',
          '/71/00/4646645944127100',
          '/39/00/1182091647913900',
          '/31/00/7711721648193100',
          '/58/00/2099769377685800',
          '/83/00/3042314248738300',
          '/21/00/2889100571832100',
          '/98/00/3374410909698000',
          '/37/00/4335405595243700',
          '/32/00/5215381530163200',
          '/11/00/2379725258541100',
          '/48/00/4872856713204800',
          '/08/00/1488519001760800',
          ]
          

          以上就是彈幕url參數!!!

          2.請求數據

          
          def get_data():
              for k in range(1,len(tv_name_list)):#29個 1-28
                  url_id = tv_name_list[k]
                  for x in range(1,11):
                      # x是從1到11,11怎么來的,這一集總共46分鐘,愛奇藝每5分鐘會加載新的彈幕,46除以5向上取整
                      try:
                          url = 'https://cmts.iqiyi.com/bullet'+str(url_id)+'_300_' + str(x) + '.z'
                          xml = download_xml(url)
                          # 把編碼好的文件分別寫入個xml文件中(類似于txt文件),方便后邊取數據
                          with open('./lyc/zx'+str(k) +'-'+ str(x) + '.xml', 'a+', encoding='utf-8') as f:
                              f.write(xml)
                      except:
                          pass
          




          這樣就可以將含有的彈幕信息的xml文件下載到本地!

          3.合并數據到excel

          
          import openpyxl
          outwb = openpyxl.Workbook()  # 打開一個將寫的文件
          outws = outwb.create_sheet(index=0)  # 在將寫的文件創建sheet
          
          """
          import xlwt
          # # 創建一個workbook 設置編碼
          workbook = xlwt.Workbook(encoding = 'utf-8')
          # # 創建一個worksheet
          worksheet = workbook.add_sheet('sheet1')
          #
          # # 寫入excel
          # # 參數對應 行, 列, 值
          # worksheet.write(0,0, label='index')
          # worksheet.write(0,1, label='tvname')
          # worksheet.write(0,2, label='uid')
          # worksheet.write(0,3, label='content')
          # worksheet.write(0,4, label='likeCount')
          """
          outws.cell(row = 1 , column = 1 , value = "index")
          outws.cell(row = 1 , column = 2 , value = "tvname")
          outws.cell(row = 1 , column = 3 , value = "uid")
          outws.cell(row = 1 , column = 4 ,  value = "content")
          outws.cell(row = 1 , column = 5 , value = "likeCount")
          

          避坑:
          之前我們使用xlwt來保存數據到excel,但是最多寫到65535行,這次我們采用openpyxl來寫入到excel!!!

          
          def xml_parse(file_name,tv__name):
              global  count
              DOMTree = xml.dom.minidom.parse(file_name)
              collection = DOMTree.documentElement
              # 在集合中獲取所有entry數據
              entrys = collection.getElementsByTagName("entry")
          
              for entry in entrys:
                  uid = entry.getElementsByTagName('uid')[0]
                  content = entry.getElementsByTagName('content')[0]
                  likeCount = entry.getElementsByTagName('likeCount')[0]
                  #print(uid.childNodes[0].data)
                  #print(content.childNodes[0].data)
                  #print(likeCount.childNodes[0].data)
                  # 寫入excel
                  # 參數對應 行, 列, 值
                  outws.cell(row=count, column=1, value=str(count))
                  outws.cell(row=count, column=2, value=str("第"+str(tv__name)+"集"))
                  outws.cell(row=count, column=3, value=str(uid.childNodes[0].data))
                  outws.cell(row=count, column=4, value=str(content.childNodes[0].data))
                  outws.cell(row=count, column=5, value=str(likeCount.childNodes[0].data))
                  count=count+1
          

          這樣就可以將xml里的數據保存到excel

          
          def combine_data():
              for k in range(1,29):
                  for x in range(1,11):
                      try:
                          xml_parse("./lyc/zx"+str(k) +"-"+ str(x) + ".xml",k)
                          print(str(k) + "-" + str(x))
                      except:
                          pass
              # 保存
              #workbook.save('彈幕數據集-李運辰.xls')
              outwb.save("彈幕數據集.xls")  # 保存結果
          


          這樣7w+條彈幕數據可以完全寫入到excel中,命名為 彈幕數據集.xls

          3.數據可視化

          1.瀏覽數據

          
          # 導包
          import pandas as pd
          
          #讀入數據
          df_all = pd.read_csv("彈幕數據集.csv",encoding="gbk")
          df = df_all.copy()
          
          # 重置索引
          df = df.reset_index(drop=True)
          print(df.head())
          




          說明:1.index序號、2.tvname集數、3.uid用戶id、4.content評論、5.likeCount評論點贊數

          2.累計發送彈幕數的用戶

          
          #累計發送彈幕數的用戶
          def an1():
              danmu_counts = df.groupby('uid')['content'].count().sort_values(ascending=False).reset_index()
              danmu_counts.columns = ['用戶id', '累計發送彈幕數']
              name = danmu_counts['用戶id']
              name = (name[0:10]).tolist()
              dict_values = danmu_counts['累計發送彈幕數']
              dict_values = (dict_values[0:10]).tolist()
          
              # 鏈式調用
              c = (
                  Bar(
                      init_opts=opts.InitOpts(  # 初始配置項
                          theme=ThemeType.MACARONS,
                          animation_opts=opts.AnimationOpts(
                              animation_delay=1000, animation_easing="cubicOut"  # 初始動畫延遲和緩動效果
                          ))
                  )
                      .add_xaxis(xaxis_data=name)  # x軸
                      .add_yaxis(series_name="累計發送彈幕數的用戶", yaxis_data=dict_values)  # y軸
                      .set_global_opts(
                      title_opts=opts.TitleOpts(title='', subtitle='',  # 標題配置和調整位置
                                                title_textstyle_opts=opts.TextStyleOpts(
                                                    font_family='SimHei', font_size=25, font_weight='bold', color='red',
                                                ), pos_left="90%", pos_top="10",
                                                ),
                      xaxis_opts=opts.AxisOpts(name='用戶id', axislabel_opts=opts.LabelOpts(rotate=45)),
                      # 設置x名稱和Label rotate解決標簽名字過長使用
                      yaxis_opts=opts.AxisOpts(name='累計發送彈幕數'),
          
                  )
                      .render("累計發送彈幕數的用戶.html")
              )
          


          3.查看某個用戶評論情況

          
          #查看某個用戶評論情況
          def an2():
              df_top1 = df[df['uid'] == 2127950839].sort_values(by="likeCount", ascending=False).reset_index()
              print(df_top1.head(20))
          


          4.用戶(2127950839)每一集的評論數

          
          #查看用戶(2127950839)每一集的評論數
          def an3():
              df_top1 = df[df['uid'] == 2127950839].sort_values(by="likeCount", ascending=False).reset_index()
              data_top1 = df_top1.groupby('tvname')['content'].count()
              print(data_top1)
              name = data_top1.index.tolist()
              dict_values = data_top1.values.tolist()
              # 鏈式調用
              c = (
                  Bar(
                      init_opts=opts.InitOpts(  # 初始配置項
                          theme=ThemeType.MACARONS,
                          animation_opts=opts.AnimationOpts(
                              animation_delay=1000, animation_easing="cubicOut"  # 初始動畫延遲和緩動效果
                          ))
                  )
                      .add_xaxis(xaxis_data=name)  # x軸
                      .add_yaxis(series_name="查看用戶(2127950839)每一集的評論數", yaxis_data=dict_values)  # y軸
                      .set_global_opts(
                      title_opts=opts.TitleOpts(title='', subtitle='',  # 標題配置和調整位置
                                                title_textstyle_opts=opts.TextStyleOpts(
                                                    font_family='SimHei', font_size=25, font_weight='bold', color='red',
                                                ), pos_left="90%", pos_top="10",
                                                ),
                      xaxis_opts=opts.AxisOpts(name='集數', axislabel_opts=opts.LabelOpts(rotate=45)),
                      # 設置x名稱和Label rotate解決標簽名字過長使用
                      yaxis_opts=opts.AxisOpts(name='評論數'),
          
                  )
                      .render("查看用戶(2127950839)每一集的評論數.html")
              )
          


          5.劇集評論點贊數最多的評論內容

          
          #劇集評論點贊數最多的評論內容
          def an4():
              df_like = df[df.groupby(['tvname'])['likeCount'].rank(method="first", ascending=False) == 1].reset_index()[['tvname', 'content', 'likeCount']]
              df_like.columns = ['集', '彈幕內容', '點贊數']
              print(df_like)
          


          6.評論內容詞云

          
          #評論內容詞云
          def an5():
              contents = (df_all['content']).tolist()
          
              text = "".join(contents)
              with open("stopword.txt", "r", encoding='UTF-8') as f:
                  stopword = f.readlines()
              for i in stopword:
                  print(i)
                  i = str(i).replace("\r\n", "").replace("\r", "").replace("\n", "")
                  text = text.replace(i, "")
              word_list = jieba.cut(text)
              result = " ".join(word_list)  # 分詞用 隔開
              # 制作中文云詞
              icon_name = 'fas fa-play'
              gen_stylecloud(text=result, icon_name=icon_name, font_path='simsun.ttc',
                             output_name="評論內容詞云.png")  # 必須加中文字體,否則格式錯誤
          
          


          4.總結

          1.爬取了7w+『贅婿』彈幕,保存到excel(數據分享給大家)!
          2.通過pandas讀取excel并進行相關統計計算!
          3.以可視化方式
          分析好的數據進行可視化展示!

          信小伙伴們逛B站的時候都見到過B站的字幕可以不遮擋人物的效果。

          那么B站到底是如何實現這么神奇的效果的呢?經過一番摸索最終發現了其中的奧秘

          主要是通過一行CSS屬性mask-image:設置了一張圖片為做元素的蒙版,使用人形圖片遮擋住了彈幕

          實踐出真知:上demo

          <!DOCTYPE html>
          <html lang="en">
          <head>
            <meta charset="UTF-8">
            <title>Title</title>
            <style>
              .video {
                width: 668px;
                height: 376px;
                position: relative;
                -webkit-mask-image: url("mask.svg");
                -webkit-mask-size: 668px 376px;
              }
              .bullet {
                position: absolute;
                font-size: 20px;
              }
            </style>
          </head>
          <body>
          <div class="video">
            <div class="bullet" style="left: 100px; top: 0;">元芳,你怎么看</div>
            <div class="bullet" style="left: 200px; top: 20px;">你難道就是傳說中的奶靈</div>
            <div class="bullet" style="left: 300px; top: 40px;">你好,我是胖靈</div>
            <div class="bullet" style="left: 400px; top: 60px;">這是第一集,還沒有舔靈</div>
          </div>
          </body>
          </html>
          

          效果圖:

          加個紅色背景效果更明顯一些:

          那么這種圖片是怎么來的呢?

          這應該用到了AI識別視頻人物的算法,可以自動檢測視頻中的人物、物體和其他重要區域,然后根據它們的運動軌跡進行彈幕屏蔽。

          具體來說,B站的彈募播放器使用計算機視覺算法對視頻中的每一幀進行分析,提取人物、物體等的邊緣特征和運動信息,然后根據這些信息計算出它們的運動軌跡。當彈幕出現在視頻的特定區域時,播放器會根據這些運動軌跡動態地調整彈幕的顯示位置,以避免彈幕擋住視頻中的人物、物體等重要信息。

          當然mask不止有image這一個屬性,還有如border、clip等等,感興趣的話可以都了解一下

          mask - CSS錛氬眰鍙犳牱寮忚〃 | MDNMDN Web DocsMDN logoMozilla logo

          開源精選》是我們分享Github、Gitee等開源社區中優質項目的欄目,包括技術、學習、實用與各種有趣的內容。本期推薦的是一個開源的 HTML5 視頻播放器插件——MuiPlayer。


          MuiPlayer 是一個開源的HTML5視頻播放插件,其默認配置了精美可操作的的播放控件,涉及了常用的播放場景,例如全屏播放、播放快進、循環播放、音量調節等功能。支持 mp4、m3u8、flv 等多種媒體格式播放,解決大部分兼容問題,同時適應在PC、手機端播放。


          特點

          • 各瀏覽器平臺播放 ui 不能統一
          • ui 擴展之間以及狀態處理容易產生沖突
          • 在不同環境下(android、ios、pc)針對 h5 video api 可能觸發事件的時機盡不相同
          • 媒體格式存在各種兼容問題,muiplayer 處理了大多數在不同環境下播放的兼容問題
          • 具有豐富的參數可以自定義播放器實例,通過輕松的配置即可完成自定義場景的視頻播放

          快速開始

          • 安裝

          使用 npm 安裝:

          npm i mui-player --save

          使用 yarn 安裝:

          yarn add mui-player
          • 使用

          1 使用 script 標簽引入:

          <!-- 引入基礎樣式文件 mui-player.min.css -->
          <link rel="stylesheet" type="text/css" href="css/mui-player.min.css"/>
          
          <!-- 引入基礎腳本 mui-player.min.js -->
          <script type="text/javascript" src="js/mui-player.min.js"></script>
          
          <!-- 指定播放器容器 -->
          <div id="mui-player"></div>

          或者使用模塊管理器引入:

          import 'mui-player/dist/mui-player.min.css'
          import MuiPlayer from 'mui-player'

          2 定義播放器容器

          <div id="mui-player"></div>

          3 初始化構建播放器

          // 初始化 MuiPlayer 插件,MuiPlayer 方法傳遞一個對象,該對象包括所有插件的配置
          var mp = new MuiPlayer({
              container:'#mui-player',
              title:'標題',
              src:'./static/media/media.mp4',
          })

          以上就能為初始化構建一個具有默認配置控件的視頻播放器。

          更多API基礎配置: https://muiplayer.js.org/zh/guide/api.html#%E4%B8%BB%E8%A6%81%E9%85%8D%E7%BD%AE


          效果演示

          • 基礎效果

          • 直播模式

          • 播放字幕

          • 播放彈幕

          • 多窗口播放


          更多內容大家可自行前往閱讀。

          開源地址:https://gitee.com/muiplayer/hello-muiplayer


          主站蜘蛛池模板: 国产一区二区三区电影| 一区二区3区免费视频| 日韩人妻一区二区三区免费| 国产美女av在线一区| 在线精品国产一区二区| 无码日韩精品一区二区免费| 亚洲午夜日韩高清一区| 无码少妇一区二区性色AV | 国产在线精品一区二区三区不卡| 精品乱人伦一区二区三区| 无码一区二区三区中文字幕| 曰韩精品无码一区二区三区| 伊人色综合一区二区三区影院视频| 久久精品国产第一区二区| 秋霞日韩一区二区三区在线观看 | 波多野结衣中文一区二区免费| 污污内射在线观看一区二区少妇| 日本精品视频一区二区三区| 少妇无码一区二区三区免费| www一区二区三区| 黑巨人与欧美精品一区| 无码日韩精品一区二区人妻| 精品欧洲av无码一区二区三区| 成人精品一区二区三区不卡免费看| 另类ts人妖一区二区三区| 亚洲色欲一区二区三区在线观看| 国产伦精品一区二区三区四区| 中文字幕一区二区三匹| 无码人妻AⅤ一区二区三区| 免费看一区二区三区四区| 日本丰满少妇一区二区三区| 国产suv精品一区二区33| 日本高清成本人视频一区| 免费一区二区三区在线视频| 日韩一区二区三区免费体验| 骚片AV蜜桃精品一区| 91久久精品国产免费一区| 国产成人综合一区精品| 国产香蕉一区二区在线网站| 91精品福利一区二区| 无码aⅴ精品一区二区三区浪潮|