AMZ123跨境卖家导航
拖动LOGO到书签栏,立即收藏AMZ123
首页跨境头条文章详情

如何使用 Python 和批量操作创建完美的亚马逊活动结构?

7082
2022-08-22 19:37
2022-08-22 19:37
7082


今天向大家展示如何利用编程语言 Python 和 Pandas 包来创建处理 Amazon 批量操作所需的电子表格。

  • 什么是亚马逊广告批量操作?

  • 什么是完美的广告系列结构?

  • 如何使用 Python 创建新的批量工作表?

  • 设置一些变量

  • 外部工作表的附加信息

  • 创建活动、广告组等的方法。

  • 启动一切的主要方法

  • 创建我们的亚马逊批量表

  • 概括

一、什么是亚马逊广告批量操作?

亚马逊广告批量操作(我们称之为批量工作表)是 Excel 表格,其中包含完整活动结构,包括相关的绩效指标。我们可以创建新的广告系列或使用批量表格更新现有的广告系列。还可以在此处找到下载和上传批量工作表的页面:


如果想批量创建或批量更新许多活动,而无需为每个活动逐一执行相同的操作,则批量工作表特别方便。

假设我们希望将 ACoS < 20 % 的 400 个商品推广活动中的每个活动的预算增加 10%。虽然我们可以在亚马逊的广告控制台中轻松做到这一点,但使用亚马逊的批量表格会更聪明。

它会像这样工作:

  • 从广告控制台下载最新的批量表

  • 例如 Microsoft Excel 中打开文件,然后转到“赞助产品”工作表

  • 过滤我们感兴趣的活动的工作表

  • 更改预算列,例如,使用临时列

  • 保存文件并将其重新上传到亚马逊

但是,今天我们不想着眼于更新现有的广告系列,而是为产品创建新的广告系列。

二、什么是完美的广告系列结构?

我们通常为单个产品或产品系列创建非常具体的活动。例如我们通常会创建以下手动商品推广活动:

  • 1 个具有通用关键字目标的广告系列(通用意味着关键字不包含任何品牌名称)

  • 1 个带有攻击性关键字目标的广告系列(攻击性意味着我们针对竞争对手的品牌)

  • 1 个具有攻击性产品目标的广告系列(即针对竞争对手的产品)

  • 1 个具有防御性关键字目标的广告系列(防御性意味着我们针对包含我们的品牌或产品名称的关键字)

  • 1 个具有防御性产品目标的广告系列(即针对我们的产品)

这样做是因为进攻性、通用性和防御性广告系列通常会显示非常不同的绩效指标,例如,竞标我们的品牌比竞标竞争对手的品牌“便宜”得多。通用运动通常比“进攻性”运动“昂贵”少,但另一方面,比“防御性”运动更昂贵。这意味着我们需要为每种类型设置不同的性能目标。如果 ACoS 是我们的主要目标,那么与防御活动相比,进攻活动需要更高的 ACoS 目标。

如果我们将所有目标都放在一个广告系列中,那么我们的情况就会好坏参半。当然,我们可以在目标级别管理此广告系列,但我们将如何分配预算?例如,将如何允许我们的防御性活动的预算高于我们的进攻性活动?这是不可能的。这是我们拆分广告系列的另一个原因。但是,为单个产品/产品系列创建这五个活动需要一些工作。这就是我们使用 Python 实现自动化的地方。

三、如何使用 Python 创建新的批量工作表?

要从头开始创建为给定产品创建有意义的活动的批量表,我们首先需要一些信息:

  • 应该宣传哪些 ASIN 或 SKU?

  • 自己和竞争对手的品牌是什么?

  • 要定位的关键字是什么?

  • 要定位的产品是什么?

我们需要组织这些信息,例如,在不同的 Excel-Sheet 或 Google Docs 中。我们将这些信息组织在单独的文本文件中。我们有其他脚本或多或少地自动创建这些文本文件,例如,从现有的(但无组织的)活动中创建。

(产品和关键字数据存储在不同的文本文件中)


我们为每个 ASIN、SKU 或 ASIN/SKU 组创建这些文件。然后脚本将遍历每个文件夹并为每个产品(组)创建这五个活动。因此唯一需要做的就是填充这些文件、运行脚本、上传批量工作表,然后就可以开始了。

以下是脚本的主要组成部分。显示每个代码行会占用太多位置,因此我们将专注于最重要的事情。

四、设置一些变量

由于我们将创建一个新的批量工作表,因此我们需要了解批量工作表及其不同实体的结构。与广告组或关键字目标相比,我们必须为广告系列定义不同的值。

例如,要创建一个新的广告系列,我们需要填写以下字段(如果我们下载,就会找到这些字段,例如,填充的批量表):

emptySpBulksheet ={    "Product":"Sponsored Products",    "Entity":"",    "Operation":"Create",    "Campaign Id":"",    "Ad Group Id":"",    "Portfolio Id":"",    "Ad Id (Read only)":"",    "Keyword Id (Read only)":"",    "Product Targeting Id (Read only)":"",    "Campaign Name":"",    "Ad Group Name":"",    "Start Date":"",    "End Date":"",    "Targeting Type":"",    "State":"",    "Daily Budget":"",    "SKU":"",    "ASIN":"",    "Ad Group Default Bid":"",    "Bid":"",    "Keyword Text":"",    "Match Type":"",    "Bidding Strategy":"",    "Placement":"",    "Percentage":"",    "Product Targeting Expression":""}

这些是需要填写的列。一些列属于特殊实体,例如,每日预算列仅指活动实体,对于品牌推广和展示推广活动,然后我们定义一些变量来定义脚本的行为。这里有些例子:

