我的最终目标是在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)
我希望我的目标很明确。谢谢你的帮助!
答案 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
。