--永恒的烦恼

通过python获取百度统计API接口数据——百度账号版本

最近有需要,需要在网页前端显示网站流量,虽然可以自己做统计但不想浪费资源,所以就使用百度统计的接口,查了官方文档看得我有点懵逼,本来有点了解但是通过百度搜索相关文章,发现更让我无语,教程都是百度商业版本,简直就是。。。

本文章api接口是百度账号版本

一、获取数据API

开通数据,需要一定的条件,达不到条件的自己可以动手刷一下自己的网站。

获取到的数据分别为:API Key和Secret Key,后面的操作会用到这两个。

二、获取网站ID

网站ID是你获取数据对应的网站,下面的值所有站都是可以通用的,如果你想同时查询两个站,只需要运行两次查询,在获取网站流量数据的时候改这个值就可以了,获取如图下所示:

三、获取code值

 http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri=oob&scope=basic&display=popup

点击链接打开浏览器获取,链接里面的 {CLIENT_ID} 把它删除了,替换成步骤一获取到 API Key,例如我的:

http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=pPxxxxxxxxxxxxxxHvXz&redirect_uri=oob&scope=basic&display=popup

需要进行登录,复制code值,当执行下面步骤四获取access token值时,只有一次机会,访问过code就会发生变化,所以先不要急着关闭,后面可能还需用到。

四、获取access token值(可以不进行获取,程序获取)

注意:一旦你点击了链接,code的有效期只有一次,需要重新更新code值,这里你可以不进行操作,只需要操作上面三个步骤,这里是用来展示效果的。

http://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code={CODE}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri=oob

链接里面的{CLIENT_ID}填写你的API Key,{CLIENT_SECRET}填写你的Secret Key,{CODE}填写你刚才拿到的CODE。
你可以自己手动替换测试,它会返回几个值,其中重点是 ACCESS_TOKENREFRESH_TOKEN

五、运行程序条件以及其他

1.需要python3的requests模块,如果你没有安装请安装,在shell环境下,模块安装如下:

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

2.文件需要读写权限,在运行过程会创建baidu_token文件,这个文件保存着我们访问接口的token,更新token也是该文件。
3.默认只查询 网站概况(趋势数据),其中有浏览量、访客数、IP数。
4.一般而言获取到的数据应该提取生成其他数据文件,这样方便前端获取,但是这样需要一直运行且性能是也是问题,除非使用的是python的web框架,但我个人还是使用php,这里就不考虑了。
5.没有做实时访客,有需要的可以自己查看文档,只需要替换一下get_pv_uv_ip函数里面的url地址,响应的参数自己设置就可以了,实在是不懂的或者其他进群问我吧,有时间就回答。
以下是代码,根据上面获取到的值修改

import requests
import time
import json
import os

CLIENT_ID = '你的,值放在单引号里面'    # API Key
CLIENT_SECRET = '你的'  # Secret Key
siteId = '你的'    # 站点的id

home_time = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
stop_time = int(home_time.split(' ')[0].replace('-', '')) - 0     # 结束时间  减 0 是当天的时间,减 1 是昨天,减 2 是前天
start_time = stop_time - 2   # 开始时间  减2就是获取三天的数据

# 获取 code值 的地址,默认打印出来 不会进行访问
code_url = f'http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri=oob&scope=basic&display=popup'
print('请点击链接获取:',code_url)  # 请手动点击该链接,点击链接后进行登录,在登录成功的页面复制 code值,如果获取到了code_url则把它注释了
CODE = '215e190fa1ce17575f275a8db3e5cf98'  # 注意:以下的操作,当操作有误,code值就会改变,要重新填写新的code,值在上面这个链接获取

if len(CODE) < 15:
    print('CODE值有误,请重新填写')
    time.sleep(10000)

global ACCESS_TOKEN, REFRESH_TOKEN      # ACCESS_TOKEN的有效期为一个月, REFRESH_TOKEN是当ACCESS_TOKEN过期用来重新刷新使用的,有效期十年

# 读取文件
def read_token():
    with open('baidu_token.txt', 'r') as f:
        return f.read()

# 写入文件
def write_token(data):
    with open('baidu_token.txt', 'w') as f:
        f.write(data)

# 获取 ACCESS_TOKEN
def get_access_token(CODE, CLIENT_ID, CLIENT_SECRET):
    try:
        access_url = f'http://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code={CODE}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&redirect_uri=oob'
        access_data = requests.get(access_url)
        if access_data.status_code == 200:
            print('获取 ACCESS_TOKEN 成功,请重新运行')
            write_token(json.dumps(access_data.json()))
        elif access_data.status_code == 400:
            print('CODE值过期了,请重新获取填写', access_data.status_code)
    except Exception as e:
        print(e)

# 更新 ACCESS_TOKEN
def update_token(REFRESH_TOKEN, CLIENT_ID, CLIENT_SECRET):
    update_url = f'http://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}'
    update_data = requests.get(update_url)
    if update_data.status_code == 200:
        print('更新 ACCESS_TOKEN 成功,请重新运行')
        write_token(json.dumps(update_data.json()))
    else:
        print('更新 ACCESS_TOKEN 失败')

# 获取网站概况(趋势数据): 浏览量、访客数、IP数
def get_pv_uv_ip(access_token, siteId, start_time, stop_time):
    getapi_url = f'https://openapi.baidu.com/rest/2.0/tongji/report/getData?access_token={access_token}&site_id={siteId}&method=overview/getTimeTrendRpt&start_date={start_time}&end_date={stop_time}&metrics=pv_count,visitor_count,ip_count'
    getapi_data = requests.get(getapi_url)
    if getapi_data.status_code == 200:
        print('获取数据成功!')
        if getapi_data.json().get('error_msg'):
            print('Access token 过期了')
            update_token(REFRESH_TOKEN, CLIENT_ID, CLIENT_SECRET)
        return getapi_data.json()
    else:
        print('报错:未知原因,我暂时没遇到')
        return False

# 判断文件是否存在
if os.path.exists('baidu_token.txt'):
    try:
        token_data = json.loads(read_token())
        ACCESS_TOKEN = token_data.get('access_token')
        REFRESH_TOKEN = token_data.get('refresh_token')
    except Exception as e:
        print('报错:未知原因,我暂时没遇到')
        print(e)
else:
    get_access_token(CODE, CLIENT_ID, CLIENT_SECRET)

get_api = get_pv_uv_ip(ACCESS_TOKEN, siteId, start_time, stop_time)
if not get_api:
    print("没有获取到数据")
else:
    api_data = get_api.get('result')
    timeSpan = api_data.get('timeSpan')[0].split(' - ')
    items_time = api_data.get('items')[0]
    items_data = api_data.get('items')[1]
    for i in range(len(items_data)):
        print('从{}到{}的数据如下'.format(timeSpan[0], timeSpan[1]))
        print('日期:' + items_time[i][0])
        print('    浏览量PV:{} 访客数UV:{} IP 数:{}'.format(items_data[i][0], items_data[i][1], items_data[i][2]))
赞(2) 打赏
转载请带上源站链接:玖伴一鹏 » 通过python获取百度统计API接口数据——百度账号版本

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