# CampaigncreateSPCampaigns =TruecampaignStatus ="Enabled"# Enter “Enabled”, “Paused”, or “Archived”campaignDailyBudget =20# EUR or USDcampaignBiddingStrategy ='Dynamic bids - down only'# Enter "Dynamic bids - down only", "Dynamic bids - up and down", or "Fixed bid".campaignStartDate = time.strftime("%Y%m%d")# Today as default, e.g. "20220529"campaignEndDate =""# “yyyymmdd”, can be empty# Adgroup (https://advertising.amazon.com/API/docs/en-us/bulk sheets/sp/sp-entities/sp-entity-ad-group)adgroupMaxBix =1.50 adgroupStatus ="Enabled"# Enter “Enabled”, “Paused”, or “Archived”# KeywordkeywordDefaultMatchType ='broad'negativeKeywordDefaultMatchType ='negativeExact'# negativePhrase or negativeExact# Toggles: Here you can define which type of targets to create (true) or not (false)addKeywordsGeneric   =TrueaddKeywordsDefensive =TrueaddKeywordsOffensive =FalseaddProductsOffensive =FalseaddProductsDefensive =False

我们对其他广告类型(SB、SD)执行相同的操作。

五、外部工作表的附加信息

有时我们还使用带有一些附加信息的 Excel 表格。与文本文件相比,使用 Excel 有时更容易。假设有一个单独的工作表,其中文件名存储在mainInputFile带有两张工作表的变量中:

  • 品牌和产品名称

  • 竞争对手的品牌和产品名称

要将这些品牌添加到我们的 python 脚本中,我们将执行以下操作:

# Read additional data from main input file (Google Doc -> Excel Sheet)xls = pd.ExcelFile(mainInputFile)dfB = pd.read_excel(xls, engine="openpyxl", sheet_name="Our brands")dfC = pd.read_excel(xls, engine="openpyxl", sheet_name="Competitor brands")ownBrands        = dfB['Brand'].unique().tolist()competitorBrands = dfC['Brand'].unique().tolist()# Make sure brands are lowercaseownBrands =list(map(str.lower, ownBrands))competitorBrands =list(map(str.lower, competitorBrands))

我们还做一些数据并将所有内容转换为小写,这使得以后的比较更容易。也可以将其硬编码到脚本中,但这种方法使其更加灵活,如果像我们那样与多个客户端一起工作,就很方便。

六、创建活动、广告组等的方法。

在下一步中需要定义一些函数/辅助方法,以便构建批量工作表。以下是创建结构化广告系列名称的示例,该名称也反映了广告系列的目标:

defgetCampaignName(targeting ="Manual", campaignType ="SP", type1="keyword", type2 ="generic", groupName ="default"):        prefix ="RE-"+ campaignType +"-"        # targeting    if targeting =="Manual":        targetingPrefix ="MANU-"    else:        targetingPrefix ="AUTO-"            # type1    if type1 =="keyword":        type1Prefix ="KW-"    else:        type1Prefix ="PT-"        # type 2    if type2 =="generic":        type2Prefix ="GEN-"    elif type2 =="offensive":        type2Prefix ="OFF-"    else:        type2Prefix ="DEF-"        groupName = groupName.strip()    groupName = groupName[:30].upper()        campaignName = prefix + targetingPrefix + type1Prefix + type2Prefix + groupName +'-'+ randomString        return campaignName

如上所见,我们的广告系列名称以前缀开头,因此可以轻松识别我们的广告系列。然后添加以下字符串:

  • “MANU”或“AUTO”,如果它是手动或自动活动(仅适用于商品推广活动)

  • “KW”或“PT”,如果它是关于关键字或产品定位的

  • 使用“GEN”、“OFF”或“DEF”表示目标类型(通用、进攻或防御)

  • 产品名称(组)

  • 每次运行脚本时都会更改的随机字符串

随机字符串使得过滤在单次运行中创建的活动变得容易,例如。如果犯了错误,我们可以轻松找到这些活动,例如,将它们存档并重新开始。然后我们创建不同的方法来创建实体,例如,这里有一个方法来填充创建活动所需的相关字段:

defcreateSpCampaign(targeting ="Manual", type1="none", type2 ="none", groupName ="none", customerPath ="none", counter =1, fileName =""):    global bulkSheetSp        campaignName = getCampaignName(targeting = targeting, campaignType ="SP", type1=type1, type2 = type2, groupName = groupName)        campaign = copy.deepcopy(emptySpBulksheet)# Create a deep copy        campaign['Entity']           ='Campaign'    campaign['Campaign Id']      = campaignName    campaign['Campaign Name']    = campaignName    campaign['Start Date']       = campaignStartDate    campaign['End Date']         = campaignEndDate    campaign['Targeting Type']   = targeting.upper()    campaign['State']            = campaignStatus    campaign['Daily Budget']     = campaignDailyBudget    campaign['Bidding Strategy']= campaignBiddingStrategy        if((bulkSheetSp['Entity']=='Campaign')&(bulkSheetSp['Campaign Id']== campaignName)).any():        pass# Do nothing, we already have this campaign    else:        bulkSheetSp = bulkSheetSp.append(campaign, ignore_index=True)        # Create adgroup              createSpAdgroup(targeting = targeting, type1=type1, type2 = type2, groupName = groupName, campaignName = campaignName, customerPath = customerPath, counter = counter, fileName = fileName)

首先复制我们的“空批量表”并用所有必要的数据填充它。然后,此方法调用 next 方法createSpAdgroup,该方法执行与上图类似的操作,仅针对广告组。这将传递给广告系列的所有信息也会传递给广告组。

此方法如下所示:

defcreateSpAdgroup(targeting ="Manual", type1="none", type2 ="none", groupName ="none", campaignName ='none', customerPath ="none", counter =1, fileName =""):        counterString =f"{counter:02}"        global bulkSheetSp        adgroupName  = getCampaignName(targeting = targeting, campaignType ="SP", type1=type1, type2 = type2, groupName = groupName)+'-AG'+'-'+ counterString        adgroup = copy.deepcopy(emptySpBulksheet)# Create a deep copy to not alter emptySpBulksheet        adgroup['Entity']        ='Ad Group'    adgroup['Campaign Id']   = campaignName    adgroup['Ad Group Name']= adgroupName    adgroup['Ad Group Id']   = adgroupName    adgroup['State']         = adgroupStatus    adgroup['Ad Group Default Bid']= adgroupMaxBix            bulkSheetSp = bulkSheetSp.append(adgroup, ignore_index=True)    # Create ad        createSpAd(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath)        if type1 =="keyword":        createSpKeywordTarget(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath, fileName = fileName)    if type1 =="product":        createSpProductTarget(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath)

