爱学it学无止境

在互联网时代,用户生成内容(UGC)成为了研究社交行为和文化趋势的重要数据来源。B站(哔哩哔哩)作为一个主要的弹幕视频分享平台,聚集了大量的用户评论和互动数据。弹幕作为一种实时的用户反馈形式,具有即时性和高互动性的特点,为数据分析提供了丰富的素材。本项目旨在通过爬取B站上一个关于萝卜快跑无人驾驶汽车的视频弹幕数据,进行数据分析,挖掘用户的评论内容和行为模式。

二、项目目标

  1. 弹幕数据爬取:使用Python编写爬虫程序,从指定视频中获取用户发布的弹幕数据。
  2. 数据清洗与预处理:对爬取到的弹幕数据进行清洗和预处理,去除无效信息。
  3. 数据分析:对弹幕数据进行词频统计、情感分析等,揭示用户的评论热点和情感倾向。
  4. 结果可视化:通过词云图和情感分布图等可视化手段展示分析结果。

三、项目文件

本项目包括以下主要文件:

  • danmu_crawler.py: 爬取弹幕数据的Python脚本。
  • data_cleaning.py: 数据清洗与预处理脚本。
  • word_frequency.py: 分词和词频统计脚本。
  • wordcloud.py: 生成词云图的脚本。
  • sentiment_analysis.py: 进行情感分析的脚本。
  • sentiment_distribution.py: 生成情感分布图的脚本。

四、使用说明

环境配置

pip install requests pandas jieba snownlp pyecharts
  • 1.


  • 确保安装了Python 3.x版本。
  • 安装必要的依赖库:requestspandasjiebasnownlppyecharts

五、技术细节

(一)弹幕爬取

1. 源码

运行 danmu_crawler.py 脚本,根据提示输入视频的oid、开始时间、结束时间和Cookie信息,爬取指定时间范围内的视频弹幕数据并保存到本地文本文件。(如何找到视频oid和cookie将放在文末)

import re
import requests
import pandas as pd
import time
from tqdm import trange

HEADERS_TEMPLATE = {
    "origin": "https://www.bilibili.com",
    "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36"
}

# 获取弹幕URL的函数
def get_danmu_urls(oid, start, end):
    """
    获取指定日期范围内的弹幕URL列表

    oid: 视频的唯一标识符
    start: 开始日期
    end: 结束日期
    return: 弹幕URL列表
    """
    date_list = pd.date_range(start, end).strftime('%Y-%m-%d').tolist()
    url_list = [
        f"https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid={oid}&date={date}"
        for date in date_list
    ]
    return url_list

# 解析弹幕文件的函数
def parse_so_file(filepath):
    """
    解析 .so 文件并提取弹幕内容

    filepath: .so文件路径
    return: 弹幕内容列表
    """
    with open(filepath, 'rb') as file:
        data = file.read()
    text = data.decode('utf-8', errors='ignore')
    danmu_list = re.findall(r':(.*?)@', text)  # 利用正则表达式提取so文件的弹幕内容
    return danmu_list

# 下载并解析弹幕的函数
def download_and_parse_danmu(url_list, headers):
    """
    下载弹幕文件并解析为文本

    url_list: 弹幕文件URL列表
    headers: HTTP请求头
    return: 所有弹幕内容的列表
    """
    danmakus = []
    for i in trange(len(url_list)):  # 显示进度条
        url = url_list[i]
        response = requests.get(url, headers=headers)
        so_filepath = f"danmu_{i}.so"
        with open(so_filepath, 'wb') as so_file:
            so_file.write(response.content)
        danmu_list = parse_so_file(so_filepath)
        danmakus.extend(danmu_list)
        time.sleep(2)
    return danmakus

# 保存弹幕到文本文件的函数
def save_danmu_to_file(danmakus, filename):
    """
    将弹幕内容保存到本地文本文件

    danmakus: 弹幕内容列表
    filename: 保存文件的名称
    """
    with open(f"{filename}.txt", 'w', encoding='utf-8') as file:
        for danmu in danmakus:
            file.write(danmu + '\n')
    print(f"{filename}.txt 已生成")

# 主函数
def main():
    print("=" * 30)
    print("请先按照本项目最后cookie及oid获取方式获取你的cookie和对应视频oid")
    print("=" * 30)
    print("请按照下面提示输入需要爬取的弹幕时间,建议不要超过最近两个月")
    print("=" * 30)

    start = input("请输入弹幕开始时间,格式年-月-日,例2020-09-01:")
    end = input("请输入弹幕结束时间,格式年-月-日,例2020-09-20:")
    cookie = input("请输入你的Cookie:")
    oid = input("请输入对应视频oid:")
    name = input("请输入保存文件名称:")

    headers = HEADERS_TEMPLATE.copy()
    headers["cookie"] = cookie
    headers["referer"] = f"https://www.bilibili.com/video/BV19z421q7GM/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=5ec0bdf3923f0e72967dd9c6650e7943&oid={oid}"

    print("========正在爬取弹幕=========")
    url_list = get_danmu_urls(oid, start, end)
    danmakus = download_and_parse_danmu(url_list, headers)

    print("========正在保存弹幕文本文件========")
    save_danmu_to_file(danmakus, name)

if __name__ == "__main__":
    main()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.


2. 运行结果

我这里爬取弹幕的时间区间是2024/7/13-2024/7/21,所以最后输出了九个原始的so文件,通过对so文件进行分析并利用正则表达式提取九个文件中的弹幕内容到一个txt文件中。