基于 Python 的 Bilibili 评论分析与可视化

一、项目概述

本项目利用 Python 对 Bilibili (哔哩哔哩)平台上的视频评论数据进行爬取、清洗和分析,并通过可视化展示数据的主要特征。我们通过以下几个步骤实现了这一过程:

  1. 数据爬取:使用 Bilibili 提供的 API 获取指定视频的评论数据。
  2. 数据清洗:对评论内容进行文本预处理,清除无关信息,并对 IP 地址进行地区解析。
  3. 数据分析:对评论内容、点赞数等信息进行统计分析,挖掘出有意义的趋势。
  4. 数据可视化:使用 pyecharts 库生成词云图、柱状图、折线图等多种图表,展示评论的分布与趋势。

本文将详细介绍每一步的实现过程,以及如何利用 Python 工具处理和分析海量的网络评论数据。

二、数据爬取

首先,我们使用 Bilibili 提供的 API 接口来获取视频的评论数据。Bilibili 的 API 支持根据视频 ID(oid)、页码(pn)等参数获取评论信息。我们通过构造请求 URL 发送 HTTP 请求来抓取数据。

以下是爬虫代码的核心部分:

import requests
import csv
import time
import random
from tqdm import tqdm

# 设置请求头
header = {
    "Cookie": "你的 Cookie 值",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

# 视频 ID 列表
list_id = [898762590]

# 数据爬取过程
for i in tqdm(list_id):
    rows = []
    for p in tqdm(range(342, 801)):
        try:
            html = requests.get(url, headers=header)
            data = html.json()
            # 提取评论数据
            for reply in data['data']['replies']:
                username = reply['member']['uname']
                comment = reply['content']['message']
                ctime = trans_date(reply['ctime'])


        # 保存数据到 CSV
        with open(f'bilibili_comments_{i}.csv', 'a', newline='', encoding='utf-8') as file:
            writer = csv.writer(file)
            if file.tell() == 0:
                writer.writerow(['Username', 'Comment', 'Timestamp', 'Like Count', 'IP Location'])
            writer.writerows(rows)

在此代码中,我们指定了视频的 ID 和页码范围(342801),并通过循环逐页爬取评论。每一条评论数据包括用户名、评论内容、时间戳、点赞数和 IP 地址。

三、数据清洗

数据爬取完成后,我们对获取的评论数据进行清洗。主要的清洗任务包括:

  1. 去除无关内容:移除 URL、标点符号、特殊字符等。
  2. 分词与停用词过滤:使用 jieba 对中文评论进行分词,并过滤掉无意义的停用词。
  3. IP 地址地区解析:对 IP 地址中的地理位置进行解析,将其统一成省份、市区等格式。
  4. 时间格式转换:将评论时间戳转换为标准的时间格式,便于后续的时间序列分析。

数据清洗的核心代码如下:

import re
import jieba
from zhon.hanzi import punctuation as zh_punctuation

def clean_text(text):
    # 去除 URL 和特殊字符
    text = re.sub(r'http\S+', '', text)
    text = re.sub(f"[{zh_punctuation}]", "", text)  # 去除中文标点
    text = re.sub(r'[.,!?]', '', text)  # 去除英文标点
    text = re.sub(r'[^a-zA-Z0-9\u4e00-\u9fa5\s]', '', text)  # 保留字母、数字和中文
    text = ' '.join(text.split())  # 去除多余的空格
    return text

# 停用词处理
def load_stopwords(filepath):
    with open(filepath, 'r', encoding='gbk') as f:
        stopwords = f.read().splitlines()
    return stopwords

# 文本预处理
def preprocess_text(text, stopwords):
    words = jieba.cut(text)
    return [word for word in words if word not in stopwords and len(word) > 1]

df['Comment'] = df['Comment'].apply(clean_text)
stopwords = load_stopwords('./stop_word.txt')
df['Cleaned_Comment'] = df['Comment'].apply(lambda x: preprocess_text(x, stopwords))
四、数据分析与可视化

1. 准备工作

在开始之前,确保你已经安装了所需的 Python 库,并且有一个包含 Bilibili 评论数据的 CSV 文件。我们将使用以下库:

  • pandas:用于数据处理和分析。
  • pyecharts:用于生成图表和大屏展示。
  • 首先安装这些库:

    pip install pandas pyecharts
    

    2. 数据准备

    假设我们已经获取到 Bilibili 的评论数据,并将其保存为 data2.csv。数据的主要字段包括:

  • Timestamp:评论的时间戳。
  • Cleaned_Comment:清洗后的评论内容,存储为 Python 列表格式。
  • Like Count:评论的点赞数。
  • IP Location:评论者的 IP 地址(用于分析地理分布)。
  • 数据格式如下所示:

    Timestamp Cleaned_Comment Like Count IP Location
    2022-01-01 12:00:00 [‘word1’, ‘word2’, ‘word3’] 5 北京市
    2022-01-01 12:05:00 [‘word4’, ‘word5’, ‘word2’] 10 上海市

    3. 数据处理与分析

    3.1 处理评论文本与词频分析

    为了从评论中提取出有用的信息,我们将清洗后的评论文本展开,并统计每个词语的出现频率,以便生成词云和柱状图。

    import pandas as pd
    from collections import Counter
    
    # 读取 CSV 文件
    df = pd.read_csv('data2.csv')
    
    # 将 Cleaned_Comment 列转换为 Python 列表
    df['Cleaned_Comment'] = df['Cleaned_Comment'].apply(eval)
    
    # 展平所有评论词语
    all_words = [word for comment in df['Cleaned_Comment'] for word in comment]
    
    # 统计词频
    word_counts = Counter(all_words)
    
    # 转换为词云输入格式
    wordcloud_data = [(word, count) for word, count in word_counts.items()]
    
    3.2 时间处理与按时间间隔统计

    我们将时间戳转换为 datetime 格式,并按天或按15天的时间间隔统计评论数量和点赞数的变化。

    # 转换时间戳为 datetime 格式
    df['Timestamp'] = pd.to_datetime(df['Timestamp'])
    
    # 筛选出2022年数据
    df_2022 = df[(df['Timestamp'] >= '2022-01-01') & (df['Timestamp'] < '2023-01-01')]
    
    # 按15天的时间间隔统计评论数量
    comment_count_by_15days = df_2022.resample('15D', on='Timestamp').size().reset_index(name='Comment Count')
    x_data_comment = comment_count_by_15days['Timestamp'].dt.strftime('%Y-%m-%d').tolist()
    y_data_comment = comment_count_by_15days['Comment Count'].tolist()
    
    # 按15天的时间间隔统计点赞数量
    like_count_by_15days = df_2022.resample('15D', on='Timestamp').sum().reset_index()
    x_data_like = like_count_by_15days['Timestamp'].dt.strftime('%Y-%m-%d').tolist()
    y_data_like = like_count_by_15days['Like Count'].tolist()
    
    3.3 统计 IP 地理分布

    我们还可以统计评论的 IP 地址分布,了解用户的地理位置。

    # 统计各省份的 IP 地址数量
    province_ip_count = df['IP Location'].value_counts().reset_index()
    province_ip_count.columns = ['province', 'ip_count']
    

    4. 使用 pyecharts 创建图表

    接下来,我们将使用 pyecharts 库来生成各种类型的图表,包括词云图、柱状图、折线图和地图。

    4.1 生成词云图

    词云图展示了评论中最常出现的词语,直观地呈现了评论内容的主要话题。

    from pyecharts.charts import WordCloud
    from pyecharts import options as opts
    
    wordcloud = WordCloud(init_opts=opts.InitOpts(width="800px", height="600px"))
    wordcloud.add("", wordcloud_data, word_size_range=[20, 100])
    wordcloud.set_global_opts(title_opts=opts.TitleOpts(title="评论词云图"))
    wordcloud.render("wordcloud.html")
    
    4.2 生成评论和点赞量变化折线图

    折线图可以帮助我们观察评论和点赞数量的时间变化趋势。

    from pyecharts.charts import Line
    
    line_comment = (
        Line()
        .add_xaxis(x_data_comment)
        .add_yaxis("2022年评论量每15天变化", y_data_comment)
        .set_global_opts(title_opts=opts.TitleOpts(title="2022年评论量变化"))
    )
    
    line_like = (
        Line()
        .add_xaxis(x_data_like)
        .add_yaxis("2022年点赞量每15天变化", y_data_like)
        .set_global_opts(title_opts=opts.TitleOpts(title="2022年点赞量变化"))
    )
    
    line_comment.render("comment_change.html")
    line_like.render("like_change.html")
    
    4.3 生成地理分布地图

    我们使用地图展示 IP 地址的地理分布,了解用户的分布情况。

    from pyecharts.charts import Map
    
    map_chart = (
        Map()
        .add("IP 数量", [list(z) for z in zip(province_ip_count['province'], province_ip_count['ip_count'])], "china")
        .set_global_opts(title_opts=opts.TitleOpts(title="IP 地址分布"))
    )
    map_chart.render("ip_location_map.html")
    
    4.4 创建时间轮播图

    时间轮播图可以展示不同年份和月份的评论和点赞数据。通过设置 pyecharts 中的 Timeline,可以制作动态展示的效果。

    from pyecharts.charts import Timeline, Bar
    
    timeline = Timeline()
    
    for year in df['Year'].unique():
        df_year = df[df['Year'] == year]
        bar = (
            Bar()
            .add_xaxis(df_year['Month'].astype(str).tolist())
            .add_yaxis("每月评论数", df_year['Comment Count'].tolist())
            .set_global_opts(title_opts=opts.TitleOpts(title=f"{year}年每月评论数"))
        )
        timeline.add(bar, f"{year}年")
    
    timeline.render("timeline.html")
    

    5. 构建大屏展示

    最后,我们将这些图表整合到一个交互式的大屏页面中。通过 pyechartsPage 类,可以将多个图表组合到一个页面,生成一个动态大屏。

    from pyecharts.components import Table
    from pyecharts.charts import Page
    
    # 创建表格
    table = Table()
    headers = ["基于 Python 的 Bilibili 评论分析大屏"]
    rows = []
    table.add(headers=headers, rows=rows)
    
    # 创建页面
    page = Page(layout=Page.DraggablePageLayout)
    
    page.add(
        table,
        wordcloud,
        line_comment,
        line_like,
        map_chart,
        timeline
    )
    
    # 渲染大屏页面
    page.render("bilibili_comment_analysis.html")
    print("大屏生成完毕:bilibili_comment_analysis.html")
    

    6. 结果展示

    执行完上述代码后,你将得到一个包含以下内容的交互式大屏:

  • 评论词云图:展示评论中最常见的词汇。
  • 时间折线图:展示评论和点赞数的时间变化。
  • 地理分布图:展示评论者的地理位置分布。
  • 时间轮播图:展示不同年份和月份的评论和点赞数据。
  • 五、总结

    本项目展示了如何利用 Python 从 Bilibili 获取评论数据,经过清洗和处理后,通过多种图表形式展示数据分析结果。通过对评论内容和点赞数的分析,我们可以揭示视频的互动情况,了解用户的情感倾向与话题趋势。数据可视化部分使得这些分析结果更加直观、易懂。

    对于未来的改进,我们可以进一步优化爬虫性能,增加对评论的情感分析,或者将数据存储到数据库中进行更加复杂的查询与分析。

    六、参考资料
  • Bilibili API文档: Bilibili Open API
  • pandas 官方文档:https://pandas.pydata.org
  • jieba 官方文档:https://github.com/fxsjy/jieba
  • pyecharts 官方文档:https://pyecharts.org
  • 希望通过这篇博客,大家能对如何通过 Python 进行 Bilibili 评论数据分析和可视化有一个清晰的了解,也希望能启发大家在实际项目中应用这些技术。

    源代码添加

    作者:晒足以百八十

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于 Python 的 Bilibili 评论分析与可视化

    发表回复