以前看过别人做的一个展示番剧播放数据的站点,自己也想模仿一下

0x00.起因

【测试】番剧数据中心

0x01.经过

取数据

首先,要想做统计你得拿到数据。用 Google 搜了一圈最后在知乎上找到了结果 。我
采用这个 Api(Application Programming Interface,应用程序编程接口):

http://api.bilibili.com/archive_stat/stat?aid=<aid>

以 AV8614334 例,请求http://api.bilibili.com/archive_stat/stat?aid=8614334会得到如下json格式的结果。

1
// 20170217155559
2
// http://api.bilibili.com/archive_stat/stat?aid=8614334
3
4
{
5
  "code": 0,
6
  "data": {
7
    "view": 199648,
8
    "danmaku": 5132,
9
    "reply": 1164,
10
    "favorite": 124,
11
    "coin": 958,
12
    "share": 125,
13
    "now_rank": 0,
14
    "his_rank": 0
15
  },
16
  "message": ""
17
}

py代码:

1
import requests
2
3
api_url = "http://api.bilibili.com/archive_stat/stat?aid=8614334"
4
response = requests.get(api_url).content

周期的话一小时足矣,大可不必一分钟,其一文件太大没必要,其二在数据处理的时候你会发现会舍弃部分点。Windows平台可以用计划任务Linux平台可以用Cron。前者用批处理的话,创建如下内容的.bat文件来运行bilibili.py

1
@echo off
2
cd C:\task
3
start python bilibili.py
4
exit

后者用shell的话,创建如下内容的.sh文件来运行bilibili.py

1
#!/bin/bash
2
export TZ='Asia/Shanghai'
3
# 需要考虑国外服务器的时区,否则时间会对不上,上一行有异议
4
python 10.py

存数据

然后就要存储这些数据了,你可以简单地直接存储到json文件里,也可以存到数据库里。对于前者,可以这样实现

1
import json
2
3
with open('data.json', 'a') as a:
4
    a.write(json.dumps(response) + '\n')

而后者略显麻烦,先将json对象转换成python对象,这里得到的是dict

1
import json
2
3
jsDict = json.loads(response)
4
code = jsDict['code']
5
view = jsDict['data']['view']
6
danmaku = jsDict['data']['danmaku']
7
reply = jsDict['data']['reply']
8
favorite = jsDict['data']['favorite']
9
coin = jsDict['data']['coin']
10
share = jsDict['data']['share']
11
now_rank = jsDict['data']['now_rank']
12
his_rank = jsDict['data']['his_rank']
13
message = jsDict['message']

然后存到数据库里,采用SQlite。在bilibili.db文件中创建表并执行插入操作。

1
import sqlite3
2
3
conn = sqlite3.connect("bilibili.db")
4
c = conn.cursor()
5
# bilibili.db 不存在时会自动创建
6
7
c.execute('''CREATE TABLE IF NOT EXISTS{0} (
8
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
9
    DATE TEXT,
10
    TIME TEXT,
11
    code INT,
12
    view INT,
13
    danmaku INT,
14
    reply INT,
15
    favorite INT,
16
    coin INT,
17
    share INT,
18
    now_rank INT,
19
    his_rank INT,
20
    message TEXT);
21
    '''.format("`AV" + aid + "`"))
22
# 表名不能为纯数字
23
24
c.execute("INSERT INTO "+ "`AV" + aid + "`" + " (DATE, TIME, code, view, danmaku, reply, favorite, coin, share, now_rank, his_rank, message) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (DATE, TIME, code, view, danmaku, reply, favorite, coin, share, now_rank, his_rank, message));
25
26
conn.commit()
27
conn.close()

上述代码里的DATETIME是调用了当前的时间,可以这样实现:

1
from datetime import datetime
2
3
DATE = str(datetime.now().strftime("%Y-%m-%d"))
4
TIME = str(datetime.now().strftime("%H:%M:%S"))

用数据

等我数据屯足了再说吧
2017-7-1 20:09:24:懒得爬了,放假再说吧……

0x02.结果

源码