吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1655|回复: 13
收起左侧

[Python 转载] python获取B站弹幕数量并绘制折线图

[复制链接]
shiyanwei 发表于 2022-8-22 11:29

[md]#新人一枚,近期想分享一个关于B站弹幕数量在时间段内的统计,并绘制折线图。希望大家批评指正。
使用了B站提供的弹幕API。
以下为程序代码:
```python
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')  ##提示程序运行成功
```
绘制的折线图如下所示:

折线图

折线图

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

快乐的鸡蛋黄 发表于 2022-8-22 13:07
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')  ##提示程序运行成功
 楼主| shiyanwei 发表于 2022-8-22 12:46
iawyxkdn8 发表于 2022-8-22 12:41
这东西有什么用?

如果你是UP主的话,可以查看大家再哪个时间段发的弹幕多。就能间接看出大家对那一块儿更感兴趣或其他情况。以此复盘自己的创作内容。
zibingo 发表于 2022-8-22 12:36
iawyxkdn8 发表于 2022-8-22 12:41
这东西有什么用?
 楼主| shiyanwei 发表于 2022-8-22 12:42
zibingo 发表于 2022-8-22 12:36
可以继续分析弹幕的内容啥的

可以,可以提取内容生成词云图等,我可以再发一个帖。
快乐的鸡蛋黄 发表于 2022-8-22 13:08
快乐的鸡蛋黄 发表于 2022-8-22 13:07
[md]```
import requests  ##响应网络
from bs4 import BeautifulSoup  ##分析网页页面

格式化了一下,论坛内md要在md编辑器编辑才行
streetfighterlu 发表于 2022-8-22 13:19
可以的。了解了
 楼主| shiyanwei 发表于 2022-8-22 13:32
本帖最后由 shiyanwei 于 2022-8-22 13:33 编辑
快乐的鸡蛋黄 发表于 2022-8-22 13:07
[md]```
import requests  ##响应网络
from bs4 import BeautifulSoup  ##分析网页页面

谢谢,我第一次在52pojie发帖,选了MD不知道最后为什么没显示出来。下次注意一下吧。
jjjzw 发表于 2022-8-22 13:35
shiyanwei 发表于 2022-8-22 13:32
谢谢,我第一次在52pojie发帖,选了MD不知道最后为什么没显示出来。下次注意一下吧。

选md后要在弹出的框里粘贴代码
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-7 00:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表