整合營銷服務商

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

          免費咨詢熱線:

          python爬取B站網頁彈幕內容,并將爬取內容以五角星的形式顯示出來

          路:

          • 向嗶哩嗶哩網站發送請求
          • 請求成功后,解析爬取的彈幕內容保存到一個文件中
          • 讀取文件并分析彈幕內容中詞組或文字出現的頻率
          • 將這些詞組或文字組成五角星圖形
          • 組成五角星圖形后,以圖片的形式輸出

          使用到的類庫,如果沒有,需要下載,下載命令:

          pip install requests
          pip install bs4
          pip install pandas
          pip install lxml # 在解析xml文件時,需要使用
          pip install jieba
          pip install wordcloud
          pip install imageio
          pip install matplotlib
          

          實現:

          import requests
          from bs4 import BeautifulSoup
          import pandas as pd
          import re
          import jieba
          from wordcloud import WordCloud
          from imageio import imread
          import matplotlib.pyplot as plt
          ?
          '''
          python學習交流群:821460695更多學習資料可以加群獲取
          '''
          # 網頁地址,該地址只針對嗶哩嗶哩彈幕網有效,獲取方式查看
          url = "http://comment.bilibili.com/124001121.xml"
          ?
          # 網站訪問的用戶代理,建議攜帶,不攜帶可能無法訪問
          header = {
           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
          }
          ?
          # 向對方服務器發送請求,返回訪問狀態,
          # 返回狀態如果是以[2]開頭,表示訪問成功,[4]開頭表示網頁不存在,[5]開頭網站內部錯誤
          # 訪問狀態無法直接讀取,需通過屬性[text]獲取
          response = requests.get(url,header)
          ?
          # 獲取網頁的編碼規則,建議通過該方式獲取,而不是直接賦值,可能存在設置不對的情況,可能不是中文網頁
          # response.encoding = "utf-8"
          response.encoding = response.apparent_encoding
          # print(response.text)
          ?
          # 獲取網頁文本內容
          data = response.text
          '''
          --將獲取到的彈幕內容處理后存放在txt文件中,并讀取出來
          --網頁獲取的彈幕內容是帶html標簽的,需要將標簽和非漢字的內容清除
          '''
          # 解析文本xml,處理不規范標記并生成剖析樹
          soup = BeautifulSoup(data,'lxml') 
          # print(soup)
          # 獲取所有<d>標簽中的內容,此時是帶標簽的文本內容
          d_list = soup.find_all('d')
          ?
          # 去掉<d>標簽,將文本內容存在在列表dlst
          dlst = []
          for d in d_list:
           danmu = {}
           danmu['彈幕'] = d.text # 循環獲取所有<d>標簽中內容
           dlst.append(danmu)
          ?
          df = pd.DataFrame(dlst) # 將列表dlst中的內容存放在數據集中,類似于Excel表格
          # print(df)
          ?
          # 創建并打開一個文件
          f = open('cl.txt','w',encoding='utf-8')
          # 進行文本過濾
          for i in df['彈幕'].values: # 遍歷數據集中的所有的彈幕內容
           pat = re.compile(r'[一-龥+]') # 定義過濾規則,只保留中文漢字,該正則表達式幾乎包含了所有漢字龥(yu,第四聲)
           filter_data = re.findall(pattern=pat,string=i) # 執行過濾操作
           f.write(''.join(filter_data)) # 將過濾后的彈幕內容寫入創建的[cl.txt]文件中
          f.close()
          ?
          '''
          --讀取彈幕內容所在的文件[cl.txt]
          '''
          f1 = open('cl.txt','r',encoding='utf-8')
          data = f1.read()
          ?
          '''
          --將彈幕內容分割成詞組,并組合成五角星的圖案
          '''
          result = " ".join(jieba.lcut(data))
          ?
          f1.close()
          color_mask = imread("五角星.jpg") # 設置數據組合的圖形,最好使用空心的圖片
          wc = WordCloud(
           font_path="C:\Windows\Fonts\simsun.ttc", # 數據顯示的字體
           width=1000,
           height=800,
           background_color='white', # 詞云的背景色
           mask=color_mask # 詞云組成的圖形,默認為二維
          )
          ?
          wc.generate(result) # 將彈幕內容生成詞云
          wc.to_file('clanned.png') # 詞云輸出文件
          ?
          '''
          --顯示彈幕內容組成的圖片
          '''
          plt.imshow(wc)
          plt.show()
          

          知識點:

          • request 向對方服務器發送請求
          • BeautifulSoup 解析爬取的彈幕內容
          • pandas 分析彈幕數據
          • jieba 中文分詞器,或稱為中文詞組切片器
          • wordcloud 加載彈幕文本,并輸出文件(這里使用圖片的方式輸出)
          • matplotlib.pyplot 將整理后的彈幕文本以圖形的方式輸出(這里是以五角星的圖片為例)
          • imread 讀取圖片

          問題:

          • 爬取的彈幕內容被保存在了文件后,后又重新讀取,是否可以不存放在文件中,直接使用列表或者其他對象存儲,然后再讀取?保存在文件和直接讀取的優缺點是什么?
          • 彈幕內容中除了漢字,實際上還包含了大量的字母,表情符號,這些內容可以通過什么正則表達式進行篩選,能否同時跟漢字一起篩選出來?
          • 在導包的時候,使用[from scipy.misc import imread]報錯,用[from imageio import imread]代替即可。為什么使用scipy.misc中的imread報錯?

          .前言

          在上一篇文章【[以『贅婿』為實戰案例,手把手教會你用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.以可視化方式
          分析好的數據進行可視化展示!

          京網絡舉報微信公眾號

          為切實保障廣大網民合法權益,維護良好網絡生態,中央網信辦啟動了為期1個月的“清朗·網絡戾氣整治”專項行動。按照專項行動工作部署安排,北京市網絡輿情和舉報中心啟動“清朗·網絡戾氣整治”專項舉報工作,及時受理社會公眾舉報。

          一、舉報受理范圍

          專項舉報行動重點圍繞社交、短視頻、直播等重點平臺類型,重點受理的違法和不良信息范圍是:

          1.“網絡廁所”“開盒掛人”行為。創建專門的BOT賬號、貼吧、話題、群組等,通過匿名投稿、隔空喊話等方式,接收并發布針對特定群體或個人的嘲諷譏笑、惡意評價、詛咒謾罵信息。以揭露、批評等名義惡意“開盒”“掛人”,公開他人姓名、身份證號、手機號碼、家庭住址、工作單位、個人照片、社交賬號等個人隱私信息,煽動網民攻擊謾罵。

          2.借社會熱點事件惡意詆毀、造謠攻擊。對突發案事件相關當事人進行造謠污蔑,或者剪輯加工與事實嚴重不符的圖片、視頻,誘導網民對當事人進行攻擊質疑。利用熱點事件當事人形象,制作發布表情包,使用AI軟件合成低俗色情、血腥恐怖等虛假圖片或視頻,進行造謠攻擊、惡搞詆毀。

          3.污名化特定群體、煽動地域對立。將個別惡性社會事件、負面人物與性別、職業、地域等特征相關聯,對特定群體污名化、打負面標簽,發布性別對立、階層對立、地域歧視言論,進行泛化攻擊,激化社會矛盾。

          4.斗狠PK等低俗不良直播行為。網絡主播利用逞勇斗狠、PK飲酒、謾罵吐臟等行為,漲粉引流。在他人直播過程中,利用彈幕、連麥等功能進行人身攻擊,甚至慫恿鼓動自殺自殘等極端行為。編造打架約架等暴力沖突劇本,吸引網民圍觀,擾亂公共秩序。

          5.有組織地惡意辱罵舉報他人。以“幫忙做事”“解憂解氣”等名義,提供有償代罵服務,對特定賬號進行留言辱罵、私信攻擊。組織粉絲群體使用平臺“舉報”“反黑”等功能,惡意批量舉報他人。發布娛樂、體育、電競等領域拉踩引戰、惡意炒作言論,誘導粉絲互撕謾罵、刷量控評。

          6.編造網絡黑話、惡意造梗。通過拼音、諧音、指代詞等方式,惡意編造低俗爛梗、不良流行語,污染網絡風氣。使用污言穢語、粗口臟話,故意挑起矛盾、制造對立沖突。

          7.煽動網上極端情緒。編造聳人聽聞的帖文標題,發布無中生有、毫無底線的“泄憤帖”。惡意夸大師生矛盾,渲染家長“壓迫”“壓榨”孩子,挑起關系對立,對未成年人形成不良導向。刻意渲染消極負面、焦慮怨憤情緒,散布仇視對立言論。

          二、舉報受理方式

          1.舉報咨詢電話:010-67196565

          2.舉報網址:www.bjjubao.org.cn

          3.北京屬地網站舉報方式:www.bjjubao.org.cn/2023-04/23/content_42964.html

          歡迎廣大網民積極提供相關舉報線索,共同維護清朗網絡空間。


          主站蜘蛛池模板: 国产午夜毛片一区二区三区| 亚洲国产精品一区| 激情无码亚洲一区二区三区| 精品国产一区二区三区久久| 成人区人妻精品一区二区三区| 一本大道东京热无码一区 | 精品欧美一区二区在线观看 | 亚洲av色香蕉一区二区三区 | 一区二区三区中文| 国产一区二区三区不卡在线看| 亚洲国产精品一区第二页| 日本香蕉一区二区三区| 无码播放一区二区三区| 国产丝袜一区二区三区在线观看| 国产精品无码不卡一区二区三区| 精品无码一区二区三区爱欲九九| 影音先锋中文无码一区| 日韩精品午夜视频一区二区三区| 白丝爆浆18禁一区二区三区 | 无码国产精品一区二区免费vr| 国内精品一区二区三区东京| 99精品久久精品一区二区| 日本免费一区尤物| 国产在线不卡一区| 日亚毛片免费乱码不卡一区| 亚洲av鲁丝一区二区三区| 日韩精品一区二区三区影院| 日韩伦理一区二区| 日本香蕉一区二区三区| 性色AV一区二区三区无码| 色欲综合一区二区三区| 国产一区二区三区高清视频| 久久精品免费一区二区喷潮| 亚洲天堂一区二区三区四区| 国产精品福利区一区二区三区四区 | 久久精品一区二区三区四区| 99精品国产一区二区三区| 亚洲AV无码一区二三区 | 精品伦精品一区二区三区视频 | 一区二区三区日本视频| 精品亚洲综合在线第一区|