php tongjiapi 使用_百度统计API的使用

百度统计API的使用

在搭建自己博客的时候,希望自己能有个日志系统,能够看到PV、UV等信息,同时自己也搭建了个ELK系统,可惜服务器配置太低(1GHZ+1G内存),根本运行不起来。只能使用第三方的日志统计了,由于之前用过一点点的百度统计,所以本平台使用百度统计来进行日志分析。

但是百度不提供数据图线给开发者使用,只能通过其TONGJI API对数据进行抓取。百度统计提供了两个接口(1.用户站点数据;2.站点报告数据),这里使用第二个接口来获取数据。

1.请求参数

参数名称

参数类型

描述

site_id

uint

站点ID

method

string

要查询的报告

start_date

string

查询起始时间

end_date

string

查询结束时间

metrics

string

自定义指标

详细的官方报告请访问官网TongjiApi

2.数据获取

官方同时提供了PHP和Java的版本,对于一个简简单单的获取数据的过程来说甚是繁琐,此处使用python来进行数据抓取最近七天的地域访问。

2.1 时间的获取

python中对于时间的处理找不到很好的库,所以使用了datetime,然后变成字符串。

today = datetime.date.today()

yesterday = today - datetime.timedelta(days=1)

fifteenago = today - datetime.timedelta(days=7)

end, start = str(yesterday).replace("-", ""), str(fifteenago).replace("-", "")

2.2 构建请求包

说明:siteId可以根据个人百度统计的链接获取,也可以使用Tongji API的第一个接口列表获取用户的站点列表。

body={

"header": {

"account_type": 1,

"password": "password",

"token": "开通统计API的token",

"username": "用户名"

},

"body": {

"siteId": "域名id",

"method": "visit/district/a", # 地域访问

"start_date": start,

"end_date": end,

"metrics": "pv_count,visitor_count,avg_visit_time" #所需要的指标

}

}

2.3 解析返回来的json

获取之后的json主要是在items中,其顺序为[[省份],[pv_count,visitor_count,avg_visit_time]],但是在java中使用bean来封装的时候设计原则一般是“地名、pv_count、visitor_count、avg_visit_time”,所以需要经过一定的处理。

{

"body": {

"data": [

{

"result": {

"offset": 0,

"total": 3,

"items": [

[

[

{

"area": "province,4",

"name": "广东"

}

],

[

{

"area": "province,28",

"name": "四川"

}

],

[

{

"area": "province,19",

"name": "江苏"

}

]

],

[

[

649,

7,

2684

],

[

2,

2,

76

],

[

1,

1,

3

]

],

...

...

}

对json进行处理

the_page = response.read()

result=json.loads(the_page.decode("utf-8"))

print(json.dumps(result))

base=result["body"]["data"][0]["result"]["items"]

source=[]

for item in base[0]:

source.append(item[0]['name'])

count=0

detail=[]

for item in base[1]:

tojson={}

tojson['name']=source[count]

tojson['pv_count']=item[0]

tojson['pv_ratio']=item[1]

tojson['visitor_count']=item[2]

count=count+1

detail.append(tojson)

2.4 完整代码

import urllib.request

import urllib.parse

import json

import time

import datetime

start_date = time.strftime("%Y%m%d", time.localtime())

today = datetime.date.today()

yesterday = today - datetime.timedelta(days=1)

fifteenago = today - datetime.timedelta(days=7)

end, start = str(yesterday).replace("-", ""), str(fifteenago).replace("-", "")

base_url = "https://api.baidu.com/json/tongji/v1/ReportService/getData"

body = {"header": {"account_type": 1, "password": "", "token": "",

"username": ""},

"body": {"siteId": , "method": "visit/district/a", "start_date": start, "end_date": end,

"metrics": "pv_count,visitor_count,avg_visit_time"}}

data = bytes(json.dumps(body), 'utf8')

req = urllib.request.Request(base_url, data)

response = urllib.request.urlopen(req)

the_page = response.read()

result=json.loads(the_page.decode("utf-8"))

base=result["body"]["data"][0]["result"]["items"]

source=[]

for item in base[0]:

source.append(item[0]['name'])

count=0

detail=[]

for item in base[1]:

tojson={}

tojson['name']=source[count]

tojson['pv_count']=item[0]

tojson['pv_ratio']=item[1]

tojson['visitor_count']=item[2]

count=count+1

detail.append(tojson)

2.5 结果

[{'pv_count': 649, 'pv_ratio': 7, 'visitor_count': 2684, 'name': '广东'}, {'pv_count': 2, 'pv_ratio': 2, 'visitor_count': 76, 'name': '四川'}, {'pv_count': 1, 'pv_ratio': 1, 'visitor_count': 3, 'name': '江苏'}]

经过上述的处理之后,将json存入Redis中,使用的时候用JavaBean来封装,就能够很好的把数据传入highcharts、echarts等图表。

3.echarts展示地域图

展示地域图的时候需要获取下载两个文件,china.js(其提供了js和json,这里使用的js),echarts.js

部分代码:

日志系统

// 基于准备好的dom,初始化echarts实例

var myChart = echarts.init(document.getElementById('diyu'));

option = {

tooltip: {

trigger: 'item'

},

legend: {

orient: 'vertical',

left: 'left'

},

visualMap: {

min: 0,

max:${diyumax},

left: 'left',

top: 'bottom',

text: ['高', '低'], // 文本,默认为数值文本

calculable: true

},

toolbox: {

show: true,

orient: 'vertical',

left: 'right',

top: 'center',

feature: {

dataView: {readOnly: false},

restore: {},

saveAsImage: {}

}

},

series: [

{

name: '访问量',

type: 'map',

mapType: 'china',

roam: false,

label: {

normal: {

show: true

},

emphasis: {

show: true

}

},

data: [

{name: '${diyu.name}', value: ${to.pv_count}},

]

}

]

};

myChart.setOption(option);

结果如下:

更多图表欢迎访问我的个人博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值