首页 > 编程语言 >【Python爬虫课程设计】BiliBili UP主数据——绘制数据柱状图和词云

【Python爬虫课程设计】BiliBili UP主数据——绘制数据柱状图和词云

时间:2022-12-22 21:22:07浏览次数:84  
标签:课程设计 Python UP item 柱状图 frequency import 播放 data

一、选题的背景

1.背景:哔哩哔哩(www.bilibili.com,英文名称:bilibili,简称B站)现为中国年轻世代高度聚集的文化社区和视频平台,该网站于2009年6月26日创建。

B站早期是一个ACG(动画、漫画、游戏)内容创作与分享的视频网站。经过十年多的发展,围绕用户、创作者和内容,构建了一个源源不断产生优质内容的生态系统,B站已经涵盖7000多个兴趣圈层的多元文化社区。
哔哩哔哩作为目前国内最大的动画作品平台,已上线了3000多部来自日本、美国以及国内的动画作品,具有大量的播放、点赞、弹幕、评分等数据可供分析。

2.目的:B站近几年的不断增长,涌现出的头部UP主越来越多。作为抢占Z世代的内容营销主阵地,品牌方对B站也愈发重视。

二、主题式网络爬虫设计方案

 1.主题式网络爬虫名称

  【Python爬虫课程设计】bilibili UP主数据分析——绘制数据柱状图和词云

2.主题式网络爬虫爬取的内容与数据特征分析

爬取相关up数据,包含UP主号,投稿视频数,投币数,弹幕数,最高点赞数,播放数,涨粉数新榜指数。并通过数据可视化表现出来。

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

        实现思路:  1. 数据采集。具体来源于

                    https://www.newrank.cn/nr/bili/rank/complexMainRank

            2. 进行数据的清洗,对需要的数据进行定位和提取,并进行存取。

        3. 传入数据,绘制词云和进一步数据可视化。

、主题页面的结构特征分析

    1.寻找所需的数据。登录网站,右键网络源代码。

2.数据清洗

   对所需的库进行导入:

import datetime
import json
import time

import pandas as pd
import requests
from lxml import etree
import openpyxl
from matplotlib import pyplot as plt
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
from pyecharts import options as opts
import shelve  # 引入shelve做数据持久化

import seaborn as sns
from wordcloud import WordCloud

爬虫主要代码

data = {}
data["numeric"] = "生活"
data["rankDate"] = "2022-12-15"
data["start"] = 1
data["size"] = 50
data["rankType"] = "0"
data["type"] = "0"

url = "https://www.newrank.cn/nr/bili/rank/complexMainRank"
today = datetime.datetime.now()

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "UP数据"
ws.append(["UP主号", "投稿视频数", "投币数", "弹幕数", "最高点赞数", "播放数", "涨粉数", "新榜指数"])
# 获取近三百天的数据
for i in range(300):
    data["rankDate"] = str((today + datetime.timedelta(days=-i)).date())
    res = requests.post(url, json=data)
    res_str = res.content.decode("utf-8").replace('\\x', '%')
    res_data = json.loads(res_str)
    local_data = res_data['data']['vos']
    for item in local_data:
        if 'w' in item["followerDiff"]:
            item["followerDiff"] = item["followerDiff"].replace('w', '')
            item["followerDiff"] = str(float(item["followerDiff"]) * 10000)
        if 'w' in item["opusCount"]:
            item["opusCount"] = item["opusCount"].replace('w', '')
            item["opusCount"] = str(float(item["opusCount"]) * 10000)
        if 'w' in item["coinCount"]:
            item["coinCount"] = item["coinCount"].replace('w', '')
            item["coinCount"] = str(float(item["coinCount"]) * 10000)
        if 'w' in item["videoReviewCount"]:
            item["videoReviewCount"] = item["videoReviewCount"].replace('w', '')
            item["videoReviewCount"] = str(float(item["videoReviewCount"]) * 10000)
        if 'w' in item["likeCount"]:
            item["likeCount"] = item["likeCount"].replace('w', '')
            item["likeCount"] = str(float(item["likeCount"]) * 10000)
        if 'w' in item["playCount"]:
            item["playCount"] = item["playCount"].replace('w', '')
            item["playCount"] = str(float(item["playCount"]) * 10000)

        temp = [item["name"], item["opusCount"], item["coinCount"], item["videoReviewCount"], item["likeCount"],
                item["playCount"], item["followerDiff"], item["newrankIndex"]]
        ws.append(temp)

