如何基于Facebook Business API异步任务分页获取Insights API完整结果集?
如何实现Facebook Insights API异步请求的完整分页获取?
我懂你现在的困扰——用异步方式请求Insights数据时,get_result默认只能返回1000行,没法拿到全量的结果集。其实Facebook的API分页是通过**游标(cursor)**来实现的,我们只需要在循环里不断请求下一页数据,直到没有更多内容为止。
下面是修改后的完整代码,已经加入了分页逻辑:
import time import os from facebook_business.api import FacebookAdsApi from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.adreportrun import AdReportRun from facebook_business.adobjects.adsinsights import AdsInsights # 初始化API fb_api = FacebookAdsApi.init(access_token=os.getenv('USER_API_TOKEN')) account = AdAccount('act_{}'.format(os.getenv('ADS_ACCT_ID'))) date_start = "2021-03-15" date_end = "2021-03-21" args = dict( fields=[ AdsInsights.Field.campaign_name, AdsInsights.Field.ad_name, AdsInsights.Field.clicks, ], params={ 'time_range': { 'since': date_start, 'until': date_end, }, 'level': 'ad', 'time_increment': 1 }, is_async=True, ) # 启动异步任务并等待完成 async_job = account.get_insights(**args) async_job.api_get() while async_job[AdReportRun.Field.async_status] != "Job Completed": time.sleep(10) async_job.api_get() time.sleep(10) # 分页获取全量数据 all_data = [] # 第一次请求,获取第一页和分页信息 current_page = async_job.get_result(params={"limit": 1000}) all_data.extend(current_page) # 循环获取下一页,直到没有更多数据 while 'paging' in current_page and 'cursors' in current_page['paging'] and 'after' in current_page['paging']['cursors']: after_cursor = current_page['paging']['cursors']['after'] # 带上after游标请求下一页 current_page = async_job.get_result(params={"limit": 1000, "after": after_cursor}) all_data.extend(current_page) # 可选:添加延时避免触发API频率限制 time.sleep(1) # 现在all_data里就是完整的结果集 print(f"共获取到 {len(all_data)} 条数据")
关键逻辑说明:
- 初始化存储容器:用
all_data列表来累积所有分页返回的数据 - 首次请求:拿到第一页数据和分页游标信息
- 循环分页请求:检查返回结果的
paging.cursors.after字段,如果存在,就带着这个游标参数继续请求下一页,直到没有after游标为止 - 频率控制:添加短延时(比如1秒)可以降低触发Facebook API频率限制的风险
额外注意事项:
- Facebook API的分页游标(
after)有效期较短,建议在异步任务完成后立即处理分页请求 - 单次请求的
limit最大为1000,这是Facebook API的硬性限制,无法调整 - 如果数据量极大,建议加入异常捕获逻辑,处理请求失败、超时等情况
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

