尝试循环GA API结果

时间:2017-02-09 16:13:09

标签: python google-analytics-api

我的最终目标是在csv中导出同一帐户中多个属性的前500页。我有8个属性,所以我最后想要8个csv。

在开始之前,我希望能够为每个属性构建包含500页网址的多个列表。

因为我是python的新手,所以我一步一步地构建我的脚本。

首先,我正在构建个人资料ID列表:

profiles = service.management().profiles().list(
      accountId='XXXXX',
      webPropertyId='UA-XXXXXXX-XX').execute()

  for profile in profiles.get('items', []):
    list.append(profile.get('id'))

其次,我正在遍历此列表以获取每个配置文件的前500页:

  for item in list:
    test = service.data().ga().get(
      ids='ga:' + item,
      start_date='1daysAgo',
      end_date='today',
      metrics='ga:sessions',
      dimensions='ga:pagePath',
      sort='-ga:sessions',
      filters='ga:sessions>500').execute() 

第三个(这是事情变得复杂的地方)我想循环遍历test变量(?)的结果并添加到每个urls页面的新数组:

for row in test.get('rows'):
  rawdata.append(row)

在此阶段执行脚本时出现以下错误:

  File "test.py", line 71, in get_first_profile_id
    for row in test.get('rows'):
TypeError: 'NoneType' object is not iterable

以下是所有代码:

  profiles = service.management().profiles().list(
      accountId='5140486',
      webPropertyId='UA-5140486-16').execute()

  for profile in profiles.get('items', []):
    list.append(profile.get('id'))

  for item in list:
    test = service.data().ga().get(
      ids='ga:' + item,
      start_date='1daysAgo',
      end_date='today',
      metrics='ga:sessions',
      dimensions='ga:pagePath',
      sort='-ga:sessions',
      filters='ga:sessions>500').execute()

    for row in test.get('rows'):
      rawdata.append(row)

我希望我的目标很明确。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

对于您运行的至少一个值,您加载为test的数据没有rows键。当您为该项目调用test.get('rows')时,它会返回None(因为您没有为其指定不同的默认值)。当您尝试迭代行时,这会导致您的异常。

您可以使用test.get('rows', [])来避免异常(就像您在上面items profiles所做的那样)。您还可以使用list.extend而不是循环并重复调用append来简化操作:

profiles = service.management().profiles().list(
    accountId='XXXXX',
    webPropertyId='UA-XXXXXXX-XX').execute()

my_list.extend(profile.get('id') for profile in profiles.get('items', [])) # use extend

for item in my_list:  # it's a really bad idea to have a variable named list, so I renamed it
    test = service.data().ga().get(
        ids='ga:' + item,
        start_date='1daysAgo',
        end_date='today',
        metrics='ga:sessions',
        dimensions='ga:pagePath',
        sort='-ga:sessions',
        filters='ga:sessions>500').execute()

    rawdata.extend(test.get('rows', []))   # here too

请注意,这会默默地忽略丢失的数据。如果丢失数据是一件普通的事情,这可能会很好。但是,如果它不常见,您可能希望将其视为错误。一种简单的方法是使用test['rows']并在您想要处理问题的任何地方捕获KeyError