手把手教你用Python网络爬虫获取B站UP主10万条数据并用Pandas库进行趣味数据分析

2021年8月21日 304点热度 0人点赞 0条评论

图片

来自:CSDN
作者:小小明  
链接:https://blog.csdn.net/as604049322/article/details/119708737
说明:文章已经过作者授权转载

前几天一位好朋友入了B站,问我如何才能成为一名百万粉丝的up主。于是我做了一些分析,知道了成为百万粉丝up主的一些小秘密。还做了一个百万粉丝昵称生成器,给昵称起名提供建议。

这是她的b站视频截图:

图片

关于昵称起名我的想法是把B站这些百万粉丝大佬的昵称分析一下成分构成,根据相关性随机起个名,是不是就有百万粉丝up主昵称的那味了?

在本文发布后的当天,up主已经更新了一个非常炫酷视频:
如何成为拥有百万粉丝UP主?惊现UP主昵称生成器?
链接:https://www.bilibili.com/video/BV1Z64y1Y72m

个人看了这个视频后,对质量表示非常震撼,一看就具有成为百万粉丝up主的潜力,现在关注就是老粉,我先赶紧关注了。

首先我们开始爬取数据:

B站up主信息爬取

直接通过b站首页去爬是很不方便的,这里我找到了两个第三方的提供b站数据的网站,分别是

火烧云数据:https://www.hsydata.com/search/upRank

小小数据:https://xxkol.cn/kol

在登录后,我们只需复制对应的获取数据接口的信息:

图片

然后就使用我个人开发的转换工具可以很方便的获取爬虫代码,详见:

https://pypi.org/project/filestools/

通过以下命令安装后即可直接使用:

pip install filestools -U

然后打开命令行执行如下命令:

curl2py
图片

此时爬虫代码就已经存在于我们的剪切版中,然后就可以直接粘贴到代码编辑窗口了。

如果有不喜欢使用命令行的小伙伴,还可以将上面复制到的curl命令粘贴替换下面的xxx:

from curl2py.curlParseTool import curlCmdGenPyScript

curl_cmd = """xxx"""
output = curlCmdGenPyScript(curl_cmd)
print(output)

替换xxx为游览器复制的内容后,运行上面的代码就可以直接得到能够爬取该网站数据的代码拉。

稍稍改改,使用pandas解析一下,立马就获取到需要的数据:

图片

然后将上面的代码改成循环,加个每次1-8秒的随机延迟,很快就爬完了10万条数据。

数据保存代码采用:

import os

file = "b站up主粉丝量top10万.csv"
df.to_csv(file, index=False, mode='a',
              header=not os.path.exists(file), encoding="u8")

数据分析

数据读取与预处理

下面我们读取并简单分析一下:

import pandas as pd

names = ["名称""性别""签名""视频数量","粉丝数",
         "播放数""点赞数""总充电人数""月充电人数",
         "生日""category1""category2""tags"]
df = pd.read_csv("b站up主粉丝量top10万.csv", usecols=[
                 235]+list(range(916))+[222324], header=0, names=names, low_memory=False)
df.drop_duplicates(inplace=True)
df.sort_values("粉丝数", ascending=False, inplace=True)
df
图片

总共读取了10万条数据。

个人觉得B站官方自己的号就没有分析的必要直接剔除:

df = df[~df.名称.str.contains('哔哩哔哩')]
df.shape[0]
99955

剔除了45个名字含有哔哩哔哩的昵称。

然后剔除粉丝量少于1万的:

df = df.query("粉丝数>=10000")
df.shape[0]
59287

说明b站粉丝过万的up主有5.9万名。

为了后面编码方便,我们将粉丝数转换为以万为单位:

df.粉丝数 //= 10000

不确定各级别的万粉up主的特征是否有区别,这里我对粉丝数做一个简单的分级:

df["粉丝数范围"] = pd.cut(df.粉丝数, 
                bins=[110501002000],
                labels=["万粉""百万前期","百万后期""百万粉"], 
                right=False)

