前言
因为网站刚建立起来,需要统计一下流量的情况,发现每次都要登录统计后台查看流量非常的繁琐,且发现百度统计其实是有API的,于是研究了一下用Python接入统计API,达到快速看流量的目的。
百度统计API地址:https://tongji.baidu.com/api/manual/
不多说,直接上代码
先创建一个名字叫:baidu_tongji.py的文件
import requests
import json
class BaiduTongJi(object):
def __init__(self, site_id, start_date, end_date, metrics, method, gran):
"""
初始化方法
:param site_id: 站点id
:param start_date: 起始时间
:param end_date: 截止时间
:param metrics: 需要查看的字段,如:PV、UV、访问时长等
:param method: 需要查看的报告如:全部来源、趋势分析等
:param gran:时间粒度
"""
self.api_url = 'https://api.baidu.com/json/tongji/v1/ReportService/getData'
self.api_par = {
"header": {
"username": "用户名",
'password': '密码',
"token": '你的token值',
"account_type": 1
},
"body": {
"site_id": site_id,
"start_date": start_date,
"end_date": end_date,
"metrics": metrics,
"method": method,
"gran": gran
}
}
return
def send_request(self):
data = json.dumps(self.api_par)
request = requests.post(self.api_url, data)
response = json.loads(request.text)
self.response = response
return self.response
def source_all(self):
"""
全部来源
:return:
"""
response = self.send_request()
result = response['body']['data'][0]['result']['pageSum'][0]
ret_pv = result[0]
ret_uv = result[1]
print(f"网站的PV是:{ret_pv}\n网站的UV是:{ret_uv}")
return
def trend(self):
"""
趋势分析
:return:
"""
response = self.send_request()
result = response['body']['data'][0]['result']['items']
ret_data = result[0]
ret_pv = result[1]
return ret_data, ret_pv
bdtj = BaiduTongJi(site_id='你的站点id', start_date=20190901, end_date=20190926,metrics='pv_count,visitor_count',method='source/all/a', gran=None)
bdtj.source_all()
简单的写了一个获取数据的api,可以获取全部来源和趋势分析这两个报告的数据,获取的字段可以自己加,具体可以看百度统计API文档
改成自己的站点参数可以直接使用了,感觉写出来会逻辑上比较绕,如果有更好的方法的大佬,可以在评论区回复哈
同时也简单的用matplotlib做了个可视化,上代码
注意,这里有个坑,获取过来的数据,时间其实是反转过来的,即降序排序的,如果需要做可视化的话需要先反转一下顺序,不然出的图会有问题
# 这个导包就是导刚刚上面那个获取数据的py文件,名字可以自己取
from .baidu_tongji import BaiduTongJi
import matplotlib.pyplot as plt
trends = BaiduTongJi(site_id='你的站点id', start_date=20190901, end_date=20190926, metrics='pv_count',method='trend/time/a', gran='day')
date, pv = trends.trend()
# 处理数据,反转数据
dates = [i[0] for i in date][::1]
pvs = [i[0] for i in pv]
pvs1 = [0 if i == '--' else i for i in pvs][::1]
print(pvs1)
# 设定x,y值
x = dates
y = pvs1
plt.figure(figsize=(20, 8), dpi=100)
plt.grid(True, linestyle='--', alpha=0.5)
y_ticks = range(max(y), -2, -1)
plt.plot(x, y, label='PV')
plt.xticks(x[::5], x[::5])
plt.yticks(y_ticks[::20])
plt.xlabel('时间')
plt.ylabel('PV')
plt.legend(loc=4)
plt.show()
先写到这,后期研究使用pandas操作存入csv,再做自动化刷新。
网友评论