我们以相同的方式定义了创建广告、关键字目标、产品目标、否定关键字等所需的所有其他方法。

七、启动一切的主要方法

然后需要我们的主脚本来启动它。比如这样:

if createSPCampaigns:        # Create empty bulksheet    bulkSheetSp = pd.DataFrame(data=emptySpBulksheet, index=[0])    # Get all products or product groups stored in different folders    productGroups = list_paths(customerPath)    productGroupsLength =len(productGroups)    j =0    randomString = randStr(N=5)# Create a random string    for productGroup in productGroups:                j = j +1                # Check which files are available        all_files =sorted(glob.glob(customerPath  +'/'+ productGroup +'/*.txt'))                counter =0        forfilein all_files:            if(addKeywordsOffensive)&('keywords-offensive.txt'infile):                createSpCampaign(targeting ="Manual", type1="keyword", type2 ="offensive", groupName = productGroup, customerPath = customerPath, fileName =file)                        if(addKeywordsGeneric ==True)&('keywords-generic.txt'infile):                counter = counter +1                createSpCampaign(targeting ="Manual", type1="keyword", type2 ="generic", groupName = productGroup, customerPath = customerPath, counter = counter, fileName =file)                        if(addKeywordsDefensive)&('keywords-defensive.txt'infile):                createSpCampaign(targeting ="Manual", type1="keyword", type2 ="defensive", groupName = productGroup, customerPath = customerPath, fileName =file)                        if(addProductsDefensive)&('products-defensive.txt'infile):                createSpCampaign(targeting ="Manual", type1="product", type2 ="defensive", groupName = productGroup, customerPath = customerPath, fileName =file)                        if(addProductsOffensive)&('products-offensive.txt'infile):                createSpCampaign(targeting ="Manual", type1="product", type2 ="offensive", groupName = productGroup, customerPath = customerPath, fileName =file)

出于教学原因,我删除了一些行,例如,在解析文件之前清理文件(删除空白行、删除重复的关键字等)。如果文件包含超过 1.000 个关键字,我们的脚本也会处理这种情况。如果使用排列,就会很快见效,因为我们想在广泛匹配的情况下使用词组匹配。

八、创建亚马逊批量表

最后但并非最不重要的一点是,我们需要将数据导出到 Excel 表,然后我们可以上传到亚马逊。

这像这样工作:

# Remove empty rowsif createSPCampaigns:    bulkSheetSp['Entity'].replace('', np.nan, inplace=True)    bulkSheetSp.dropna(subset=['Entity'], inplace=True)# Filenametoday = time.strftime("%Y-%m-%d-%H-%M")# Today as defaultoutputFile = customerPath +'/'+ today +'-'+ slugify(customer)+'-campaign-create-bulksheet.xlsx'outputFile = outputFile.replace("input-","")# Export to Excelwith pd.ExcelWriter(outputFile)as writer:      if createSPCampaigns:        bulkSheetSp.to_excel(writer, sheet_name='Sponsored Products Campaigns', index=False)

九、概括

一切就绪后,我们可以发挥创造力来快速填充这些 txt 文件或主输入表。以下是一些帮助大家入门的想法:

  • 根据品牌分析中的搜索词报告快速生成关键字和产品目标创意

  • 在这里也使用我们的亚马逊 SEO 研究中的关键字

如果我们的客户要求重新组织现有的活动并利用表现良好的关键字,例如,我们会解析现有的批量表并提取所有产品,包括。表现良好的目标。然后将每个目标放入正确的存储桶中,并在几分钟内运行脚本。

(免责声明:我们尊重原创。本平台提供的学习资料来源互联网和其它公众平台,主要目的在于分享信息,让更多人获得跨境行业学习资料,版权归原作者所有,内容仅供读者参考,如有侵犯您的权益或版权请及时告知我们,我们将尽快删除!)

免责声明
本文链接:
本文经作者许可发布在AMZ123跨境头条,如有疑问,请联系客服。
最新热门报告作者标签
26年澳洲情人节支出将达5.5亿澳元,消费意愿下降
AMZ123获悉,近日,根据澳大利亚零售协会(ARC)和Roy Morgan的最新调查,澳大利亚情人节的消费意愿出现明显下降,越来越多消费者在成本压力下减少对非必需品的支出,但参与者的平均支出仍保持稳定。调查显示,成本上涨正在持续影响家庭的可支配支出,许多家庭对非必需开支更加谨慎。今年仅有12%的澳大利亚成年人计划庆祝情人节,约为300万人,比去年下降4个百分点。与去年相比,计划为伴侣购买礼物的人数减少约80万人,主要原因是生活成本压力持续影响可自由支配支出。尽管参与人数下降,但澳大利亚情人节支出预计达到5.5亿澳元,较去年增长2.8%,人均支出约为152澳元。
Seedance2.0刷屏全网,TikTok卖家:红利来了!
字节正式发布Seedance2.0,TikTok卖家已经用上赚钱了!
月销数十万!这10个小众产品爆单亚马逊
AMZ123获悉,近日,亚马逊各类产品搜索量增长显著,以下10款产品在亚马逊上销量表现突出,深受消费者欢迎。1.修复眼罩预计销售额:50万美元/月销量:5000+星级评分:4.3好评数量:8,505+图源:亚马逊产品介绍:该修复眼罩主要是专为眼部抗衰老与焕亮设计,通过缓释视黄醇成分有效减少细纹、改善皮肤饱满度,并针对性缓解黑眼圈与浮肿问题。产品采用融合海藻提取物、神经酰胺及脂肪酸的复合配方,能在夜间修复阶段滋养娇嫩眼周肌肤。适用于熬夜、疲劳或重要场合前的密集护理,亦可作为礼品。品牌介绍:Grace &amp; Stella是一家成立于2016年的品牌,以“创造美好时刻”为核心理念,致力于通过日常护理提升生活品质。
Jumia 25财年营收1.9亿美元,同比增长13%
AMZ123获悉,近日,非洲电商平台Jumia发布了截至2025年12月31日的全年及第四季度财报。Jumia在2025年实现了GMV和收入增长,预计2026年有望保持强劲增长。以下为Q4财务亮点:①营收为6140万美元,同比2024年第四季度的4570万美元增长34%,按固定汇率计算增长24%。②GMV为2.795亿美元,同比2024年第四季度的2.061亿美元增长36%,按固定汇率计算增长23%。剔除南非和突尼斯市场,实物商品GMV同比增长38%。③运营亏损为1060万美元,同比2024年第四季度的1730万美元下降39%,按固定汇率计算下降22%。
血亏500万,跨境“黄金搭档”正式散伙
这两天,跨境圈又冒出一条不太体面的公告。不是封号,不是裁员,而是一场曾被寄予厚望的上市公司级合作,正式宣告失败。1月23日,浙江永强发布公告,确认与跨境大卖傲基股份中止跨境电商合作。双方通过互相转让子公司股权,彻底清空交叉持股关系。一句话概括这段合作的结局:故事很完整,结果很现实。图源网络,侵删01从制造+跨境的理想模版,到体面分手时间回到2023年11月。当时的傲基,已经完成从3C铺货向家居、家具赛道的转型;而浙江永强,作为国内户外家具龙头,正寻找新的增长出口。
暴涨94%!25年TikTok Shop全球GMV达643亿美元
AMZ123获悉,近日,据Momentum的最新报告显示,2025年,美国仍是TikTokShop最大的市场,GMV达到151亿美元,同比增长68%,高于2024年的90亿美元。尽管增速不及2024年爆发式增长,但仍显示出强劲扩张势头,反映出TikTok Shop正在从初期试验阶段向系统化运营阶段过渡。全球范围内,TikTok Shop在16个市场的总GMV达到643亿美元,同比大幅增长94%。其中,东南亚市场依然是主要增长引擎,2025年东南亚地区GMV同比增长一倍,达到456亿美元。马来西亚、印尼和泰国的增长最为突出,其中印尼市场达到131亿美元,成为TikTok Shop全球第二大市场。
新一轮物流危机来袭,大批跨境货物滞留港口!
腊月尾声,年味渐浓,状况频出的物流难题却成为了横亘在卖家面前的一头“年兽”。随着全国主要港口拥堵、陆路运费疯涨的事态持续升温,物流延误焦虑正在跨境电商行业蔓延。AMZ123了解到,春节前夕历来是跨境电商的出货高峰期——在国外不停卖、国内要放假、物流时效长、怕平台断货等多重因素的叠加影响下,大批卖家通常会抢在节前集中把货物发出。但在今年,这一出货高峰期带来的连锁效应格外汹涌。据物流人士透露,2026年2月,上海、宁波、盐田、南沙等主要港口都进入了超负荷运行状态,出现严重爆仓、收箱收紧等情况,导致大量卖家货物堆积在码头,面临甩柜率高企的风险。
巨额年终奖!跨境公司给员工发了200万
每逢年关,跨境打工人们总是格外悲喜交集。喜的是,春节假期、年终奖的发放近在咫尺,终于即将迎来“歇一口气”的休憩时间;悲的是,同样是辛勤奋战一年,有人硕果累累,喜提巨额年终奖,亦有人一无所获,铩羽而归。根据AMZ123此前发起的一项调查,今年约有68%的跨境打工人预计自己拿不到年终奖,32%能拿到年终奖的跨境打工人中,有22%的年终奖折算月薪在1至3个月区间。在一众感慨行业年终奖缩水的讨论中,深圳一家跨境企业发放巨额奖金的消息格外显眼。AMZ123获悉,这两天,#年终奖#、#原来你们真有年终奖啊# 等话题相继登上了热搜。其中,深圳3D打印公司员工最高拿到200万元年终奖的消息被多家媒体争相报道,成为了热议焦点。
月销百万美金!亚马逊10款高复购+高评分产品推荐
AMZ123获悉,近日,亚马逊各类产品搜索量增长显著,以下10款产品在亚马逊上销量表现突出,深受消费者欢迎。1. 智能戒指预计销售额:819万美元/月销量:32,050+星级评分:4.1好评数量:8,284+图源:亚马逊产品介绍:该智能戒指通过内置传感器持续监测用户的睡眠、活动、心率、体温变化等多项健康数据,并通过手机应用进行整合分析。产品采用全钛金属结构,支持全天候佩戴,具备防水性能和较长续航时间。相比传统可穿戴设备,其无屏幕设计降低了使用干扰,更侧重长期健康数据的连续采集与趋势分析。品牌介绍:Oura 是一家成立于 2013 年的芬兰健康科技公司,以智能戒指作为核心产品,聚焦睡眠与身体恢复管理。
月销数十万!这10个小众产品爆单亚马逊
AMZ123获悉,近日,亚马逊各类产品搜索量增长显著,以下10款产品在亚马逊上销量表现突出,深受消费者欢迎。1.修复眼罩预计销售额:50万美元/月销量:5000+星级评分:4.3好评数量:8,505+图源:亚马逊产品介绍:该修复眼罩主要是专为眼部抗衰老与焕亮设计,通过缓释视黄醇成分有效减少细纹、改善皮肤饱满度,并针对性缓解黑眼圈与浮肿问题。产品采用融合海藻提取物、神经酰胺及脂肪酸的复合配方,能在夜间修复阶段滋养娇嫩眼周肌肤。适用于熬夜、疲劳或重要场合前的密集护理,亦可作为礼品。品牌介绍:Grace &amp; Stella是一家成立于2016年的品牌,以“创造美好时刻”为核心理念,致力于通过日常护理提升生活品质。
26年英国情人节市场将达21亿英镑,送礼对象发生变化
AMZ123获悉,近日,根据全球礼品电商平台Flowwow发布的数据,英国情人节消费正在发生明显变化。消费者不再只为情侣准备礼物,而是将消费扩展至朋友、自己,甚至宠物。预计今年英国情人节销售额将达21亿英镑,电商平台订单量同比增长27%,客单价上涨68%至143英镑。在商品结构方面,花束仍然占主导地位,占总订单的89%,糖果占6%,气球占2%,显示传统礼品依然是主流,但品类正在逐步多元化。自我赠礼成为增长最快的细分领域。数据显示,英国情人节自我消费同比增长120%。这一趋势与英国整体健康和身心护理市场的扩张相关,该市场预计到2026年将达到410亿英镑。
新一轮物流危机来袭,大批跨境货物滞留港口!
腊月尾声,年味渐浓,状况频出的物流难题却成为了横亘在卖家面前的一头“年兽”。随着全国主要港口拥堵、陆路运费疯涨的事态持续升温,物流延误焦虑正在跨境电商行业蔓延。AMZ123了解到,春节前夕历来是跨境电商的出货高峰期——在国外不停卖、国内要放假、物流时效长、怕平台断货等多重因素的叠加影响下,大批卖家通常会抢在节前集中把货物发出。但在今年,这一出货高峰期带来的连锁效应格外汹涌。据物流人士透露,2026年2月,上海、宁波、盐田、南沙等主要港口都进入了超负荷运行状态,出现严重爆仓、收箱收紧等情况,导致大量卖家货物堆积在码头,面临甩柜率高企的风险。
波兰电商市场大变天!Temu用户数超2034万
AMZ123获悉,近日,据外媒报道,波兰电商市场的竞争格局正在经历一场深刻的转变。根据Mediapanel的数据,今年1月,Temu在波兰市场的实际用户数量已达到2034万,同比增长12.6%;而本土老牌电商Allegro用户数仅同比增长2.8%,达到1890万。除此之外,Temu凭借约68.0%的互联网用户覆盖率成为波兰触及面最广的电商平台,而Allegro的电商覆盖率为63.2%。除了Temu之外,还有两家来自中国的电商平台也位列波兰电商用户数排行榜前十。速卖通拥有1016万用户,同比上升2.7%,覆盖率达34%;Shein则拥有839万用户,覆盖率达28.1%。
Seedance2.0刷屏全网,TikTok卖家:红利来了!
字节正式发布Seedance2.0,TikTok卖家已经用上赚钱了!
暴涨94%!25年TikTok Shop全球GMV达643亿美元
AMZ123获悉,近日,据Momentum的最新报告显示,2025年,美国仍是TikTokShop最大的市场,GMV达到151亿美元,同比增长68%,高于2024年的90亿美元。尽管增速不及2024年爆发式增长,但仍显示出强劲扩张势头,反映出TikTok Shop正在从初期试验阶段向系统化运营阶段过渡。全球范围内,TikTok Shop在16个市场的总GMV达到643亿美元,同比大幅增长94%。其中,东南亚市场依然是主要增长引擎,2025年东南亚地区GMV同比增长一倍,达到456亿美元。马来西亚、印尼和泰国的增长最为突出,其中印尼市场达到131亿美元,成为TikTok Shop全球第二大市场。
《中企出海美国季度研究报告》PDF下载
近年来,随着全球化进程的深化与中国经济实力的持续提升,越来越多的中国企业将目光投向海外市场。美国作为全球最大经济体创新高地和消费市场,始终是中企出海战略中的关键目标。从制造业到科技领域,从消费品到金融服务,中国企业的国际化步伐不断加快,既彰显了“中国智造”的全球竞争力,也面临复杂的政策环境、文化差异与市场竞争等挑战。
《跨境蓝海拉美市场洞察 - 墨西哥篇》PDF下载
墨西哥位于北美大陆南部,北邻美国,政局稳定,法律健全,是拉丁美洲地区第一贸易大国和重要的外国直接投资目的地。墨西哥拥有 1.28亿人口,是仅次于巴西的拉美第二大经济体,同时也是拉美第三大线上零售市场,无论是互联网的普及率还是使用率在拉美市场都处于佼佼者。
《东南亚出海合规实操指南手册》PDF下载
近年来,东南亚电商市场以迅猛的增长态势成为全球贸易的新蓝海,印尼马来西亚、新加坡等六国凭借庞大的人口基数、持续提升的互联网渗透率吸引着无数中国卖家前来布局。
《2025中国新能源汽车产业链出海洞察报告 - 匈牙利篇》PDF下载
中国汽车市场新能源汽车渗透率已达50%,各主机厂纷纷开启价格战,让利消费者,并承担相应的利润损失,在中国新能源汽车市场逐渐成为红海的的大背景下,海逐渐成为各主机厂主动或被动的选择。
《2024哥伦比亚电商市场概览报告》PDF下载
哥伦比亚位于南美洲西北部,是拉丁美洲第三大国家,北部是加勒比海,东部与委内瑞拉接壤,东南方是巴西,南方是秘鲁和厄瓜多尔,西部是巴拿马和太平洋。

《2026独立站卖家日历》PDF下载
2026 独立站卖家日历 2026 全年营销节奏
《2025中东北非消费者数字经济报告》PDF下载
2025年的报告不仅持续跟踪数字经济的同比增长,也更深入:我们探讨了新兴技术对下一波数字化转型的影响力,还首次将中东北非国家及地区的消费者行为偏好与全球其他市场进行对比。
《2025年终大促旺季AI消费趋势报告》PDF下载
随着人工智能 AI的爆发式增长,如 ChatGPT、Perplexity 和Llama等交互式聊天机器人正在渐渐成为大众研究和推荐的首选工具。根据 AI智能体功能的更新迭代,目前已经可以完成网购下单、预订服务、及交易支付,现已被统称为 AI智能体电商Agentic Commerce,且其采用率正呈现出滚雪球式的增长。
AMZ123跨境电商
专注跨境行业热点事件报道,每日坚持推送原创深度热文
北美电商资讯
AMZ123旗下北美跨境电商新闻栏目,专注北美跨境电商热点资讯,为广大卖家提供北美跨境电商最新动态、最热新闻。
欧洲电商资讯
AMZ123旗下欧洲跨境电商新闻栏目,专注欧洲跨境电商热点资讯,为广大卖家提供欧洲跨境电商最新动态、最热新闻。
侃侃跨境那些事儿
不侃废话,挣钱要紧!
亚马逊全球开店
亚马逊全球开店官方公众号,致力于为中国跨境卖家提供最新,最全亚马逊全球开店资讯,运营干货分享及开店支持。
亚马逊公告
AMZ123旗下亚马逊公告发布平台,实时更新亚马逊最新公告,致力打造最及时和有态度的亚马逊公告栏目!
亚马逊资讯
AMZ123旗下亚马逊资讯发布平台,专注亚马逊全球热点事件,为广大卖家提供亚马逊最新动态、最热新闻。
跨境电商干货集结
跨境电商干货集结,是结合亚马逊跨境电商卖家交流群内大家在交流过程中最常遇到的问题,进行收集整理,汇总解答,将会持续更新大家当前最常遇见的问题。欢迎大家加入跨境电商干货集结卖家交流群一起探讨。
首页
跨境头条
文章详情
如何使用 Python 和批量操作创建完美的亚马逊活动结构?
跨境电商SellerWin
2022-08-22 19:37
7082