将最大值设置为2000,是因为有两个粉丝量达到千万的非官方up主,但最大值不会超过2000万。这两人分别是罗翔说刑法和老番茄,个人不太理解做游戏解说的为啥粉丝量能达到千万,是因为B站大佬用户群体喜欢看游戏解说吗?哈哈。

那么我们首先分析:

做什么类别的up主更多一些?

对于这些粉丝量过万的up们,他们的领域是哪些呢?

df.category1.value_counts()
生活     14948
游戏 11996
知识 5651
动画 5073
时尚 4209
音乐 4088
影视 2971
娱乐 2924
舞蹈 1650
美食 1638
数码 1281
鬼畜 783
科技 758
国创 477
纪录片 215
番剧 196
资讯 148
动物圈 127
知识区 24
电视剧 11
电影 11
汽车 8
运动 4
Name: category1, dtype: int64

可以看到生活和游戏类别的万粉up主是最多的。

不同粉丝量级别的up主是否存在差异?

t = pd.crosstab(df.category1, df.粉丝数范围)
t.style.background_gradient("Reds", axis=0)
图片

根据颜色可以看到依然是生活和游戏类别的up主的最多,动画和知识的up主也不少,说明B站也有很多爱学习的好童鞋。

性别差异是否会影响成为万粉up的概率?

先看总体:

df.性别.value_counts()
保密    65900
男 20452
女 13648
Name: 性别, dtype: int64

本以为女性应该更容易成为b站高粉u主,但从整体结果来看,男生人数比女生多了近50%,男生似乎更容易成为b站高粉u主。

但也可能是女生更倾向于选择保密,导致男生看起来显著比女生多,实际比例是差不多的。

引入粉丝量范围维度拆分后进一步分析:

t = pd.crosstab(df.粉丝数范围, df.性别)
t = t.eval("男女比=男/女")
t.style.background_gradient("Reds", axis=1)
图片

从结果上来,随着up主级别的提高,男女比逐渐提高。

这种现象说明,女生更倾向于选择保密的假设基本可以排除。**对于整体来说,男生更能够驾驭更多的粉丝,更容易成为百万粉丝up主。**女生虽然有些优势,但总体来说还是比男生稍微逊色一点。

当然还可以继续假设,是因为女生更倾向故意选择男生避免别人知道自己性别。我也没有证据去反驳这个假设。

万粉UP主视频数量分布分析

那么,要成为一个万粉以上的up主,到底该发表多少个视频合适呢?

df.视频数量.describe()
count     59167.000000
mean 258.358713
std 1379.662258
min 0.000000
25% 38.000000
50% 89.000000
75% 213.000000
max 180033.000000
Name: 视频数量, dtype: float64

可以看到,从整体来说平均是258个视频,最多的达到了18万个视频,最少的一个视频都没有发表。

看到这里,你是否产生了跟我一样的疑问,什么样的up主一个视频都不发,粉丝也能过万?什么样的up像神仙一样能发上万个视频?

我们分别找出来看看:

df.query("视频数量 > 10000")
图片

原来主要都是咨询类的号。

看下视频数量为0的:

df.query("视频数量 == 0")
图片

还挺多的,共595条。但是为什么他们的播放数又有这么多呢?

我猜可能是被封了?那么看下播放数也为0 的:

df.query("视频数量 == 0 and 播放数==0")
图片

这就不是太懂了。有兴趣验证原因的童鞋,可以看下原表其他字段验证一下。

加入粉丝数范围维度再细看:

t = df.groupby("粉丝数范围")["视频数量"].apply(lambda s: s.describe()).unstack(0)
t.style.background_gradient("Reds", axis=1)
图片

目前唯一可以确定的就是粉丝量级别越高的up主,平均视频数量是越多的,勤更是一个高粉up主的基本素质,想成为百万粉丝的up主,完成500个以上的高质量的视频最佳。

up主生日分布情况

先看整体:

df.生日.str[:2].value_counts()
01    7620
10 2636
12 2453
08 2426
11 2391
09 2273
07 2239
06 2203
05 2180
03 2170
02 2151
04 2047
Name: 生日, dtype: int64

我们发现1月份生日的up主显著多很多。

再加入粉丝范围维度拆分看看:

t = pd.crosstab(df.粉丝数范围, df.生日.str[:2])
t.style.background_gradient("Reds", axis=1)
图片

可以看到1月份生日的up主显著多于其他月份,难道是一月份出生的人更适合做up主吗?

不过也不排除是因为b站选生日时默认是1月份的,大部分都直接选了默认,从而导致了这个现象。

但是第2名10月份往往不受这个因素的影响,说明10月份出生的人,相对更适合做up主一些。

我暂时就只分析这些维度,有兴趣深挖的童鞋可以继续分析,欢迎各位数据分析大佬提出各丰富的分析维度建议,以及指出本文分析上的逻辑漏洞。

下面我们进行我们的最终目标,昵称分析,最终做出一个百万粉丝up主的昵称生成器:

百万粉丝up主的昵称生成器

首先筛选出粉丝量达到百万的up主:

df = df.query("粉丝数 >= 100")
df.shape[0]
658

共658个百万粉丝up主。

昵称文本长度频次top10:

name_size = df.名称.apply(len)
name_size.value_counts().head(10)
4     158
5 131
3 88
7 70
6 70
8 50
9 27
10 16
2 16
11 12
Name: 名称, dtype: int64

可以看到昵称长度为4的是最多的,排名前3的长度不超过5,但已经超过了一半的up主。

这说明要成为一名百万粉丝的up主,取一个简短的名称很有必要。毕竟越短的昵称,用户才越好记,才更容易抢占用户心智形成IP。

为了制作一个昵称生成器,我们可以将这些人的昵称分词后组成词组列表:

import jieba

# 分词并扩展提取
names = df.名称.apply(jieba.lcut).explode()
# 过滤长度小于等于1的词并去重
names = names[names.apply(len) > 1].unique()
print(names.shape[0], names)
1068 ['罗翔' '刑法' '番茄' ... '布锅' '伦桑爱' '唱歌']

可以看到结果中共包含1068个长度大于2的词

那么我们想生成一个长度为4左右的词,只需要随机选两个词即可:

"".join(np.random.choice(names, 2))
'张逗麦克'

这样我们就完成了一个简单粗暴的百万粉丝昵称生成器。生成了一个叫张逗麦克的昵称。

JavaScript版百万粉丝昵称生成器

提取出拆分出来的关键词之后,为了方便没有安装python的用户使用,做了一个JavaScript版本的百万粉丝昵称生成器。

复制以下代码粘贴到游览器控制台运行即可:

var items = ['罗翔''刑法''番茄''敬汉卿''共青团中央''周六''Zoey''凉风''Kaze''绵羊''料理''李子''老师''叫何''同学''厂长''木鱼''水心''中国''BOY''超级''大猩猩''LexBurner''观察者''杰瑞''某幻君''央视''新闻''原神''papi''大虾''指法''芬芳''张大''小潮''院长''华农''兄弟''记录''生活''蛋黄派''伊丽莎白''暴走''漫画''帕梅拉''PamelaReif''硬核''半佛''仙人''美食''作家''王刚''渗透''社食''遇记''日食''手工''花少北''机智''党妹''逍遥散''无穷小''科普''日常''兔叭''三代''大祥''哥来''花椒''片片''大片''宝宝''Baby''信誓''蛋蛋''张召忠''毕导''THU''纳豆''奶奶''一旦''枯燥''翔翔''作战''三十六''贱笑''徐大''sao''泛式''果仁''研究''协会''拜托''小翔哥''努力''Lorre''东尼''ookii''明日''方舟''思维''实验室''视频''工作室''大漠''叔叔''阿斗''归来''电影''TOP''吃饭''大王''刘老师''逗比''雀巢''科技''美学''柚子''字幕组''镖客''梦回''宝剑''咬人''孤独''大腿''做饭''芋头''SAMA''黑猫''厨房''po''纯黑''吃素''狮子''花花''三猫''CatLive''蜡笔''小勋''欣小萌''李永乐''官方''瓶子''152''EdmundDZhang''嘟督''不噶油''排骨''教主''才疏学浅''yousa''力元君''老爸''评测''音乐''私藏''密子君''所长''林超''崩坏''第一''偶像''爱酱''毒角''SHOW''回形针''PaperClip''远古时代''装机''TF''家族''视角''冯提''hanser''王者''荣耀''新华社''路人''局长''小高姐''魔法''调料''巫师''财经''Warma''影视''飓风''神奇''木偶''山下''智博''罗汉''解说''温柔''JUNZ''姜峰''真的''猛男''舞团''IconX''YouTube''听力''精选''洛天''一条''团团''OvO''盖世''猪猪''迷影社''阿莫''老皮''VFX''陈睿''大碗''老坛''胡说''英雄''联盟''哲别''黑桐''谷歌''火暴''王老菊''开心''嘴炮''凤凰''天使''TSKS''剧社''账号''0v0''TheRock''Johnson''天天''卡牌''手游''智能''路障''疯狂''杨哥''鹤吱菌''文哥''小艾''大叔''韩小四''April''历史''调研室''拉宏桑''CSGO''茄子''虫哥''文不''小白''测评''倒悬''橘子''小贝''进击''曼食''慢语''公主''连结''ReDive''枪弹''轨迹''孝警''阿特''wlop''建业''黄龄''TESTV''频道''女孩''为何''短裙''LKs''怪异''墨韵''Moyun''神秘''店长''贫道''AG''超玩会''梦泪''芒果''OL''不正经''老丝''1MILLION''OFFICIAL''路温''1900''Uzi''夹性''芝士''见见''Zz''犬来''八荒''卡特''一刀''有毒''邪说''鲲哥''数学''星河''Yoseya''斯塔''奇闻''观察室''一只''小仙''水无月菌''英语''波士顿''圆脸''薄海纸''尼玛''zettaranc''卡布''周深''自来''三木''直播''小喇叭''三无''Marblue''张三''传奇一生''胖胖''墨茶''Official''老戴''正义''雕刻''时光''客湾''Geekerwan''棉花''哥哥''low''君热剧''Vinheteiro''海皇''vivi''可爱多''doyoudo''趣测''口语''老炮''儿马''思瑞''考研''刘晓艳''沈逸''靖菌命''里德''Jared''nya''一生''欧阳''春晓''Aurora''谭乔''命运''冠位''指定''花泽''香菜''小央''阿幕''降临''壮实''Hera''样子''平平''soserious''吃货''闭眼''老板''长工''叔贵''EyeOpener''贝尔''格里尔''文西''阿漆''宋浩''痴鸡''小队''大庆''赶海''野食''小哥''小米''公司''山药''雨哥''到处跑''油兔''不二''KBShinya''姚姚''不是''P30''七奈''泽野''螳螂''楼上''老张''STN''还有''一天''放假''清华大学''阿巳''铃铛''很多''小姐姐''战双''帕弥什''鹿乃''逆风''烟斗''终极''小腾''特效''studio''鲁大能''姜云升''超果果''mc''盒子''酸奶''逗川''kshadow''多多''poi''oeasy''祖娅''纳惜''Steam''特惠''刘谦''上班族''便当''上海滩''Van''星有野''不愧''姐姐''大人''娜娜''Nana''文曰''小强''碧蓝''航线''粤知''一二''大橙橙''橙子''潮汕''男人''陈翔''六点半''阿漫''封茗''苏星河''牛通''Big''工坊''中国日报''Kevin''情报局''画渣''网易''第五''人格''Vicky''宣宣''CCheny6''鉴宝''冷淡''国家''地理''大象''放映室''Animenzzz''萧忆情''Alex''狂风''肉肉''搜索''你们''康康''钟文泽''打泥''一数''Feifei''闫帅''混乱''博物馆''坎公骑''冠剑''田野''繁荣''神话''悟空''印象''二次元''中科院''物理所''Vivekatt''小约翰''可汗''唯一''魔王''双笙子''制作''Kurt''NathanRich''火锅''波桑吃遍''世界''克里米亚''野生''动物园''理理''理子''长得''博主''女人''社长''OELoop''一大''浑元''Rysn''乌合''麒麟''燕子''BBQ''学徒''Ray''阿福''Thomas''NBzhuoc''乌鸦''校尉''CaptainWuya''丸子''叨叨''燃茶''李佳琦''Austin''草莓''西瓜''JUN''阴阳师''广东''共青团''知心''光影''笔墨''活蹦乱跳''肥曈''PS''教程''免费''ilem''周淑怡''守护''茶茶''品诺''开课''程十安''an''冒险''探长''丰兄来''碰碰''彭碰''光遇''王骁''Albert''广西''恩师''老骚''豆腐''柠檬''奇幻''漂流''抽风''Crazy''人类''行为''图鉴''IC''黑椒''墨鱼''狂阿弥''小缸''阿灿''鲁过''一世''陆夫人''公孙''田浩''沉默寡言''白河愁''达达''达布''PDD''隔壁''会长''客匠''App''赖皮''猴爱''kei''marin''知日酱''小熊''绅士''紧张''虫虫''柴犬''老饭''张喜喜''满汉全席''团队''大胡子''森纳映''重生''细胞''十音''Shiyin''某布君''面筋''书林''天堂''冲浪''普拉斯''少年''五之歌''极速''拍档''鲤鱼''Ace''导演''小策''主厨''农国栋''舞小''孙笑川''258''Zc''目录''松浦文''SPWZ''社長''无敌''皮皮''心灵''侦探''明柏辰''千户''长生''yoyo''鹿鸣''Lumi''飞碟''gagako''青莲''失利''席拉瑞丝''暴躁''JUMP''哇哇''哇妹''澤野弘''nZk''Minecraft''国电''武术馆''馆长''雪峰''调查''游戏''动力''VGN''白醋''少女''wuli''小周''轩子''KB''空耳狂''豪言''经理''TED''演讲''吉原''悠一''yui''阿狸''宣森''付曦冉''AIChannel''3Blue1Brown''微课''Test''正经''比比''大师''木源''评君''四季''萌芽''腾讯''动漫''轩墨''矮油''王老六''steam''牛叔''万岁''万万岁''红豆''稀饭''齐天大''肾余''潇洒''吴织''亚切''忽悠''无聊''开箱''一花''--''圈圈''路路''迷路''十二''pandapia''人民网''陈子''EX''吟游''诗人''基德''评测室''QAQ''涼子''BML''指挥部''福乐''cry''小仙爷''龙女''之声''刀剑''神域''黑衣''剑士''王牌''lana''纠结''杨真直''大佬''er''小可''玩酱''YCC''小狼''XF''史图馆''园长''绝不''早到''吱吱''肌肉''妮可''蹦蹦''狙击手''麦克''奶糕''成精''档案''备胎''说车''突击手''不了''夏一''就是''画画''梨涡''mini''鬼叔''怪谈''大司马''豆蔻''网不红''萌叔''Joey''Youtube''中文字幕''取景框''奥地利''山新''大家''芜湖''环球时报''底层''原理''波波''Brian''紫菜''蛋花''兔兔''澳洲''阿彭''知识''司马南''OldBa1''晓凯''央视网''小苏''一块''电鹿板''空卡''空空''DingTalk''卢克文''金灿荣''君说''星悦''小美女''PKU''汤家凤''王大境泽''阿银''塑料''FOKU''雷军''主播''蛋白''小猪''zzreal''小桑菜奈''马克''Sparrow''先看''天才''小熊猫''本人''谷谷''永不''咕咕''橙心''资讯''结巴''老爹''泪腺''战士''赛雷''三分钟''艾伦''Alan''尹正''华为''终端''抖抖''比目鱼''萝王''无情''皮科''医生''魏小博''小庄''发布会''一之濑''asuka''酒客''小丑''凌识''面粉''MayTree''五月''PuFF''大胖''软软''酸酸''浅澄''黑马''程序员''传奇''Sam''香香''小泡''郎朗''AndrewCap''小漫''政治''徐涛''巫托邦''南云''鸟羽''33''果子''小黑''战记''平行''oooooohmygosh''小缘''简史''轩邈''Elias''四月''生日''纪录片''国仁''全球''大学堂''浙江''某声悠''酒痴东''SXP''基金会''什么''溫暖''冷风''稚晖''人民日报''留学生''日报''KatAndSid''总裁''德云''Televison''初音''未来''Crypton''体态''深夜''T1''Faker''硬件''茶谈''一鹿''有车''花二''Strange''dc008''暗猫''祝福''GM''秘密''基地''郭云''爱否''FView''老爷爷''AlanWalker''李玉刚''鸡胸肉''大连''老湿王''博文''钢铁''直男必''菜菜''日记''了不起''八万''二饼''大大''灯泡''武当''陈师行''任性''KIMKILLS''Chimera''不良''博士''老哥''槐安''遗梦''仲尼''Johnny777''窝头''暴脾气''猫店''深海''色带''陈平''眉山''论剑''当归''目洋子''聊点''维他''乐乐''课堂''好运''一米''卧龙''Ksr''notyour''FM''一元''胖次''狐狸''不齐''思妇''韭菜''赤焰''男孩''银临''音阙''马蹄''北京大学''JKAI''杰凯''植物''特别''中二''q3''尤超白''波靖''CCTV''宝藏''联想''拯救''彭酱''LINYA''一丁''Dingslook''清华''数学系''葉子''先生''甘子''vansamaofficial''本尼''阿三''一脸''毛蛋''北京''青年''凉子''访谈录''张逗''张花''Super''也好''翠花''不太脆''红色''激情''郝给力''涛哥''布锅''伦桑爱''唱歌']

