python爬取B站弹幕评论

方式1:

进入B站,找到想爬取的视频

哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

以为闲鱼梦想家这位up视频为例子天冷了小伙在北京出租屋吃涮羊肉,太香太开心了_哔哩哔哩_bilibili

获取url

"https://www.bilibili.com/video/BV1feyNYcE36/?spm_id_from=333.880.my_history.page.click&vd_source=59cb1d172d45483d3059d3df82cd74b6"

在URL,bilibili前面j插入一个i,进入一个新天地

可以看到有弹幕地址,我们使用该URL

定义请求的 URL

python 复制代码
# 定义请求的 URL
url = "https://api.bilibili.com/x/v1/dm/list.so?oid=26331385792"

添加 User-Agent 头

python 复制代码
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
}

鼠标右键,检查:

完整代码:

python 复制代码
import requests
import re
# 方式1:
# 定义请求的 URL
url = "https://api.bilibili.com/x/v1/dm/list.so?oid=26331385792"


# 添加 User-Agent 头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
}

# 发送 GET 请求
response = requests.get(url=url, headers=headers)

# 设置响应编码
response.encoding = 'UTF-8'

# 使用正则表达式提取弹幕内容
content_list = re.findall('<d p=".*?">(.*?)</d>', response.text)

# 合并弹幕内容为一个字符串
content = '\n'.join(content_list)

# 写入文件
with open('file01.txt', mode='a', encoding='utf-8') as f:
    f.write(content + '\n')  # 添加换行符以便分隔不同次写入

# 打印弹幕内容
print(content)

方式2:(需要登录,想要获取其他日期时间的弹幕)

获取日期的URL

https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=26331385792&date=2024-10-19

因为我们登录了,在headers里面加上我们的Cookie

完整代码:

python 复制代码
import requests
import re

# 方式2(查看历史日期信息):
for page in range(17,19):
    # 定义请求的 URL
    url = f"https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=26331385792&date=2024-10-{page}"

    # 添加 User-Agent 头
    headers = {
        'cookie': "你的cookie",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
    }

    # 发送 GET 请求
    response = requests.get(url=url, headers=headers)

    content_list = re.findall('[\u4e00-\u9fa5]+', response.text)
    # 打印弹幕内容
    print(f'2024-10-{page}')
    # 合并弹幕内容为一个字符串
    content = '\n'.join(content_list)
    print(content_list)
    # 写入文件
    with open('file02.txt', mode='a', encoding='utf-8') as f:
        f.write(f'2024-10-{page}'+ '\n'+ content + '\n')  # 添加换行符以便分隔不同次写入

re.findall(...):这个函数返回在输入字符串中找到的所有匹配项,结果是一个列表。

+:表示匹配一个或多个前面的字符。

[\u4e00-\u9fa5]:这是一个字符类,匹配所有在这个范围内的中文字符。

正则表达式:如果发现乱码,可以将该乱码内容提取到:在线正则表达式测试 进行转化


可视化

可看https://blog.csdn.net/weixin_51891232/article/details/143022315,了解Matplotlib

python 复制代码
import requests
import re
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np

categories = []
values = []

# 方式2(查看历史日期信息):
for page in range(17, 21):
    # 定义请求的 URL
    url = f"https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=26331385792&date=2024-10-{page}"

    # 添加 User-Agent 头
    headers = {
        'cookie': "你的cookie",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
    }

    # 发送 GET 请求
    response = requests.get(url=url, headers=headers)

    # 提取弹幕内容
    content_list = re.findall('[\u4e00-\u9fa5]+', response.text)

    print(f'2024-10-{page}')

    # 统计弹幕数量
    counter = Counter(content_list)

    # 获取前10名弹幕
    top_10 = counter.most_common(10)

    # 获取弹幕种类数量和总数量
    unique_count = len(counter)
    total_count = sum(counter.values())

    # 打印结果
    print("前10名弹幕及其数量:")
    for text, count in top_10:
        print(f"{text}: {count} 次")

    print(f"弹幕种类数量: {unique_count}")
    print(f"总数量: {total_count}")

    # 写入文件
    with open('file02.txt', mode='a', encoding='utf-8') as f:
        f.write(f'2024-10-{page}\n')
        f.write(f"前10名弹幕及其数量:\n")
        for text, count in top_10:
            f.write(f"{text}: {count} 次\n")
        f.write(f"弹幕种类数量: {unique_count}\n")
        f.write(f"总数量: {total_count}\n\n")

        # 数据

        categories.append(f'2024-10-{page}')
        values.append(total_count)

