Bilibili用户社交网络分析

xRosemary
https://github.com/xRosemary
摘 要:
在信息化时代背景下,社交网络分析在各大社交平台中得到广泛关注。本文试图通过爬取哔哩哔哩网页端的数据,并对其进行社交网络分析,包括网络可视化,网络度的分析以及用户影响力发掘等,从而得到一些分析结论,使读者能够对哔哩哔哩平台的社交网络有一个较为全面的了解。
关键词:
社交网络;爬取;哔哩哔哩;可视化;用户影响力;
xRosemary
https://github.com/xRosemary
Abstract:
In the information age, social network analysis has been widely concerned in various social platforms. This paper attempts to crawl the data of Bilibili's webpage and analyze its social network, including network visualization, network degree analysis and user influence excavation, so as to get some analysis conclusions, so that readers can have a more comprehensive understanding of the social network of Bilibili platform.
Key Words:
Social network; Crawl; BiliBili; Visualization; User influence;

数据集的获取

  本次实践的数据集是通过爬取bilibili网页端的数据获得,其数据在网页端的存储格式如图 1 所示。本节下面会详细介绍如何实现数据的爬取。

image-20220518153117813

图 1 网页数据的格式

数据库设计

​ 在了解数据的具体结构后,本人据此设计了数据库的存储格式。该数据库的ER图如图 2 所示。User_fans表中主要包括三个字段,主键ID,和两个外键mid,fanID。其中mid代表当前用户的ID,fanID代表该用户粉丝的ID。UserData表主要用来存储用户的详情信息,包括姓名、性别、等级、关注者数量以及粉丝数量。User_fans与UserData之间存在着关联关系,也就是说每一个用户都有他的详情信息。

image-20220524222713471

图 2 数据库ER图

爬虫的编写

​ 本文的爬虫功能是基于 python 3.9 实现的,调用了外部库 requests 来获取网络请求,以及 json 库来解析 json 数据。爬取数据的逻辑是一个双向层次遍历,其结构如图 3 所示。由于事先我们无法获得所有用户的ID,所以只能以一个用户作为切入点,遍历其粉丝列表和关注列表,并以此为基础,获取更多用户的信息。

image-20220524224158695

图 3 遍历的结构

获取数据后的初步分析

​ 本次实验中共爬取了 8801 条数据,在做网络分析前作者对其进行了初步的分析,包括性别分布、粉丝数量统计、关注者数量统计以及用户等级统计等。分析可得,性别保密的用户占大多数,其次是男性、女性;用户等级都是最高等级6级;从整体上来看每个用户关注者数量和粉丝数量都较高,但标准差较大。详细结果如图 4-7 所示。

性别比率

图 4 性别比率

follower

图 5 粉丝数散点图

following

图 6 关注者数散点图

level

图 7 用户等级分布

网络结构分析

网络可视化

​ 网络可视化主要基于包 networkx [1] 和 matplotlib 实现。这里使用了有向图来表达关注与被关注关系,每个节点的出度代表被关注关系,入度代表关注关系。为了方便观看,作者将粉丝数量大于150万的核心用户提取出来进行分析,并将用户的ID转化为用户名,最后根据每个节点的度数对节点的大小进行了缩放处理。最终结果如图 8-9 所示。

可视化

图 8 网络可视化

局部图

图 9 网络局部放大图

网络度分布与聚类系数

​ 度分布是指网络中度为k的节点的出现概率,而聚类系数表示一个图中节点聚集程度的系数。本文通过 networkx 包中自带的 degree_histogram 方法和 degree_centrality 方法对这两个指标进行统计。其代码如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 网络度分布
degree=nx.degree_histogram(G)
x=range(len(degree))
y=[z/float(sum(degree))for z in degree] # 将频次转化为频率
plt.title('网络度分布')
plt.scatter(x,y)
plt.show()

# 聚类系数
centrality = nx.degree_centrality(G)
x=range(len(centrality))
y = centrality.values()
plt.title('聚类系数')
plt.scatter(x,y)
plt.show()

​ 代码运行的结果如图 10-11 所示。

度分布

图 10 网络度分布

聚类系数

图 11 网络聚类系数
 从统计结果中可以看出网络的度主要分布在 1-6 附近,但其中的一个节点的度数达到了70以上。从整体上来看满足星型网络的分布情况,即网络通过中心节点将许多点连接而组成。从聚类系数上来看也是,一个节点的聚类系数远远高于其他所有节点,这也验证了前面所述的观点。

网络其他指标

网络的密度

​ 网络密度是网络中实际存在的边数与可容纳的边数上限的比值。本文通过 networkx 中的 density 方法实现。其代码如下所示。

1
2
# 网络的密度
print('图的密度:', nx.density(G))

网络直径

​ 网络直径是指网络中任意两节点间距离的最大值。由于本实验中生成的是有向图,可能存在非连通网络,因此作者现将网络分割成数个连通子网络,然后再进行统计。其代码如下所示。

1
2
3
4
5
6
# 网络直径
G_child=list(G.subgraph(c) for c in nx.connected_components(G))
cnt = 1
for g in G_child:
print('连通子网络%d的直径:' % cnt, nx.diameter(g))
cnt = cnt+1

​ 上述代码的运行结果如图 12 所示。

image-20220524235109574

图 12 网络其他指标

用户影响力发掘

​ 在对本实验中的实证网络进行一系列分析后,作者还对本次爬取到的用户的影响力进行了分析,分别计算出了用户权威性最高的前十位用户,以及用户枢纽性最高的前十位用户。这里作者采用了两种方法进行计算,分别是 PageRank 和 HITS 方法 [2]。其主要代码如下所示,运行结果如图 13 所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# PageRank
pr = nx.pagerank(G)
prsorted = sorted(pr.items(), key=lambda x: x[1], reverse=True)
print('基于pagerank算法的用户影响力前10名\n')
for p in prsorted[:10]:
print(p[0], p[1])
print("----------------------------------------\n")

# HITS
hub, auth = nx.hits(G)
print('基于HITS(hub)算法的用户影响力前10名\n')
for h in sorted(hub.items(), key=lambda x: x[1], reverse=True)[:10]:
print(h[0], h[1])
print("----------------------------------------\n")

print('基于HITS(auth)算法的用户影响力前10名\n')
for a in sorted(auth.items(), key=lambda x: x[1], reverse=True)[:10]:
print(a[0], a[1])

用户影响力

图 13 用户影响力榜单

结语

​ 本文爬取了Bilibili网页端的用户信息,并对该实证网络进行了一系列分析,主要讨论了用户信息分布、网络的结构以及用户的影响力信息。从分析结果可看出该网站用户群体中有一位处于主导地位。由于设备受限,本文只爬取了接近9000条数据,并只筛选出粉丝数大于150万的核心用户进行分析,结果可能与真实分布情况存在一些偏差。不过,该结果也能反映出一些有意义的信息。希望读者通过观看本文,能对Bilibili的用户分布情况有进一步的了解。

参考文献:

[1] 司六米希.【复杂网络】实证网络可视化及其分析 - 含度分布,聚类系数,网络直径,度关联性,权重分析 (性质解析及代码)【python+networkx】[CP].CSDN, [2022-05-20]. https://blog.csdn.net/weixin_50927106/article/details/123921734

[2] nana-li.PageRank算法和HITS算法 [CP].CSDN, [2018-07-27]. https://blog.csdn.net/quiet_girl/article/details/81227904