最初的想法
最近在想起能不能爬一下B站的用户信息,看看能不能统计一下B站的年龄信息。但是很遗憾,在个人主页里只能看到注册日期和生日,而不能看到完整的生日信息。
还是换个目标吧,好久没用python了,就当是复习一下基础知识。于是找了一下B站的API,官方没有开放的API可供调用,意料之中,已经有大佬准备好了:GitHub-B站野生接口 。
class BilibiliSpider(object):
def __init__(self):
self.online_api = "https://api.bilibili.com/x/web-interface/online" # 在线人数
self.video_api = "https://api.bilibili.com/x/web-interface/archive/stat?&aid=%s" # 视频信息
self.newlist_api = "https://api.bilibili.com/x/web-interface/newlist?&rid=%s&pn=%s&ps=%s" # 最新视频信息
self.region_api = "https://api.bilibili.com/x/web-interface/dynamic/region?&rid=%s&pn=%s&ps=%s" # 最新动态信息
self.member_api = "http://space.bilibili.com/ajax/member/GetInfo" # 用户信息
self.stat_api = "https://api.bilibili.com/x/relation/stat?vmid=%s" # 用户关注数和粉丝总数
self.upstat_api = "https://api.bilibili.com/x/space/upstat?mid=%s" # 用户总播放量和总阅读量
self.follower_api = "https://api.bilibili.com/x/relation/followings?vmid=%s&pn=%s&ps=%s" # 用户关注信息
self.fans_api = "https://api.bilibili.com/x/relation/followers?vmid=%s&pn=%s&ps=%s" # 用户粉丝信息
抓取在线人数
最简单的例子,在 StuPeter 的例子里有现成的代码:
def member_online_count(self):
ret_val = requests.get(self.online_api)
if ret_val.status_code != 200 or ret_val.content is None:
print("获取当前在线人数失败")
return None
ret_content = json.loads(ret_val.content)
return ret_content["data"]["web_online"]
将返回数据写入文件
每次执行脚本都记录下当前时间:
def write_to_file(self, cnt):
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
f = open(self.file, "a")
content_to_write = "[" + now + "] : [" + str(cnt) + "]"
f.write(content_to_write + "\n")
配置定时任务
配置定时任务(Ubantu18.04)每十分钟执行一次:
0,10,20,30,40,50 * * * * python /home/username/python/bilibili_spider.py
matplotlib折线图展示
爬完数据之后数据数据都在文件里,直接数据文件中读取记录下的 时间 和 人数值,做成折线图:
还需要再研究研究,to be updated…