Facebook Ads API中get_results()长度与遍历结果不一致问题
问题原因与解决方法
原因分析
- 异步任务数据分批生成:Facebook Ads Insights的异步任务是逐步生成统计数据的。你调用
len(async_job.get_results())时,任务可能仅完成了25条数据的生成;等你执行for循环遍历的时候,任务已经生成了更多数据,两次调用get_results()拿到的是任务不同阶段的结果。 - Cursor对象的分页机制:
get_results()返回的是SDK的Cursor对象,len()方法默认只计算当前已加载的第一页数据量(Facebook API默认每页25条);而遍历Cursor时会自动触发后续分页请求,拉取所有页的完整数据,所以最终收集到的记录数更多。
解决方法
方法1:先一次性获取所有结果再操作
把Cursor转换成列表,让len计算和遍历都基于同一个固定数据集:
# 一次性拉取所有结果到列表 all_results = list(async_job.get_results()) # 此时len(all_results)就是总记录数 print(len(all_results)) # 遍历同一个列表收集数据 data_list = [] for item in all_results: data = item.export_data() data_list.append(data)
方法2:确保异步任务完全完成后再获取结果
在调用get_results()前,等待异步任务彻底完成,避免中途数据还在生成:
import time # 循环检查任务状态,直到完成 while async_job['async_status'] != 'Job Completed': time.sleep(5) # 每5秒刷新一次状态 async_job.refresh() # 任务完成后再获取所有结果 all_results = list(async_job.get_results()) data_list = [item.export_data() for item in all_results]
内容的提问来源于stack exchange,提问作者sai
相关产品推荐
相关产品推荐

