Mailchimp API循环未迭代:仅导出单个活动数据问题排查
解决Mailchimp API批量导出活动收件人仅单条数据的问题
问题描述
我尝试通过Mailchimp API获取所有邮件活动的收件人列表,编写了如下代码:
获取所有活动ID及名称的代码
try: client = MailchimpMarketing.Client() client.set_config({ "api_key": "xxxx", "server": "xxx" }) response_id = client.campaigns.list(count=1000) df_full = pd.json_normalize(response_id['campaigns']) df_id = df_full['id'] df_id = df_id.values.tolist() df_id_camp_name = df_full[['id','settings.subject_line']] #display(df_id) except ApiClientError as error: print("Error: {}".format(error.text))
遍历活动ID批量导出收件人的代码
for id in df_id: try: client = MailchimpMarketing.Client() client.set_config({ "api_key": "xxxxx", "server": "xxxx" }) response_open = client.reports.get_campaign_recipients(id, count=1000) df_open = pd.json_normalize(response_open['sent_to']) df_open_full = df_open.append(df_open) except ApiClientError as error: print("Error: {}".format(error.text)) df_open_full.to_excel("campaign_reports_mailchimp.xlsx")
但实际生成的Excel仅包含单个活动的数据,循环未完成预期的迭代。已知API有计数限制,但理论上循环应自动处理下一个ID,请问问题出在哪里?
问题原因分析
- 总数据框未初始化且覆盖赋值:循环内每次直接将
df_open_full赋值为当前活动数据的自追加,没有提前创建空DataFrame存储累积数据,最终只会保留最后一次循环的结果。 - 重复初始化客户端:每次循环都重新创建并配置Mailchimp客户端,既浪费资源又可能引发不必要的连接问题。
- 未处理API分页:即使设置了
count=1000,单个活动收件人超过1000条时,只会获取第一页数据,遗漏后续内容。
修正后的代码
优化后的活动ID获取代码
import pandas as pd from mailchimp_marketing import Client from mailchimp_marketing.api_client import ApiClientError try: # 仅初始化一次客户端,避免重复配置 client = MailchimpMarketing.Client() client.set_config({ "api_key": "xxxx", "server": "xxx" }) response_id = client.campaigns.list(count=1000) df_full = pd.json_normalize(response_id['campaigns']) df_id = df_full['id'].values.tolist() df_id_camp_name = df_full[['id','settings.subject_line']] except ApiClientError as error: print("Error: {}".format(error.text))
批量获取并合并收件人数据的代码
# 提前初始化空DataFrame,用于存储所有活动的收件人数据 df_open_full = pd.DataFrame() for campaign_id in df_id: try: # 处理API分页,确保获取当前活动的全部收件人 offset = 0 while True: response_open = client.reports.get_campaign_recipients( campaign_id, count=1000, offset=offset ) batch_df = pd.json_normalize(response_open['sent_to']) # 添加活动ID和主题,方便后续区分数据归属 batch_df['campaign_id'] = campaign_id batch_df['campaign_subject'] = df_id_camp_name[df_id_camp_name['id'] == campaign_id]['settings.subject_line'].values[0] # 追加到总数据框,避免覆盖 df_open_full = pd.concat([df_open_full, batch_df], ignore_index=True) # 判断是否还有下一页数据 if len(response_open['sent_to']) < 1000: break offset += 1000 except ApiClientError as error: print(f"活动ID {campaign_id} 处理出错: {error.text}") # 导出到Excel,去掉默认索引 df_open_full.to_excel("campaign_reports_mailchimp.xlsx", index=False)
关键优化点
- 提前初始化总数据框:循环前创建空的
df_open_full,使用pd.concat追加新数据,避免每次循环覆盖已有内容。 - 复用客户端实例:仅在开头初始化一次Mailchimp客户端,减少重复配置的开销。
- 处理API分页逻辑:通过
offset参数遍历所有分页数据,确保单个活动的收件人全部被获取。 - 添加活动标识字段:将活动ID和主题加入数据,方便后续区分不同活动的收件人。
内容的提问来源于stack exchange,提问作者Matias Tiberio
相关产品推荐
相关产品推荐

