慕课《用Python玩转数据》之B站弹幕数据分析
1.源代码
# -*- coding: utf-8 -*-
"""
Created on Wed May 13 17:01:29 2020
@author: 苏子都
"""
import requests
import re
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
import datetime
import matplotlib.pyplot as plt
# from matplotlib.pyplot import MultipleLocator
from pyecharts import Pie
import webbrowser
from wordcloud import WordCloud
import jieba
plt.style.use('seaborn-dark') #设置绘图风格
barrage_list=[] #获取到弹幕的内容
def get_barrage():
"""
爬取弹幕
返回:
- barrage_all: 弹幕的详细信息,比如发送者、发送时间等
"""
url='https://api.bilibili.com/x/v1/dm/list.so?oid=7633504'
res=requests.get(url)
res.encoding='utf-8'
res_xml=res.content.decode('utf-8')
barrage_all=[] #除了弹幕内容的其他信息,包括弹幕发送者ID、发送弹幕的时间
#匹配出需要的内容,形式如<d p="4688.02300,1,25,16777215,1566557108,0,6a622490,20664776809512964">战歌起!</d>
pattern=re.compile('<d.*?>(.*?)</d>') #匹配出xml文件里面的d标签,获取弹幕内容
global barrage_list
barrage_list=pattern.findall(res_xml)
html=res.text
soup=BeautifulSoup(html,'html.parser')
for target in soup.find_all('d'): #弹幕的详细信息包含在d标签里面的p标签,先筛选出所有d标签
value=target.get('p').split(',') #获取p标签里面的内容
#根据爬取到的弹幕的详细信息的格式,生成并保存得到的结果
barrage_all.append({
'时间':value[0],'弹幕模式':value[1],'弹幕字号':value[2],'弹幕颜色':value[3],'时间戳':value[4],'弹幕池':value[5],'发送者ID':value[6],'历史弹幕':value[7]})
return barrage_all
def data_processing(barrage_df):
"""
数据处理
参数:
- barrage_df: 弹幕的所有信息,由弹幕详细信息和弹幕内容组成
"""
barrage_time=(barrage_df['时间'].astype(float)).astype(int)
time_list=[] #存储弹幕发在整个视频的哪一个时间
#将爬取到的“时间”,由秒数变为时分秒的形式
for a_time in barrage_time:
m,s=divmod(a_time,60)
h,m=divmod(m,60)
a_time=str(h)