百度统计 api 自动获取百度统计数据

文章目录[隐藏]

本文来源:https://zhuanlan.zhihu.com/p/45210545

实现目的:利用百度统计api 自动获取百度统计数据导入到mysql 数据库 ,利用分析工具可直接从myslq数据库进行导入

实现效果

代码

# -*- coding: utf-8 -*-
'''
Created on 2018/9/23 上午10:46
author: Kofi Wang
'''

# 导入所需要的库
from urllib import request
import json
import pandas as pd
import time
import pymysql
from sqlalchemy import create_engine
from retrying import retry
import datetime
from collections import defaultdict

# 创建日志文件,用于记录脚本运行时间与错误记录。
# 日志路径
logpath = 'c:/log/'
# 打开日志文件
log = open('{}baidu_log.txt'.format(logpath), 'a')
# 写入日期
log.write('{} begin to import. \n'.format(datetime.datetime.now()))

# 数据库设置
# connect信息 设置了python与数据库的连接,包含数据库的账号、密码、服务器地址、数据库名称
mysql_username = 'XXX'
mysql_password = 'XXX'
mysql_host = 'XXX'
mysql_database = 'XXX'
connect = create_engine('mysql+pymysql://{}:{}@{}/{}?charset=utf8'.format(mysql_username, mysql_password, mysql_host, mysql_database))
# 获取今天的日期
today_time = time.strftime('%Y%m%d', time.localtime())
today_time = pd.to_datetime(today_time)
diff = pd.to_timedelta('1 day')
  
# 获取昨天的日期
date = today_time - diff
date1 = date.strftime('%Y%m%d')
date2 = date.strftime('%Y-%m-%d')

# 获取用户的站点列表接口,获取当前用户下的站点和子目录列表,不包括权限站点和汇总网站。
site_url = 'https://api.baidu.com/json/tongji/v1/ReportService/getSiteList'
# 站点报告数据接口,根据站点 ID 获取站点报告数据。
data_url = 'https://api.baidu.com/json/tongji/v1/ReportService/getData'
# 百度统计登录用户名
username = 'XXX'
# 百度统计登录密码
password = 'XXX'
# 百度统计token,可以在百度统计-管理-数据导出服务页面获得
token = 'XXX'
# 站点Id,站点的百度统计报告页的URL中体现
site_id = XXX

# 各类报告的请求头
# 'name'的值请自行定义,用于在入库时,以此名称创建与匹配数据表
# 'header'中传入之前设置的账号信息
# 'body'中传入要获取的数据报告参数
# 所有来源
body_allsource = {'name': 'mb_hnhj_net_allsouce_pc',
                     'header': {'account_type': 1, 'password': password, 'token': token,
                                'username': username},
                     'body': {'site_id': site_id, 'method': 'source/all/a', 'viewType': 'site', 'max_results': 0,
                              'start_date': date1, 'end_date': date1,
                              'metrics': 'pv_ratio,visit_count,pv_count,new_visitor_count,new_visitor_ratio,ip_count,visitor_count,bounce_ratio,avg_visit_time,avg_visit_pages,trans_count,trans_ratio,income'}}

# 入口页面
body_landingpage = {'name': 'mb_hnhj_net_landingpage_pc',
                       'header': {'account_type': 1, 'password': password, 'token': token,
                                  'username': username},
                       'body': {'site_id': site_id, 'method': 'visit/landingpage/a', 'viewType': 'site',
                                'max_results': 0,
                                'start_date': date1, 'end_date': date1,
                                'metrics': 'out_pv_count,pv_ratio,visit_count,pv_count,new_visitor_count,new_visitor_ratio,ip_count,visitor_count,bounce_ratio,avg_visit_time,avg_visit_pages,trans_count,trans_ratio,income'}}
# 将请求头放入列表中
body_info_list = [body_allsource, body_landingpage]


# 'items'中的数据为指标数据,多个指标及其数据的字典在一个列表中,需要将这部分数据处理为Dataframe格式,以便与指标数值数据连接。
def json_merge(jsonfile):
    data_list = defaultdict(list)
    for I in jsonfile:
        for k, v in I[0].items():
            data_list[k].append(v)
    data = pd.DataFrame(dict(data_list))
    return data


# 清洗API返回的数据,转化为Dataframe格式
# 使用retry修饰器,在百度API抽风时,重新请求(等待时间在3-10秒之前随机取数,重试持续时间600秒)
@retry(wait_random_min=3000, wait_random_max=10000, stop_max_delay=600000)
def get_data(url, body):
    m = json.dumps(body)
    req = request.Request(url, m.encode(encoding='utf-8'))
    response = request.urlopen(req)
    data = response.read()
    data_json = json.loads(data)
    # 判断是否请求成功,如果为请求成功则重试
    if data_json['header']['desc'] != 'success':
        log.write('{} error. \n'.format(datetime.datetime.now()))
        raise Exception
    else:
        results_items = data_json['body']['data'][0]['result']['fields']
        data_items = json_merge(data_json['body']['data'][0]['result']['items'][0])
        data_results = pd.DataFrame(data_json['body']['data'][0]['result']['items'][1],
                                    columns=results_items[1:]).replace('—', 0)
        data = pd.concat([data_items, data_results], axis=1)
        return data


# 将数据入库
def data_to_sql(body_info):
    data = get_data(data_url, body_info)
    # 添加日期列
    data['date'] = [date2 for I in range(len(data))]
    data.to_sql(name='{}'.format(body_info['name']), con=connect, if_exists='append', index=False, index_label=False)
    log.write('{} {}to_sql done. \n'.format(datetime.datetime.now(), body_info['name']))

# 启动脚本
for I in body_info_list:
    data_to_sql(I)

# 关闭日志文件
log.close()

操作注意事项

  1. 必须要安装python 3环境
  2. c盘创建路径c:/log/
  3. 文中所有xxx需要填写你自己的内容

TongjiApiFile  百度统计api开发文档

相关推荐