百度統計API的使用
在搭建自己博客的時候,希望自己能有個日志系統,能夠看到PV、UV等信息,同時自己也搭建了個ELK系統,可惜服務器配置太低(1GHZ+1G內存),根本運行不起來。只能使用第三方的日志統計了,由於之前用過一點點的百度統計,所以本平台使用百度統計來進行日志分析。

但是百度不提供數據圖線給開發者使用,只能通過其TONGJI API對數據進行抓取。百度統計提供了兩個接口(1.用戶站點數據;2.站點報告數據),這里使用第二個接口來獲取數據。
1.請求參數
鏈接:https://api.baidu.com/json/tongji/v1/ReportService/getData
所需參數(必須):
| 參數名稱 | 參數類型 | 描述 |
|---|---|---|
| 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
部分代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>日志系統</title>
<script src="js/jquery-3.2.1.min.js"></script>
<link rel="stylesheet" id="style-css" href="js/jingmi/jingmistyle.css" type="text/css" media="all">
<script type="text/javascript" src="js/echarts.js"></script>
<script type="text/javascript" src="js/china.js"></script>
</head>
<body>
<div id="diyu" style="width: 100%;height: 421px"></div>
<script type="text/javascript">
// 基於准備好的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: [
<c:forEach var="diyu" items="${diyu}">
{name: '${diyu.name}', value: ${to.pv_count}},
</c:forEach>
]
}
]
};
myChart.setOption(option);
</script>
</body>
</html>
<jsp:include page="foot.jsp"/>
結果如下:

