import requests ##响应网络
from bs4 import BeautifulSoup ##分析网页页面
from pyecharts.charts import Line ##绘制折线图
url = 'https://comment.bilibili.com/218710655.xml' ##B站api
fankui = requests.get(url) ##因此为B站提供的API,所以无需更换headers.
fankui.encoding = fankui.apparent_encoding ##此网页为xml,请求头获取到的网页编码与实际不同,使用编码转换使内容不乱码
neirong = fankui.text ##使用.text属性获取内容
a = BeautifulSoup(neirong,'lxml') ##使用BeatifulSoup解析网页内容
b = a.find_all(name='d') ##通过find_all找到所有的d节点内容,找出的内容为列表形式
# print(b)
wordlist = [] ##创建一个空列表
for c in b: ##遍历列表中的数据
shuju = c.attrs['p'] ##访问.attrs属性获取每个节点p的值
time = shuju.split(',')[0] ##使用.split传入逗号分隔shuju,获取字符串的第一项
wordlist.append(float(time)) ##先将时间转换为浮点数然后追加至空列表
wordDict = {} ##创建一个空字典
for word in range(25): ##word在0~24中
start = 30*word + 1 ##例如word为0则开始数值为30*0=1,若为1则开始数值为31
end = 30*(word + 1) ##例如word为0则结束数值为30*(0+1)=30.
segment_range = f'{start}-{end}' ##字节范围使用了格式化输出。引用上面举例则为0-30为第一个区间范围
wordDict[segment_range] = 0 ##字典中键为segment_range的值设置为0
for shijian in wordDict.keys(): ##遍历字典中的key
start_key = shijian.split('-')[0] ##startkey为字典中的key使用剪切,以‘-’为界限,选取第一位。如:start_key=31-60则start_key为31
end_key = shijian.split('-')[1] ##end_key为字典中的key使用剪切,以‘-’为界限,选取第一位。如:start_key=31-60则start_key为60
# print(start_key)
# print(end_key)
for item in wordlist: ##遍历wordlist赋值给item。现在wordlist中的数据根据上文可知为:[*.***,*.***]因为弹幕是在一个时间点发出的,我们要统计的是在一个时间段内发出的弹幕量
if int(start_key) <= item <= int(end_key): ##如果item在整数start——key和end_key之间
wordDict[shijian] = wordDict[shijian] + 1 ##则在字典中将**-**+1
print(wordDict) ##显示字典中的所有值
line = Line() ##Line函数创建一个Line对象赋值给line
line.add_xaxis(list(wordDict.keys())) ##先将字典中的key转换为列表值,然后使用.add_xaxis()函数设置折线图的X轴。
line.add_yaxis('弹幕数',list(wordDict.values())) ##同上,将字典的值转换为列表,然后使用.add_yaxis()函数绘制折线图的Y轴,并且Y轴可以设置数据统称。
line.render('line.html') ##render()函数可以默认折线图以html格式存储在代码所在文件夹内
print('success') ##提示程序运行成功
|