# 绘制柱状图
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 显示中文标签

# 创建柱状图
bars = plt.bar(categories, values, color='skyblue', width=0.5, alpha=0.7, linewidth=2)

# 在每个柱顶上显示数量
for bar in bars:
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, yval, int(yval), ha='center', va='bottom')

# 添加标题和标签
plt.title('弹幕总数量柱状图')
plt.xlabel('日期')
plt.ylabel('弹幕总数量')
# plt.axhline(0, color='black', linewidth=0.5, ls='--')  # 绘制x轴
# plt.axvline(0, color='black', linewidth=0.5, ls='--')  # 绘制y轴
# plt.grid()  # 添加网格
plt.show()  # 显示图形
  • yval = bar.get_height(): 获取当前柱子的高度,代表该柱的数值

  • plt.text(...): 在图表上添加文本,参数说明:

    • bar.get_x() + bar.get_width()/2: 计算柱子中心的 x 坐标,以便文本居中。

    • yval: y 坐标,文本将放置在柱子的顶端。

    • int(yval): 显示的文本内容,即柱子的高度。

    • ha='center': 水平对齐方式为中心对齐。

    • va='bottom': 垂直对齐方式为底部对齐,使文本位于柱子顶部。


词云图

python 复制代码
import requests
import re
from collections import Counter
import matplotlib.pyplot as plt
from wordcloud import WordCloud

# 初始化数据列表
pages = range(17, 21)
all_counters = []

# 方式2(查看历史日期信息):
for page in pages:
    url = f"https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=26331385792&date=2024-10-{page}"

    headers = {
        'cookie': "你的cokkie",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
    }

    response = requests.get(url=url, headers=headers)
    content_list = re.findall('[\u4e00-\u9fa5]+', response.text)

    # 统计弹幕数量
    counter = Counter(content_list)
    all_counters.append(counter)

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 显示中文标签

# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(10, 5))  # 根据需要调整子图数量和大小
axes = axes.flatten()  # 将子图展平,方便迭代

plt.subplots_adjust(hspace=0.5, wspace=0.3)

# 为每个日期生成词云
for i, counter in enumerate(all_counters):
    # 创建词云
    wordcloud = WordCloud(
        font_path='msyh.ttc',  # 替换为你的字体路径,确保支持中文
        width=500,
        height=300,
        background_color='white',
    ).generate_from_frequencies(counter)

    # 绘制词云
    axes[i].imshow(wordcloud, interpolation='bilinear')
    axes[i].axis('off')  # 不显示坐标轴
    axes[i].set_title(f'2024-10-{pages[i]} 弹幕词云', fontsize=16)  # 设置标题

# 调整布局
plt.tight_layout()
plt.show()
相关推荐
咸鱼桨9 分钟前
《庐山派从入门到...》PWM板载蜂鸣器
人工智能·windows·python·k230·庐山派
yusaisai大鱼24 分钟前
tensorflow_probability与tensorflow版本依赖关系
人工智能·python·tensorflow
Biomamba生信基地28 分钟前
R语言基础| 功效分析
开发语言·python·r语言·医药
CodeClimb43 分钟前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
夜幕龙1 小时前
iDP3复现代码数据预处理全流程(二)——vis_dataset.py
人工智能·python·机器人
晚夜微雨问海棠呀1 小时前
长沙景区数据分析项目实现
开发语言·python·信息可视化
cdut_suye2 小时前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
dundunmm2 小时前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神2 小时前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
一道微光2 小时前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos