百度统计简介
百度统计——领先的中文网站分析平台
百度统计是百度推出的一款免费的专业网站流量分析工具,能够告诉用户访客是如何找到并浏览用户的网站,在网站上做了些什么,有了这些信息,可以帮助用户改善访客在用户的网站上的使用体验,不断提升网站的投资回报率。 百度统计提供了几十种图形化报告,全程跟踪访客的行为路径。同时,百度统计集成百度推广数据,帮助用户及时了解百度推广效果并优化推广方案。 基于百度强大的技术实力,百度统计提供了丰富的数据指标,系统稳定,功能强大但操作简易。登陆系统后按照系统说明完成代码添加,百度统计便可马上收集数据,为用户提高投资回报率提供决策依据。
如上所示,百度统计平台可以统计出浏览量pv,访客数uv,ip数等等。可以统计出大多数用户需要的信息。
同时也可以借助百度统计统计自己的网站数据,这样就无需开发纪录网站信息的功能。
百度统计使用入门
百度统计的的主要分为三种,如下
一般的pc端站长版足够使用了,注册一个百度账户,登录进入主页,如下
这里已经绑定了一个站点,新注册的应该是空白。更多功能移步官方文档使用入门
新建上线站点
新建站点
填写完域名信息就绑定完成了。
这样绑定并不能完成网站数据的统计,还需要安装代码,再开发的网站中添加百度统计的代码:
如何手动安装代码
也就是说,在网站上线前需要将百度统计的代码添加上去,再上线网页。
在使用设置
的代码管理
按步骤进行
当出现安装成功即可。
仅仅在百度统计官网上查看这些信息显然不能满足要求,百度统计提供给api用于获取这些统计信息。
查看百度统计api手册:
https://tongji.baidu.com/api/manual/
选择对应账户下的接口即可。百度账号接口说明
获取api key
配置网站需要有域名且已经上服务器了,在公网能访问到。
如下是配置成功且安装百度统计代码后的api。
点击Tongji API调试工具
Api接口调试
- 进入调试界面,最好先查看
Tongji API用户手册
查看如何使用这些api接口。
2. 填写账号和token,注意这里的token不是密码,是上一步的数据api
。百度商业账号或百度账号都可以
- 选择需要的数据类型
一般统计网站的访问量,浏览量等信息都是获取报告数据
,更多请移步官方文档Tongji API用户手册
- 选择趋势分析,获取满足条件的数据
网站的浏览量和访问量在趋势分析下。
- 填写请求参数
选择完所有参数后点击提交
生成如图所示的请求参数
响应如下
响应也和请求一样也是header
和body
的json数据。
完整的数据如下
{
"header": {
"desc": "success",
"failures": [],
"oprs": 1,
"succ": 1,
"oprtime": 0,
"quota": 1,
"rquota": 200000000,
"status": 0,
"traceid": "e33e957b64bd11ee9b7c1d928feab7e1"
},
"body": {
"data": [
{
"result": {
"total": 62,
"offset": 0,
"pageSum": [
[
"2023/08/01 - 2023/10/01",
362,
44
],
[
"2023/08/10 - 2023/10/07",
104,
34
],
[
"变化率",
248.08,
29.41
]
],
"timeSpan": [
"2023/08/01 - 2023/10/01",
"2023/08/10 - 2023/10/07"
],
"sum": [
[
2418,
316
],
[
944,
145
]
],
"fields": [
"simple_date_title",
"time",
"pv_count",
"visitor_count"
],
"items": [
[
[
"2023/10/01与2023/10/07"
],
[
"2023/09/30与2023/10/06"
],
[
"2023/09/29与2023/10/05"
],
[
"2023/09/28与2023/10/04"
],
[
"2023/09/27与2023/10/03"
],
[
"2023/09/26与2023/10/02"
],
[
"2023/09/25与2023/10/01"
],
[
"2023/09/24与2023/09/30"
],
[
"2023/09/23与2023/09/29"
],
[
"2023/09/22与2023/09/28"
],
[
"2023/09/21与2023/09/27"
],
[
"2023/09/20与2023/09/26"
],
[
"2023/09/19与2023/09/25"
],
[
"2023/09/18与2023/09/24"
],
[
"2023/09/17与2023/09/23"
],
[
"2023/09/16与2023/09/22"
],
[
"2023/09/15与2023/09/21"
],
[
"2023/09/14与2023/09/20"
],
[
"2023/09/13与2023/09/19"
],
[
"2023/09/12与2023/09/18"
]
],
[
[
"2023/10/01",
"--",
"--"
],
[
"2023/09/30",
"--",
"--"
],
[
"2023/09/29",
"--",
"--"
],
[
"2023/09/28",
6,
6
],
[
"2023/09/27",
4,
2
],
[
"2023/09/26",
8,
6
],
[
"2023/09/25",
4,
3
],
[
"2023/09/24",
2,
1
],
[
"2023/09/23",
"--",
"--"
],
[
"2023/09/22",
8,
5
],
[
"2023/09/21",
4,
3
],
[
"2023/09/20",
57,
2
],
[
"2023/09/19",
2,
1
],
[
"2023/09/18",
2,
2
],
[
"2023/09/17",
"--",
"--"
],
[
"2023/09/16",
"--",
"--"
],
[
"2023/09/15",
85,
7
],
[
"2023/09/14",
64,
4
],
[
"2023/09/13",
116,
2
],
[
"2023/09/12",
"--",
"--"
]
],
[
[
"2023/10/07",
7,
3
],
[
"2023/10/06",
"--",
"--"
],
[
"2023/10/05",
"--",
"--"
],
[
"2023/10/04",
"--",
"--"
],
[
"2023/10/03",
"--",
"--"
],
[
"2023/10/02",
"--",
"--"
],
[
"2023/10/01",
"--",
"--"
],
[
"2023/09/30",
"--",
"--"
],
[
"2023/09/29",
"--",
"--"
],
[
"2023/09/28",
6,
6
],
[
"2023/09/27",
4,
2
],
[
"2023/09/26",
8,
6
],
[
"2023/09/25",
4,
3
],
[
"2023/09/24",
2,
1
],
[
"2023/09/23",
"--",
"--"
],
[
"2023/09/22",
8,
5
],
[
"2023/09/21",
4,
3
],
[
"2023/09/20",
57,
2
],
[
"2023/09/19",
2,
1
],
[
"2023/09/18",
2,
2
]
],
[
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
33.33,
-16.67
],
[
"变化率",
0,
50
],
[
"变化率",
612.5,
-66.67
],
[
"变化率",
-50,
-66.67
],
[
"变化率",
0,
100
],
[
"变化率",
"--",
"--"
],
[
"变化率",
"--",
"--"
],
[
"变化率",
2025,
133.33
],
[
"变化率",
12.28,
100
],
[
"变化率",
5700,
100
],
[
"变化率",
"--",
"--"
]
]
]
}
}
],
"expand": {}
}
}
GO语言实现
- 拼接请求体数据
百度统计的请求参数都是放在请求体中的,包括header
和body
,如下:
postData := make(map[string]interface{})
header := make(map[string]interface{})
body := make(map[string]interface{})
header["userName"] = "username"
//header["password"] = "password"
header["accessToken"] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
header["account_type"] = 1
body["site_id"] = "siteId"
body["start_date"] = "20230801"
body["end_date"] = "20231001"
body["metrics"] = "pv_count,visitor_count"
body["method"] = "trend/time/a"
//body["gran"] = gran
//body["area"] = ""
postData["header"] = header
postData["body"] = body
- 序列化数据
bytesData, err := json.Marshal(postData)
- 发送请求
// io操作
reader := bytes.NewReader(bytesData)
// 百度统计api
url := "https://api.baidu.com/json/tongji/v1/ReportService/getData"
request, err := http.NewRequest("POST", url, reader)
// 设置请求体格式是json必须是json
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
// 发送http请求
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
fmt.Printf("连接百度统计request错误:%s", err)
}
// 读取请求体数据
respBytes, err := ioutil.ReadAll(resp.Body)
- 解析响应数据
// 打印json字符串
fmt.Printf("%v", string(respBytes))
// 根据json字符串构建结构体赋值
// 该部分省略,由于选择的请求参数不同返回的json字符串不同
构造返回值结构体,观察百度统计的api测试机,数据在body
的data
中,如下:
data
中有两个主要的结构,result
和expand
,一次类推按照这种结构,构造结构体,如下:
type BaiduHeaderFailureReturn struct {
Code int `json:"code"`
Message string `json:"message"`
Position string `json:"position"`
Content string `json:"content"`
}
type BaiduReturn struct {
Header BaiduHeaderReturn `json:"header"`
Body BaiduBodyDataReturn `json:"body"`
}
type BaiduHeaderReturn struct {
Desc string `json:"desc"`
Failures []BaiduHeaderFailureReturn `json:"failures"`
Oprs int `json:"oprs"`
Succ int `json:"succ"`
Oprtime int `json:"oprtime"`
Quota int `json:"quota"`
Rquota int `json:"rquota"`
Status int `json:"status"`
}
type BaiduBodyDataReturn struct {
Data []BaiduBodyResultReturn `json:"data"`
}
type BaiduBodyResultReturn struct {
Result BaiduBodyResultSumReturn `json:"result"`
}
type BaiduBodyResultSumReturn struct {
Total int `json:"total"`
Sum [][]int `json:"sum"`
Items [][][]interface{} `json:"items"`
PageSum [][]interface{} `json:"pageSum"`
}
带入赋值即可。
完整代码如下:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
postData := make(map[string]interface{})
header := make(map[string]interface{})
body := make(map[string]interface{})
header["userName"] = "xxxx"
//header["password"] = "xxxx"
header["accessToken"] = "xxxxxx"
header["account_type"] = 1
body["site_id"] = "xxxxx"
body["start_date"] = "20230801"
body["end_date"] = "20231001"
body["metrics"] = "pv_count,visitor_count"
body["method"] = "trend/time/a"
//body["gran"] = gran
//body["area"] = ""
postData["header"] = header
postData["body"] = body
//fmt.Printf("%v", postData)
bytesData, err := json.Marshal(postData)
if err != nil {
fmt.Printf("序列化百度统计参数错误:%s", err)
}
//fmt.Printf("%v", bytesData)
reader := bytes.NewReader(bytesData)
url := "https://api.baidu.com/json/tongji/v1/ReportService/getData"
request, err := http.NewRequest("POST", url, reader)
if err != nil {
fmt.Printf("创建百度统计request错误:%s", err)
}
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
fmt.Printf("连接百度统计request错误:%s", err)
}
respBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取百度统计request结果错误:%s", err)
}
fmt.Printf("%v", string(respBytes))
// 构造返回参数结构体
ret := &BaiduReturn{}
json.Unmarshal(respBytes, &ret)
if ret.Header.Desc != "success" {
fmt.Printf("读取百度统计request返回值显示错误:%s", ret.Header.Failures[0].Message)
return
}
fmt.Printf("%+v\n", ret.Body)
}
type BaiduHeaderFailureReturn struct {
Code int `json:"code"`
Message string `json:"message"`
Position string `json:"position"`
Content string `json:"content"`
}
type BaiduReturn struct {
Header BaiduHeaderReturn `json:"header"`
Body BaiduBodyDataReturn `json:"body"`
}
type BaiduHeaderReturn struct {
Desc string `json:"desc"`
Failures []BaiduHeaderFailureReturn `json:"failures"`
Oprs int `json:"oprs"`
Succ int `json:"succ"`
Oprtime int `json:"oprtime"`
Quota int `json:"quota"`
Rquota int `json:"rquota"`
Status int `json:"status"`
}
type BaiduBodyDataReturn struct {
Data []BaiduBodyResultReturn `json:"data"`
}
type BaiduBodyResultReturn struct {
Result BaiduBodyResultSumReturn `json:"result"`
}
type BaiduBodyResultSumReturn struct {
Total int `json:"total"`
Sum [][]int `json:"sum"`
Items [][][]interface{} `json:"items"`
PageSum [][]interface{} `json:"pageSum"`
}
这里根据实际需求构造返回值结构体即可。