阿胖山是我非常关注的一个UP主, 他经常把名贵的海鲜食材做成美食来分享。对我这种喜欢看吃播的人来说简直就是非常满足。每次看他们围坐一旁,一家人快快乐乐品尝美食的时候别提有多羡慕了。动不动一次光买食材就花费几千块钱,很多网友都在调侃阿胖山为阿矿山。那么有个问题来了,究竟该博主一年花费了多少钱呢。
我相信很多小伙伴们和我有相同的疑问。为了满足自己的好奇心,我决定好好的研究一番。
2022年马上就要过去了,那就统计下这2022年胖叔一共花费了多少钱。
首先点击进入胖叔主页,可以看到大部分视频的标题上都标明了食材的花费的金额。但是还有个别视频没有标明,这些视频里的食材,有一部分是朋友赠送的,他本人也不用花钱。还有一部分并没有标注来源,这让我很难界定到底花费了多少钱,所以为了保证严谨性,对于没有标注金额的,并不会计入。

阿胖山bilibili主页
粗略估计这一年大概更新了两三百条视频。如果要一个一个统计简直就是太无聊了。还好网上百度了一下发现可以编程解决,一下子又充满干劲了。
然而,仔细发现事情没有那么简单。网上的很多方法放到今天来已经不行了,由于时间相隔较远的关系,很多之前的方法已经被b站添加策略给屏蔽了,这就导致新手没办法直接获取视频信息了。
就在我尝试了很多失败之后,我偶然间发现了惊喜。B站上有个bilibili_api的开源库,可以下载该模块在Python中直接使用,一下子难度直接下降为零。获取视频的问题解决了,接下来就是分析标题、提取出标题里的金额了。
处理完成之后写入表格,打开后是这样的。

然后再过修改些错误的金额,按照月份进行统计。

可以看到这一年胖叔光吃饭就花费了24万。真是羡慕!!!
最后展示下完整python代码。
""" 1.获取视频一共有多少页,依次请求每一页的视频 2.提取每一页的视频描述信息(发布日期,文件名) 3.写入到Excel文件中 """ import re import time import math import asyncio import pandas as pd from bilibili_api import user, sync def extra_money(title): money = re.findall(r'\d+', title) if money is None or money == []: money = 0 elif (str(title).find('花') != -1 or str(title).find('元') != -1 or str(title).find('买') != -1): money = money[0] else: money = 0 return money def show_v_info(vresult): # 控制台打印信息 print("2022年共发布{}个视频".format(len(vresult))) print("{}\t{}\t{}".format("标题", "日期", "金额")) for item in vresult: print("{}\t{}\t{}".format(item[0], item[1], item[2])) def write_excel(vresult, filename): df = pd.DataFrame(vresult, columns=["标题", "日期", "金额"]) df.to_excel(filename) async def main(): u = user.User(520754513) # 实例化用户类, 输入参数为其ID info = await u.get_videos() # 获取该用户的所有视频 vlist = info['list']['tlist'] # 视频列表 vresult = [] # 统计视频数量,计算视频页数 vcount = 0 # 所有视频数量 for t in vlist.items(): vcount += t[1]['count'] pages = math.ceil(vcount / 30) # 向上取整 # 提取每一页的视频 for i in range(1, pages + 1): page_info = await u.get_videos(pn=i) for v in page_info['list']['vlist']: item_result = [] title = v['description'] create_time = v['created'] if create_time < 1640966400: # 过滤掉非2022年的视频 continue timeArray = time.localtime(create_time) create_time = time.strftime("%Y-%m-%d", timeArray) # 时间精确到天 money = extra_money(title) # 提取金额 vresult.append([title, create_time, money]) # 添加到结果集中 # show_v_info(vresult) # 控制台打印信息 write_excel(vresult, "data1.xlsx") # 写入表格 if __name__ == '__main__': asyncio.get_event_loop().run_until_complete(main())