【寒假作业03】 让我看看是谁关注了这个up主~

【寒假作业03】 🕊让我看看是谁关注了这个up主~

🛫 Fly to 作业链接 ~

爬虫+算法:划水中的员工

员工 A 此刻内心一酸,大年初一加班惨绝人寰,情不自禁打开 B 站,跟着网友一起划水看番。

但是由于技术故障原因番没了,员工 A 心态差点爆炸,刚好有个 Up 主疯狂掉粉几十万引起了他的注意,掉得他内心莫名舒坦,但是他想起自己还要工作不能实时查看粉丝数,于是他准备把这个工作交给下属。

他交代下属:将某个 Up 主的粉丝数用爬虫的方法抓取下来,并且每小时重新爬取一次,可视化出来。

当然,除此之外,他还想知道多个 Up 主之间粉丝的重合度,请选三个 Up 主,爬取其粉丝,用合理的算法给出大致正确的重合度,给出算法时间复杂度,估计算法所用的空间内存。

📈 Part One——Bilibili Up主粉丝数实时变化可视化程序

🐾Step·1 准备工作

安装 requests & matplotlib(分别用于爬虫和绘图)

pip install request

pip install matplotlib

🐾Step·2 爬虫程序

Bilibili Up主粉丝数实时变化获取程序demo

程序测试:以 5 秒为一个周期抓取Up主老师好我叫何同学(UID:163637592)粉丝数变化

import requests
import json
import time

print("\nBilibili Up主粉丝数实时变化获取程序\nPlease enter the UID:")
uid = input("\t")
while True:
    url = f'https://api.bilibili.com/x/web-interface/card?mid={uid}&;jsonp=jsonp&article=true'
    headers = {'user-agent':'Mozilla/5.0'}
    reply = requests.get(url).text
    fans = json.loads(reply).get("data").get("card").get("fans")
    up_id = json.loads(reply).get("data").get("card").get("name")
    print("UP_ID",up_id,"粉丝数",fans,"\n")
    t = time.strftime("统计时间:%H时%M分%S秒")
    print(t)
    time.sleep(5)

其实一开始抓取的是Up主吃花椒的喵酱的粉丝数(因为冰冰和国际巨星潘唐颖梦幻联动的视频上首页啦哈哈哈哈哈
测试时抓取何同学粉丝数的时候,还在想着说,距离小何上一次更新视频也过了一个多月了,真不愧是何先咕
万万没想到,趁抓数据的时候切回B站界面,意外地发现何同学更新了视频!

🐾Step·3 实现框架

在测试版的demo中,程序基本实现了对Up主粉丝数的抓取,不过需要手动结束任务,所以接下来的操作是:

  • 用户可自定义周期T (题目要求为1h即3600s)
  • 用户可自定义抓取次数n
  • 存储抓取到的数据以便绘图

事实上,只需增加参数再重构循环即可实现,并不困难,代码如下:

import requests
import json
import time
import matplotlib.pyplot

print("\nBilibili Up主粉丝数实时变化获取程序\n请输入Up主的UID:",end="")  # 何同学UID  163637592
uid = input("")
url = f'https://api.bilibili.com/x/web-interface/card?mid={uid}&;jsonp=jsonp&article=true'
headers = {'user-agent': 'Mozilla/5.0'}
lag = input("请输入获取数据的间隔秒数:")
lag = int(lag)
cnt = input("请输入数据抓取次数:")
cnt = int(cnt)
X_time = []
Y_number = []
for i in range (0,cnt):
    reply = requests.get(url).text
    fans = json.loads(reply).get("data").get("card").get("fans")
    t = time.strftime("%H:%M:%S")
    X_time.append(t)
    Y_number.append(fans)
    time.sleep(lag)
matplotlib.pyplot.plot(X_time,Y_number)
matplotlib.pyplot.show()

⚠Error预警:变量名/列表名如果叫time的话会有命名冲突的报错!

🐾Step·4 可视化图

较短间隔时间(lag=20, cnt=8)绘图效果预览

posted @ 2021-02-18 00:11  Forest_One  阅读(166)  评论(0编辑  收藏  举报