You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:40:27