wb.save('data.xlsx')

运行后:

打开文件: bilibilidata数据表格

 

绘制wordcloud

wb = openpyxl.load_workbook('data.xlsx')
ws = wb.active


def create_cloud(frequency, name):
    wordcloud = WordCloud(font_path="C:/Windows/Fonts/simsun.ttc",
                          background_color="white",
                          width=2021, height=1080)
    wordcloud.generate_from_frequencies(frequency)
    wordcloud.to_file('%s.png' % name)


frequency_follower = {}
frequency_movie = {}


for row in ws.values:
    if row[0] == "UP主号":
        pass
    else:
        if row[0] not in frequency_follower:
            frequency_follower[row[0]] = 0
        frequency_follower[row[0]] += float(row[6])
        if row[0] not in frequency_movie:
            frequency_movie[row[0]] = 0
        frequency_movie[row[0]] += float(row[1])

create_cloud(frequency_follower, "近300天up主涨粉数情况词云图")
create_cloud(frequency_movie, "近300天up主发视频数情况词云图")

 

生成词云png格式图片

 

 

UP主发视频情况和涨粉词云

 

 

 

 

3. 数据可视化 

df = db = shelve.open("store")
df = db.get("data")
group_show = df.groupby('UP主号')[['播放数']].sum().reset_index()
group_review = df.groupby('UP主号')[['最高点赞数']].sum().reset_index()
up = group_show['UP主号'].values.tolist()
show = group_show['播放数'].values.tolist()
review = group_review['最高点赞数'].values.tolist()
bar1 = (
    Bar({"theme": ThemeType.MACARONS, "width": "1600px", "height": "720px"})
    .add_xaxis(up)
    .add_yaxis("播放数", show)

    .set_global_opts(
        title_opts={"text": "播放数"}
    )
    # 生成html文件
    .render("UP播放数.html")
)

bar2 = (
    Bar({"theme": ThemeType.MACARONS, "width": "1600px", "height": "720px"})
    .add_xaxis(up)
    .add_yaxis("点赞数", review, stack="stack1", category_gap="50%")
    .add_yaxis("播放数", show, stack="stack1", category_gap="50%")
    # 生成文件
    .set_global_opts(
        title_opts={"text": "播放数与点赞数对比"}
    )
    .render("播放数与点赞数对比.html")
)

bar3 = (
    Bar({"theme": ThemeType.MACARONS, "width": "1600px", "height": "720px"})
    .add_xaxis(up[:50])
    .add_yaxis("点赞数", review[:50], stack="stack1", category_gap="50%")
    .add_yaxis("播放数", show[:50], stack="stack1", category_gap="50%")

    # 生成文件
    .set_global_opts(
        title_opts={"text": "播放数与点赞数对比"}
    )
    .render("播放数与点赞数对比(前50条).html")
)

播放数与点赞数可视化对比(前50条)

 

 

播放数与点赞数可视化对比

 

播放数可视化

 

最高点赞数与投币数的关系

 

四、附完整程序源代码

import datetime
import json
import time

import pandas as pd
import requests
from lxml import etree
import openpyxl
from matplotlib import pyplot as plt
from pyecharts.charts import Bar
from pyecharts.globals import ThemeType
from pyecharts import options as opts
import shelve  # 引入shelve做数据持久化

import seaborn as sns
from wordcloud import WordCloud

# 获得B站每天排行前50的UP数据
data = {}
data["numeric"] = "生活"
data["rankDate"] = "2022-12-15"
data["start"] = 1
data["size"] = 50
data["rankType"] = "0"
data["type"] = "0"

