进入百度统计,点击管理 > 其他设置 > 数据导出服务,勾选协议并点击立即开通即可获取 Token
官方操作指南:https://tongji.baidu.com/open/api/more?p=tongjiapi_guide.tpl
在线调试工具:
https://tongji.baidu.com/api/debug/
获取站点列表
官方文档:https://tongji.baidu.com/open/api/more?p=tongjiapi_getSiteList.tpl
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import requests import json USERNAME = '用户名' PASSWORD = '密码' TOKEN = '所获取到的 Token' siteListUrl = "https://api.baidu.com/json/tongji/v1/ReportService/getSiteList" data = { "header": { "username": USERNAME, "password": PASSWORD, "token": TOKEN, "account_type": 1 } } data = json.dumps(data) r = requests.post(siteListUrl,data=data) # 打印返回信息 print(r.text) |
站点报告数据
官方文档:https://tongji.baidu.com/open/api/more?p=tongjiapi_getData.tpl
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
getDataUrl = "https://api.baidu.com/json/tongji/v1/ReportService/getData" # 请求数据如下 data = { "header": { 'username': USERNAME, 'password': PASSWORD, 'token': TOKEN, "account_type": 1 }, "body": { 'site_id': ALAN_SITE_ID, # 前面所打印的 site_id 'method': 'overview/getTimeTrendRpt', # 报告(参见官方文档获取更多) 'start_date': '20190601', # 开始时间 'end_date': '20190615', # 结束时间 'metrics': 'pv_count,visitor_count,ip_count,bounce_ratio,avg_visit_time,' # 获取的参数 } } r = requests.post(getDataUrl,data=json.dumps(data)) result = json.loads(r.text) #打印数据 print(result) |
2023年6月15日更新,以上方法已无法使用,会报this token is discarded, please use oauth:
1 2 3 4 5 6 7 8 |
getDataUrl = "https://api.baidu.com/json/tongji/v1/ReportService/getData" query = f"?access_token={access_token}&site_id={TONGJI_SITE_ID}&start_date={start_date}&end_date={end_date}&metrics={metrics}&method={method}" r = requests.get(getDataUrl+query) result = json.loads(r.text) #打印数据 print(result) |
补充:对于PC的数据,另一种获取数据的方式是Open Api:
https://tongji.baidu.com/api/manual/Chapter2/openapi.html
需要创建应用并设置授权回调页,然后通过回调页获取初始的ACCESS_TOKEN和REFRESH_TOKEN,其中注意参数中的client_id实际为 API Key,不是应用的 id。回调页应该要进行设置,还有就是当前账号需要具有百度统计账号的权限。也可对比下方百度移动统计部分的总结。
在回调error_code为111时即表明ACCESS_TOKEN过期,需更新Token: http://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET},注意REFRESH_TOKEN也只能使用一次
2023年3月:百度上垃圾流量激增,虽然百度统计对关键词做了相应处理,但整体流量数据中并没有体现,所以需要手动减去关键词为(已屏蔽)的数据(相应接口为source/searchword/a),另需要区分移动端及PC 流量可使用clientDevice参数(值为 mobile及pc),注意不是所有接口都支持这一参数
百度移动统计
官方文档:https://mtj.baidu.com/static/userguide/book/api/overview.html
1、注册一个百度开发者账号并创建应用(工程)并绑定邮箱:http://developer.baidu.com/console#app/project,填写的回调地址如 https://www.baidu.com必须与后面步骤中调用的相同,就当前应用而言并不要求有特别的处理 URL,仅用于授权后的跳转;记录API Key和Secret Key:
2、进入百度移动统计后台并给对应邮箱授权
3、获取 Code:访问http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&scope=basic&display=popup
CLIENT_ID:API Key和REDIRECT_URI:回调地址参见第1步
4、获取 access_token和refresh_token:访问:http://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code={CODE}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri={REDIRECT_URI}
CODE 见第3步,CLIENT_ID:API Key、CLIENT_SECRET:Secret Key和REDIRECT_URI:回调地址见第1步
测试地址:https://openapi.baidu.com/rest/2.0/mtj/svc/config/getAppList?access_token={ACCESS_TOKEN}(access_token来自第4步)
通过以上地址可获取到账号中所存在的 APP 及 AppKey(AppKey 也可通过设置>应用信息查看)
5、更新 Token:http://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}
REFRESH_TOKEN来自第4步,API Key、CLIENT_SECRET:Secret Key见第1步
6、查看配额及已调用次数
https://openapi.baidu.com/rest/2.0/mtj/svc/config/getQuotaByUser?access_token={ACCESS_TOKEN}
7、调用相应接口:https://openapi.baidu.com/rest/2.0/mtj/svc/app/getDataByKey?access_token=[ACCESS_TOKEN]&key=[APPKEY]&method=newuser/a&start-date=20171107000000&end-date=20171108232359&metrics=new_user_count,user_count
APPKEY为第4步示例中所获取或通过百度移动统计后台设置>应用信息查看
示例代码(其中 access_token 是有有效期的且接口调用存在次数限制,可考虑存放到数据库中,就接口层面而言,此处使用 get 和 post 方法均可获取数据):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import requests, json CLIENT_ID = "" CLIENT_SECRET = "" REFRESH_TOKEN = "" ANDROID_APPKEY = "" IOS_APPKEY = "" access_token = "" REFRESH_TOKEN_URL = "http://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}" USER_DATA_URL = "https://openapi.baidu.com/rest/2.0/mtj/svc/app/getDataByKey?access_token={ACCESS_TOKEN}&key={APP_KEY}&method=newuser/a&start-date={STARTDATE}000000&end-date={ENDDATE}232359&metrics=new_user_count,new_user_ratio,old_user_count,old_user_ratio,user_count,session_count,average_session_time,session_time_per_person" def refresh_token(): r = requests.get(REFRESH_TOKEN_URL.format(REFRESH_TOKEN=REFRESH_TOKEN,CLIENT_ID=CLIENT_ID,CLIENT_SECRET=CLIENT_SECRET)) result = r.json() access_token = result['access_token'] return access_token def get_user_data(start_date, end_date, app_type='ios'): if app_type == 'android': APP_KEY = ANDROID_APPKEY else: APP_KEY = IOS_APPKEY r = requests.post(USER_DATA_URL.format(ACCESS_TOKEN=access_token,APP_KEY=APP_KEY,STARTDATE=start_date, ENDDATE=end_date)) result = r.json() print(result) if 'error_code' not in result: return result elif result['error_code']==111: refresh_token() get_user_data(start_date, end_date, app_type) else: return if __name__ == '__main__': start_date = '20190712' end_date = '20190713' app_type = 'ios' get_user_data(start_date, end_date, app_type) |