今天向大家展示如何利用编程语言 Python 和 Pandas 包来创建处理 Amazon 批量操作所需的电子表格。

  • 什么是亚马逊广告批量操作?

  • 什么是完美的广告系列结构?

  • 如何使用 Python 创建新的批量工作表?

  • 设置一些变量

  • 外部工作表的附加信息

  • 创建活动、广告组等的方法。

  • 启动一切的主要方法

  • 创建我们的亚马逊批量表

  • 概括

一、什么是亚马逊广告批量操作?

亚马逊广告批量操作(我们称之为批量工作表)是 Excel 表格,其中包含完整活动结构,包括相关的绩效指标。我们可以创建新的广告系列或使用批量表格更新现有的广告系列。还可以在此处找到下载和上传批量工作表的页面:


如果想批量创建或批量更新许多活动,而无需为每个活动逐一执行相同的操作,则批量工作表特别方便。

假设我们希望将 ACoS < 20 % 的 400 个商品推广活动中的每个活动的预算增加 10%。虽然我们可以在亚马逊的广告控制台中轻松做到这一点,但使用亚马逊的批量表格会更聪明。

它会像这样工作:

  • 从广告控制台下载最新的批量表

  • 例如 Microsoft Excel 中打开文件,然后转到“赞助产品”工作表

  • 过滤我们感兴趣的活动的工作表

  • 更改预算列,例如,使用临时列

  • 保存文件并将其重新上传到亚马逊

但是,今天我们不想着眼于更新现有的广告系列,而是为产品创建新的广告系列。

二、什么是完美的广告系列结构?

我们通常为单个产品或产品系列创建非常具体的活动。例如我们通常会创建以下手动商品推广活动:

  • 1 个具有通用关键字目标的广告系列(通用意味着关键字不包含任何品牌名称)

  • 1 个带有攻击性关键字目标的广告系列(攻击性意味着我们针对竞争对手的品牌)

  • 1 个具有攻击性产品目标的广告系列(即针对竞争对手的产品)

  • 1 个具有防御性关键字目标的广告系列(防御性意味着我们针对包含我们的品牌或产品名称的关键字)

  • 1 个具有防御性产品目标的广告系列(即针对我们的产品)

这样做是因为进攻性、通用性和防御性广告系列通常会显示非常不同的绩效指标,例如,竞标我们的品牌比竞标竞争对手的品牌“便宜”得多。通用运动通常比“进攻性”运动“昂贵”少,但另一方面,比“防御性”运动更昂贵。这意味着我们需要为每种类型设置不同的性能目标。如果 ACoS 是我们的主要目标,那么与防御活动相比,进攻活动需要更高的 ACoS 目标。

如果我们将所有目标都放在一个广告系列中,那么我们的情况就会好坏参半。当然,我们可以在目标级别管理此广告系列,但我们将如何分配预算?例如,将如何允许我们的防御性活动的预算高于我们的进攻性活动?这是不可能的。这是我们拆分广告系列的另一个原因。但是,为单个产品/产品系列创建这五个活动需要一些工作。这就是我们使用 Python 实现自动化的地方。

三、如何使用 Python 创建新的批量工作表?

要从头开始创建为给定产品创建有意义的活动的批量表,我们首先需要一些信息:

  • 应该宣传哪些 ASIN 或 SKU?

  • 自己和竞争对手的品牌是什么?

  • 要定位的关键字是什么?

  • 要定位的产品是什么?

我们需要组织这些信息,例如,在不同的 Excel-Sheet 或 Google Docs 中。我们将这些信息组织在单独的文本文件中。我们有其他脚本或多或少地自动创建这些文本文件,例如,从现有的(但无组织的)活动中创建。

(产品和关键字数据存储在不同的文本文件中)


我们为每个 ASIN、SKU 或 ASIN/SKU 组创建这些文件。然后脚本将遍历每个文件夹并为每个产品(组)创建这五个活动。因此唯一需要做的就是填充这些文件、运行脚本、上传批量工作表,然后就可以开始了。

以下是脚本的主要组成部分。显示每个代码行会占用太多位置,因此我们将专注于最重要的事情。

四、设置一些变量

由于我们将创建一个新的批量工作表,因此我们需要了解批量工作表及其不同实体的结构。与广告组或关键字目标相比,我们必须为广告系列定义不同的值。

例如,要创建一个新的广告系列,我们需要填写以下字段(如果我们下载,就会找到这些字段,例如,填充的批量表):

