第一步,先把弹幕下载下来
def danmu(urls):
global wordlist
global av
for i in urls:
url2='http://comment.bilibili.com/'
html=requests.get(i,headers=head)
html.encoding='utf-8'
m=re.findall('"cid":([0-9]+),"dimension":',html.text)
if len(m)>0:
av.append(i)
html1=requests.get(url2+m[0]+'.xml')
html1.encoding='utf-8'
return html1.text
返回的数据是xml格式的,用ET.fromstring(xml) 解析
root = ET.fromstring(xml)
根据预先定义好的情绪对照表构建词典
xls= xlrd.open_workbook('弹幕多维情感词典.xlsx')
table = xls.sheets()[0]
nrows = table.nrows #获取该sheet中的有效行数
table.cell(1,0)
m={}
for i in range(nrows):
if i==0:
continue
else:
m[ str(table.cell(i,1)).replace('text:','').replace('\'','')]= str(table.cell(i,0)).replace('text:','').replace('\'','')
识别每一条弹幕的情绪分类
def d(s):
global m
p=[]
for i in m.keys():
if i in s:
p.append(m[i])
else:
p.append('无')#无态度
return p
提取数据到data,以字典的形式存储
for i in root.findall('d'):
if i.attrib['p'].split(',')[0] in data:
data[float(i.attrib['p'].split(',')[0])]+=d(i.text)
else:
data[float(i.attrib['p'].split(',')[0])]=d(i.text)
统计各个情绪的数量
for i in range(0,round((max(data.keys()))),30):
x_.append(i/30)
y1,y2,y3,y4,y5,y6,y7,y8=0,0,0,0,0,0,0,0#乐好怒哀惧恶惊 无
for j in data.keys():
if float(i)<float(j) and float(j)<float(i+30):
for k in data[j]:
y1+=k.count('乐')
y2+=k.count('好')
y3+=k.count('怒')
y4+=k.count('哀')
y5+=k.count('惧')
y6+=k.count('恶')
y7+=k.count('惊')
y8+=k.count('无')
y_1.append(y1)
y_2.append(y2)
y_3.append(y3)
y_4.append(y4)
y_5.append(y5)
y_6.append(y6)
y_7.append(y7)
y_8.append(y8)
既然已经分析好了,开始画图:
a-七种情感维度的频数分布图
#a-七种情感维度的频数分布图
plt.ylabel("", fontproperties="SimSun") # 步骤一 (宋体)
plt.title("七种情感维度的频数分布图", fontproperties="SimHei") # (黑体)
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#乐好怒哀惧恶惊
y_l=['乐','好','怒','哀','惧','恶','惊']
yu=[sum(y_1),sum(y_2),sum(y_3),sum(y_4),sum(y_5),sum(y_6),sum(y_7)]
plt.bar(y_l,yu, facecolor = 'blue', edgecolor = 'white')
for a, b in zip(y_l, yu):
plt.text(a, b, b, ha='center', va='bottom', fontsize=11)
plt.savefig('a-七种情感维度的频数分布图.png')
b-七种情感的时间变化图
#b-七种情感的时间变化图
#y_l=['乐','好','怒','哀','惧','恶','惊']
fig = plt.figure(figsize=(10,6), facecolor = 'gray')
plt.figure(figsize=(12,12))
plt.subplot(331)
plt.plot(x_,y_1)
plt.title('乐')
plt.subplot(332)
plt.plot(x_,y_2)
plt.title('好')
plt.subplot(333)
plt.plot(x_,y_3)
plt.title('怒')
plt.subplot(334)
plt.plot(x_,y_4)
plt.title('哀')
plt.subplot(335)
plt.plot(x_,y_5)
plt.title('惧')
plt.subplot(336)
plt.plot(x_,y_6)
plt.title('恶')
plt.subplot(337)
plt.plot(x_,y_7)
plt.title('惊')
plt.savefig('b-七种情感的时间变化图.png')
c-二元情感趋势图
#c-二元情感趋势图
yy_1=[]
for i in range(len(x_)):
#y_l=['乐','好','怒','哀','惧','恶','惊']
yy_1.append(y_1[i]+y_2[i]-y_3[i]-y_4[i]-y_5[i]-y_6[i]-y_7[i])
plt.plot(x_,yy_1)
plt.title('二元情感趋势图')
plt.savefig('c-二元情感趋势图.png')