url = "https://www.newrank.cn/nr/bili/rank/complexMainRank"
today = datetime.datetime.now()

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "UP数据"
ws.append(["UP主号", "投稿视频数", "投币数", "弹幕数", "最高点赞数", "播放数", "涨粉数", "新榜指数"])
# 获取近三百天的数据
for i in range(300):
    data["rankDate"] = str((today + datetime.timedelta(days=-i)).date())
    res = requests.post(url, json=data)
    res_str = res.content.decode("utf-8").replace('\\x', '%')
    res_data = json.loads(res_str)
    local_data = res_data['data']['vos']
    for item in local_data:
        if 'w' in item["followerDiff"]:
            item["followerDiff"] = item["followerDiff"].replace('w', '')
            item["followerDiff"] = str(float(item["followerDiff"]) * 10000)
        if 'w' in item["opusCount"]:
            item["opusCount"] = item["opusCount"].replace('w', '')
            item["opusCount"] = str(float(item["opusCount"]) * 10000)
        if 'w' in item["coinCount"]:
            item["coinCount"] = item["coinCount"].replace('w', '')
            item["coinCount"] = str(float(item["coinCount"]) * 10000)
        if 'w' in item["videoReviewCount"]:
            item["videoReviewCount"] = item["videoReviewCount"].replace('w', '')
            item["videoReviewCount"] = str(float(item["videoReviewCount"]) * 10000)
        if 'w' in item["likeCount"]:
            item["likeCount"] = item["likeCount"].replace('w', '')
            item["likeCount"] = str(float(item["likeCount"]) * 10000)
        if 'w' in item["playCount"]:
            item["playCount"] = item["playCount"].replace('w', '')
            item["playCount"] = str(float(item["playCount"]) * 10000)

        temp = [item["name"], item["opusCount"], item["coinCount"], item["videoReviewCount"], item["likeCount"],
                item["playCount"], item["followerDiff"], item["newrankIndex"]]
        ws.append(temp)

wb.save('data.xlsx')

# 持久化
data = pd.read_excel('data.xlsx')
db = shelve.open('store')
db['data'] = data
db.close()

# 词云

wb = openpyxl.load_workbook('data.xlsx')
ws = wb.active


def create_cloud(frequency, name):
    wordcloud = WordCloud(font_path="C:/Windows/Fonts/simsun.ttc",
                          background_color="white",
                          width=2021, height=1080)
    wordcloud.generate_from_frequencies(frequency)
    wordcloud.to_file('%s.png' % name)


frequency_follower = {}
frequency_movie = {}


for row in ws.values:
    if row[0] == "UP主号":
        pass
    else:
        if row[0] not in frequency_follower:
            frequency_follower[row[0]] = 0
        frequency_follower[row[0]] += float(row[6])
        if row[0] not in frequency_movie:
            frequency_movie[row[0]] = 0
        frequency_movie[row[0]] += float(row[1])

create_cloud(frequency_follower, "近300天up主涨粉数情况词云图")
create_cloud(frequency_movie, "近300天up主发视频数情况词云图")


# 生成柱状图

df = db = shelve.open("store")
df = db.get("data")
group_show = df.groupby('UP主号')[['播放数']].sum().reset_index()
group_review = df.groupby('UP主号')[['最高点赞数']].sum().reset_index()
up = group_show['UP主号'].values.tolist()
show = group_show['播放数'].values.tolist()
review = group_review['最高点赞数'].values.tolist()
bar1 = (
    Bar({"theme": ThemeType.MACARONS, "width": "1600px", "height": "720px"})
    .add_xaxis(up)
    .add_yaxis("播放数", show)

    .set_global_opts(
        title_opts={"text": "播放数"}
    )
    # 生成html文件
    .render("UP播放数.html")
)

bar2 = (
    Bar({"theme": ThemeType.MACARONS, "width": "1600px", "height": "720px"})
    .add_xaxis(up)
    .add_yaxis("点赞数", review, stack="stack1", category_gap="50%")
    .add_yaxis("播放数", show, stack="stack1", category_gap="50%")
    # 生成文件
    .set_global_opts(
        title_opts={"text": "播放数与点赞数对比"}
    )
    .render("播放数与点赞数对比.html")
)