emptySpBulksheet ={    "Product":"Sponsored Products",    "Entity":"",    "Operation":"Create",    "Campaign Id":"",    "Ad Group Id":"",    "Portfolio Id":"",    "Ad Id (Read only)":"",    "Keyword Id (Read only)":"",    "Product Targeting Id (Read only)":"",    "Campaign Name":"",    "Ad Group Name":"",    "Start Date":"",    "End Date":"",    "Targeting Type":"",    "State":"",    "Daily Budget":"",    "SKU":"",    "ASIN":"",    "Ad Group Default Bid":"",    "Bid":"",    "Keyword Text":"",    "Match Type":"",    "Bidding Strategy":"",    "Placement":"",    "Percentage":"",    "Product Targeting Expression":""}

这些是需要填写的列。一些列属于特殊实体,例如,每日预算列仅指活动实体,对于品牌推广和展示推广活动,然后我们定义一些变量来定义脚本的行为。这里有些例子:

# CampaigncreateSPCampaigns =TruecampaignStatus ="Enabled"# Enter “Enabled”, “Paused”, or “Archived”campaignDailyBudget =20# EUR or USDcampaignBiddingStrategy ='Dynamic bids - down only'# Enter "Dynamic bids - down only", "Dynamic bids - up and down", or "Fixed bid".campaignStartDate = time.strftime("%Y%m%d")# Today as default, e.g. "20220529"campaignEndDate =""# “yyyymmdd”, can be empty# Adgroup (https://advertising.amazon.com/API/docs/en-us/bulk sheets/sp/sp-entities/sp-entity-ad-group)adgroupMaxBix =1.50 adgroupStatus ="Enabled"# Enter “Enabled”, “Paused”, or “Archived”# KeywordkeywordDefaultMatchType ='broad'negativeKeywordDefaultMatchType ='negativeExact'# negativePhrase or negativeExact# Toggles: Here you can define which type of targets to create (true) or not (false)addKeywordsGeneric   =TrueaddKeywordsDefensive =TrueaddKeywordsOffensive =FalseaddProductsOffensive =FalseaddProductsDefensive =False

我们对其他广告类型(SB、SD)执行相同的操作。

五、外部工作表的附加信息

有时我们还使用带有一些附加信息的 Excel 表格。与文本文件相比,使用 Excel 有时更容易。假设有一个单独的工作表,其中文件名存储在mainInputFile带有两张工作表的变量中:

  • 品牌和产品名称

  • 竞争对手的品牌和产品名称

要将这些品牌添加到我们的 python 脚本中,我们将执行以下操作:

# Read additional data from main input file (Google Doc -> Excel Sheet)xls = pd.ExcelFile(mainInputFile)dfB = pd.read_excel(xls, engine="openpyxl", sheet_name="Our brands")dfC = pd.read_excel(xls, engine="openpyxl", sheet_name="Competitor brands")ownBrands        = dfB['Brand'].unique().tolist()competitorBrands = dfC['Brand'].unique().tolist()# Make sure brands are lowercaseownBrands =list(map(str.lower, ownBrands))competitorBrands =list(map(str.lower, competitorBrands))

我们还做一些数据并将所有内容转换为小写,这使得以后的比较更容易。也可以将其硬编码到脚本中,但这种方法使其更加灵活,如果像我们那样与多个客户端一起工作,就很方便。

六、创建活动、广告组等的方法。

在下一步中需要定义一些函数/辅助方法,以便构建批量工作表。以下是创建结构化广告系列名称的示例,该名称也反映了广告系列的目标:

defgetCampaignName(targeting ="Manual", campaignType ="SP", type1="keyword", type2 ="generic", groupName ="default"):        prefix ="RE-"+ campaignType +"-"        # targeting    if targeting =="Manual":        targetingPrefix ="MANU-"    else:        targetingPrefix ="AUTO-"            # type1    if type1 =="keyword":        type1Prefix ="KW-"    else:        type1Prefix ="PT-"        # type 2    if type2 =="generic":        type2Prefix ="GEN-"    elif type2 =="offensive":        type2Prefix ="OFF-"    else:        type2Prefix ="DEF-"        groupName = groupName.strip()    groupName = groupName[:30].upper()        campaignName = prefix + targetingPrefix + type1Prefix + type2Prefix + groupName +'-'+ randomString        return campaignName

如上所见,我们的广告系列名称以前缀开头,因此可以轻松识别我们的广告系列。然后添加以下字符串:

  • “MANU”或“AUTO”,如果它是手动或自动活动(仅适用于商品推广活动)

  • “KW”或“PT”,如果它是关于关键字或产品定位的

  • 使用“GEN”、“OFF”或“DEF”表示目标类型(通用、进攻或防御)

  • 产品名称(组)

  • 每次运行脚本时都会更改的随机字符串

随机字符串使得过滤在单次运行中创建的活动变得容易,例如。如果犯了错误,我们可以轻松找到这些活动,例如,将它们存档并重新开始。然后我们创建不同的方法来创建实体,例如,这里有一个方法来填充创建活动所需的相关字段:

defcreateSpCampaign(targeting ="Manual", type1="none", type2 ="none", groupName ="none", customerPath ="none", counter =1, fileName =""):    global bulkSheetSp        campaignName = getCampaignName(targeting = targeting, campaignType ="SP", type1=type1, type2 = type2, groupName = groupName)        campaign = copy.deepcopy(emptySpBulksheet)# Create a deep copy        campaign['Entity']           ='Campaign'    campaign['Campaign Id']      = campaignName    campaign['Campaign Name']    = campaignName    campaign['Start Date']       = campaignStartDate    campaign['End Date']         = campaignEndDate    campaign['Targeting Type']   = targeting.upper()    campaign['State']            = campaignStatus    campaign['Daily Budget']     = campaignDailyBudget    campaign['Bidding Strategy']= campaignBiddingStrategy        if((bulkSheetSp['Entity']=='Campaign')&(bulkSheetSp['Campaign Id']== campaignName)).any():        pass# Do nothing, we already have this campaign    else:        bulkSheetSp = bulkSheetSp.append(campaign, ignore_index=True)        # Create adgroup              createSpAdgroup(targeting = targeting, type1=type1, type2 = type2, groupName = groupName, campaignName = campaignName, customerPath = customerPath, counter = counter, fileName = fileName)

