将pageToken与Google Analytics Reporting API v4和Python结合使用

将pageToken与Google Analytics Reporting API v4和Python结合使用,python,api,google-analytics,Python,Api,Google Analytics,我学习了一个教程,介绍了如何使用GA Reporting API使用Python从Google Analytics下载数据。我能够查询我想要的数据,尽管达到了行数限制。 我在文档中看到有一个pageToken可以避免这个问题。我已将此字段添加到我的请求中(如文档中所述),但我无法使其正常工作 sample_request = { 'viewId': '12345678', 'dateRanges': { 'startDate': datetime.st

我学习了一个教程,介绍了如何使用GA Reporting API使用Python从Google Analytics下载数据。我能够查询我想要的数据,尽管达到了行数限制。 我在文档中看到有一个pageToken可以避免这个问题。我已将此字段添加到我的请求中(如文档中所述),但我无法使其正常工作

sample_request = {
      'viewId': '12345678',
      'dateRanges': {
          'startDate': datetime.strftime(datetime.now() - timedelta(days = 30),'%Y-%m-%d'),
          'endDate': datetime.strftime(datetime.now(),'%Y-%m-%d')
      },
      'dimensions': [
          {'name': 'ga:date'},
          {'name': 'ga:dimension7'},
          {'name': 'ga:dimension6'},
          {'name': 'ga:dimension9'}
      ],
      'metrics': [
          {'expression': 'ga:users'},
          {'expression': 'ga:totalevents'}
      ],
      "pageSize": 100000,
      'pageToken': 'abc'
    }

response = api_client.reports().batchGet(
      body={
        'reportRequests': sample_request
      }).execute()

您将达到限制,但参数nextPageToken将允许您翻页浏览多行。例如:

def processReport (self, aDimensions):
    """Get a full report, returning the rows"""

    # Get the first set
    oReport   = self.getReport(aDimensions)
    oResponse = self.getResponse(oReport, True)
    aRows     = oResponse.get('rows')

    # Add any additional sets
    while oResponse.get('nextPageToken') != None:
        oResponse = self.getReport(aDimensions, oResponse.get('nextPageToken'))
        oResponse = self.getResponse(oResponse, False)
        aRows.extend(oResponse.get('rows'))

    return aRows
您可以在此处看到完整的程序: 我是这样解决的

def handle_report(analytics,pagetoken,rows):  

    response = get_report(analytics, pagetoken)

    columnHeader = response.get("reports")[0].get('columnHeader', {})
    dimensionHeaders = columnHeader.get('dimensions', [])
    metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])

    pagetoken = response.get("reports")[0].get('nextPageToken', None)
    rowsNew = response.get("reports")[0].get('data', {}).get('rows', [])
    rows = rows + rowsNew
    print("len(rows): " + str(len(rows)))

    if pagetoken != None:
        return handle_report(analytics,pagetoken,rows)
    else:
        return rows

def main():    
    analytics = initialize_analyticsreporting()

    global dfanalytics
    dfanalytics = []

    rows = []
    rows = handle_report(analytics,'0',rows)

    dfanalytics = pd.DataFrame(list(rows))

API可能已经设置了要提取的最大行数。检查文档中是否有任何限制。感谢您的回复!事实上,这是有限度的。尽管如此,您仍然可以使用pageToken参数来解决此问题。你是怎么做的其实是我的问题。谢谢你的评论。我编写了一个递归函数来检查请求是否返回nextPageToken,然后将该值分配给pageToken参数并执行另一个请求。显然,我没有收到任何下一次的回复。我检查了你的代码。看来你走对了方向。我会将pageSize参数降低很多,比如说10,然后看看是否能返回nextPageToken参数。这也是在测试时最小化流量的一个好方法。我仍然无法使用
pagesize:10
获得nextpGetOken参数,因此我现在完全失明。你有什么建议吗?我想出来了。我正在用
response.get('nextpGetOken')
检查参数。因为它是字典,所以我使用的是
response['reports'][0]['nextPageToken']
。现在它看到了,我可以使用递归函数了。非常感谢你的帮助!您好@E.Faslo和@Charlie Hileman,我正在尝试查询相同的报告,但没有成功,您能检查我的代码并告诉我您是否发现任何错误吗?即使在传递
pageToken
时,我仍然得到与以前相同的行。