最初的想法
最近在想起能不能爬一下B站的用户信息,看看能不能统计一下B站的年龄信息。但是很遗憾,在个人主页里只能看到注册日期和生日,而不能看到完整的生日信息。
还是换个目标吧,好久没用python了,就当是复习一下基础知识。于是找了一下B站的API,官方没有开放的API可供调用,意料之中,已经有大佬准备好了:GitHub-B站野生接口 。
1 2 3 4 5 6 7 8 9 10 11 12
| 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 的例子里有现成的代码:
1 2 3 4 5 6 7
| 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"]
|
将返回数据写入文件
每次执行脚本都记录下当前时间:
1 2 3 4 5
| 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)每十分钟执行一次:
1
| 0,10,20,30,40,50 * * * * python /home/username/python/bilibili_spider.py
|
matplotlib折线图展示
爬完数据之后数据数据都在文件里,直接数据文件中读取记录下的 时间 和 人数值,做成折线图:
还需要再研究研究,to be updated…