首先复制我们的“空批量表”并用所有必要的数据填充它。然后,此方法调用 next 方法createSpAdgroup,该方法执行与上图类似的操作,仅针对广告组。这将传递给广告系列的所有信息也会传递给广告组。

此方法如下所示:

defcreateSpAdgroup(targeting ="Manual", type1="none", type2 ="none", groupName ="none", campaignName ='none', customerPath ="none", counter =1, fileName =""):        counterString =f"{counter:02}"        global bulkSheetSp        adgroupName  = getCampaignName(targeting = targeting, campaignType ="SP", type1=type1, type2 = type2, groupName = groupName)+'-AG'+'-'+ counterString        adgroup = copy.deepcopy(emptySpBulksheet)# Create a deep copy to not alter emptySpBulksheet        adgroup['Entity']        ='Ad Group'    adgroup['Campaign Id']   = campaignName    adgroup['Ad Group Name']= adgroupName    adgroup['Ad Group Id']   = adgroupName    adgroup['State']         = adgroupStatus    adgroup['Ad Group Default Bid']= adgroupMaxBix            bulkSheetSp = bulkSheetSp.append(adgroup, ignore_index=True)    # Create ad        createSpAd(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath)        if type1 =="keyword":        createSpKeywordTarget(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath, fileName = fileName)    if type1 =="product":        createSpProductTarget(targeting = targeting, type1=type1, type2=type2, groupName=groupName, campaignName=campaignName, adgroupName=adgroupName, customerPath = customerPath)

我们以相同的方式定义了创建广告、关键字目标、产品目标、否定关键字等所需的所有其他方法。

七、启动一切的主要方法

然后需要我们的主脚本来启动它。比如这样:

if createSPCampaigns:        # Create empty bulksheet    bulkSheetSp = pd.DataFrame(data=emptySpBulksheet, index=[0])    # Get all products or product groups stored in different folders    productGroups = list_paths(customerPath)    productGroupsLength =len(productGroups)    j =0    randomString = randStr(N=5)# Create a random string    for productGroup in productGroups:                j = j +1                # Check which files are available        all_files =sorted(glob.glob(customerPath  +'/'+ productGroup +'/*.txt'))                counter =0        forfilein all_files:            if(addKeywordsOffensive)&('keywords-offensive.txt'infile):                createSpCampaign(targeting ="Manual", type1="keyword", type2 ="offensive", groupName = productGroup, customerPath = customerPath, fileName =file)                        if(addKeywordsGeneric ==True)&('keywords-generic.txt'infile):                counter = counter +1                createSpCampaign(targeting ="Manual", type1="keyword", type2 ="generic", groupName = productGroup, customerPath = customerPath, counter = counter, fileName =file)                        if(addKeywordsDefensive)&('keywords-defensive.txt'infile):                createSpCampaign(targeting ="Manual", type1="keyword", type2 ="defensive", groupName = productGroup, customerPath = customerPath, fileName =file)                        if(addProductsDefensive)&('products-defensive.txt'infile):                createSpCampaign(targeting ="Manual", type1="product", type2 ="defensive", groupName = productGroup, customerPath = customerPath, fileName =file)                        if(addProductsOffensive)&('products-offensive.txt'infile):                createSpCampaign(targeting ="Manual", type1="product", type2 ="offensive", groupName = productGroup, customerPath = customerPath, fileName =file)

出于教学原因,我删除了一些行,例如,在解析文件之前清理文件(删除空白行、删除重复的关键字等)。如果文件包含超过 1.000 个关键字,我们的脚本也会处理这种情况。如果使用排列,就会很快见效,因为我们想在广泛匹配的情况下使用词组匹配。

八、创建亚马逊批量表

最后但并非最不重要的一点是,我们需要将数据导出到 Excel 表,然后我们可以上传到亚马逊。

这像这样工作:

# Remove empty rowsif createSPCampaigns:    bulkSheetSp['Entity'].replace('', np.nan, inplace=True)    bulkSheetSp.dropna(subset=['Entity'], inplace=True)# Filenametoday = time.strftime("%Y-%m-%d-%H-%M")# Today as defaultoutputFile = customerPath +'/'+ today +'-'+ slugify(customer)+'-campaign-create-bulksheet.xlsx'outputFile = outputFile.replace("input-","")# Export to Excelwith pd.ExcelWriter(outputFile)as writer:      if createSPCampaigns:        bulkSheetSp.to_excel(writer, sheet_name='Sponsored Products Campaigns', index=False)

九、概括

一切就绪后,我们可以发挥创造力来快速填充这些 txt 文件或主输入表。以下是一些帮助大家入门的想法:

  • 根据品牌分析中的搜索词报告快速生成关键字和产品目标创意

  • 在这里也使用我们的亚马逊 SEO 研究中的关键字

如果我们的客户要求重新组织现有的活动并利用表现良好的关键字,例如,我们会解析现有的批量表并提取所有产品,包括。表现良好的目标。然后将每个目标放入正确的存储桶中,并在几分钟内运行脚本。

(免责声明:我们尊重原创。本平台提供的学习资料来源互联网和其它公众平台,主要目的在于分享信息,让更多人获得跨境行业学习资料,版权归原作者所有,内容仅供读者参考,如有侵犯您的权益或版权请及时告知我们,我们将尽快删除!)

咨询
官方微信群
官方客服

扫码添加,立即咨询

加群
官方微信群
官方微信群

扫码添加,拉你进群

更多
订阅号服务号跨境资讯
二维码

为你推送和解读最前沿、最有料的跨境电商资讯

二维码

90% 亚马逊卖家都在关注的微信公众号

二维码

精选今日跨境电商头条资讯

回顶部