bar3 = (
    Bar({"theme": ThemeType.MACARONS, "width": "1600px", "height": "720px"})
    .add_xaxis(up[:50])
    .add_yaxis("点赞数", review[:50], stack="stack1", category_gap="50%")
    .add_yaxis("播放数", show[:50], stack="stack1", category_gap="50%")

    # 生成文件
    .set_global_opts(
        title_opts={"text": "播放数与点赞数对比"}
    )
    .render("播放数与点赞数对比(前50条).html")
)

# 线性回归图
db = shelve.open("store")

plt_data = db.get("data")
plt_data.head()

sns.set()

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.grid()

sns.lmplot(x='最高点赞数', y='投币数', data=plt_data)
plt.savefig("最高点赞数与投币数的关系.png", dpi=300)

 

五、总结

  1.总结

         通过本次的课程设计学习,我们可以清晰的了解到bilibili博主的播放数、点赞数、投币数和涨粉数之间的关系。

       2.目标

   已经达到我预期的目标。通过对爬取的数据进行数据可视化分析,可以较便捷得看出up博主视频的情况。

  3.自我建议

  (1)加强自身独立自主的能力,提高编程技能。在本次课程设计中,询问了室友许多的内容。自己在编程上的功底薄弱,有待加强。

  (2)多逛csdn等编程学习平台,扎实自身,并打开视野。

 

 

标签:课程设计,Python,UP,item,柱状图,frequency,import,播放,data
From: https://www.cnblogs.com/0xMike/p/16999471.html

相关文章

  • Python安装
    1、安装包:https://pan.baidu.com/s/1Y5J_9-RNCpIJK9GfeoJhNA2、下载完成后双击执行下载的exe程序,进入安装界面。安装界面可以选择默认安装,也可以自定义安装,我比较喜欢自定义......
  • Python|文件处理与数据库编程
    某农带专业Python课实验三txt文件处理题目描述:编程新建一个名为test.txt文件,存放在代码文件所在目录中,并且打开该文件。然后写入如图1-1所示内容到文件中。最后分别读......
  • 【Python】羊毛获取小工具
    前言最近沉迷薅羊毛,然后想第一时间得到新的消息。不过说实话第一时间是不存在的,除非跟商家直接对接。于是乎只能靠微博啊,企鹅群等,看别人发的新信息了。那么做一个简单......
  • python mac docx格式转pdf
    1.翻了很多资料发现大多是Windows的库偏多,并且不支持linux,还需要借助word软件,方案是首先docx转html再转pdf代码:frompydocximportPyDocXfromxhtml2pdfimportp......
  • 【python爬虫课程设计】2022-23赛季欧洲冠军联赛——绘制球员数据柱状图和词云
    一、选题的背景1.背景:2022-23赛季欧洲冠军联赛(2022–23UEFAChampionsLeague)由欧洲足球联合会主办的第68届欧洲足球俱乐部的顶级赛事,也是以欧洲冠军联赛名义下的第31届......
  • python爬虫-美团海底捞评论及评分数据爬取和分析
    美团海底捞评论及评分数据爬取和分析一、选题背景  通过网络请求的方式获取响应数据,再对获取的数据进行分析提取和汇总,并储存到xlsx表格中。在进入互联网存储海量数据......
  • centos安装python3
    1:使用CentOS自带的包管理器yum安装新版本的Python。例如,你可以使用以下命令安装最新的Python3版本:sudoyumupdatesudoyuminstallpython32:使用SCL库安......
  • python 数组字典转换
    将提交的数组字段一个字典 [ { "name":"name1", "age":"1", }, { "name":"name2", "age":"2", } ]#变成{ "name":"name1,name2",......
  • python字典转为对象,用"."方式访问对象属性
    python字典转为对象,用"."方式访问对象属性 params={"name":"login","params":{"transaction_id":"cc258bdb3dd4d6bba2","platformTy......
  • 用python写一个获取git log也就是changeLog的小工具
    一、前提:每次发版后,都是人工去整理gitlog进行发版说明,结合项目需要,决定写个小工具获取gitlog,主要实现的功能点有以下几点:1、获取gitcommit时的记录。2、在commit中......