items[Math.floor(Math.random()*items.length)]+items[Math.floor(Math.random()*items.length)]

大家可以看到我在游览器控制生成的几个昵称:

图片

这可都是具有能够成为百万粉丝up主潜质的昵称噢!小伙伴们快快去尝试吧~

图片

总结

千里之行,始于足下这篇文章干货满满,实用性非常强,非常建议大家动手去尝试,我自己也动手去实践了,发现确实可以巩固很多的知识。


程序员入门最大的难点是什么?是缺少资料吗?不,网上资料太多了,缺的是实践的机会!没有实践的需求,感觉学什么都提不起精神!相反,如果有了一个实践的需求,它可能是一个比赛、可能是一个开源项目的功能改进、也可能是一个外包的工作,有这样一个需求要你来完成,你可能就会拼命、高效地学习需要的知识,快速地成长!所谓“干中学”,才是最好的学习方式。
如果大家想获得更多的编程实践机会,可以添加我的微信。我会尽量帮大家去寻找更多的编码实践机会。
图片
声明:
1、添加微信后,我可能不会立即回复,因为平时我也很忙,只能有空的时候回复。所以对回复的即时性不要抱有太大的期待。
2、我不会对技术问题进行回答。就是太忙、时间不够。如果你问一个技术问题,我大概率会忽略这条消息。
3、不会直接拉群。入群发广告的人太多了,我已经放弃维护微信群的想法了。当然,如果你参与了我发起的某项实践活动,相关人员拉小群是会有的。
4、实践机会一般会发在朋友圈,所以请不要屏蔽朋友圈。
5、朋友圈有时会分享一些我司出品的资料,但不会有第三方广告。总体来说应该不会太让人反感。
6、如果你有外包需求,也可以发给我,我来找合适的程序员为你实现。

72710手把手教你用Python网络爬虫获取B站UP主10万条数据并用Pandas库进行趣味数据分析

这个人很懒,什么都没留下

文章评论