利用Python爬取B站数据

最初的想法

最近在想起能不能爬一下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…