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

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

8157
2022-08-22 19:37
2022-08-22 19:37
8157


今天向大家展示如何利用编程语言 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跨境头条,如有疑问,请联系客服。
最新热门报告作者标签
25年荷兰线上支出达357亿欧元,跨境网购订单增长9%
AMZ123获悉,近日,根据Thuiswinkel Market Monitor的数据,2025年荷兰消费者在线支出总额为357亿欧元,同比下降1%。相比之下,2024年在线支出为360亿欧元,同比增长5%。此前数据显示,2025年上半年在线支出为170亿欧元,同比下降1%,2025全年走势延续了这一变化趋势。从订单规模来看,2025年荷兰电商订单数量为3.47亿单,与2024年持平。这意味着在订单数量未增长的情况下,总体支出出现下降。分析指出,支出下降主要来自服务类消费。2025年,在线服务类订单数量下降11%,相关支出下降5%,为自2021年以来首次出现收缩。
25年俄罗斯电商市场增至13.4万亿卢布,增速放缓
AMZ123获悉,近日,根据Data Insight的数据,2025年俄罗斯电商市场订单总量达到83亿单,同比增长24%,但这一增速为过去八年来最低水平。与2025年相比,2023年订单量同比增长69%,2024年增长43%。分析认为,俄罗斯电商市场增长放缓不仅与市场逐步趋于饱和有关,也与商品整体价格上涨后消费者行为变化有关。Data Insight预计,订单数量增长将在2026—2027年继续放缓,其中2026年预计增长20%。从市场规模来看,2025年俄罗斯电商市场规模达到13.4万亿卢布,同比增长19%。不过,不同机构的统计存在差异。
京东收购欧洲电器巨头Ceconomy遇阻
AMZ123获悉,近日,据外媒报道,因奥地利加强监管,京东收购欧洲消费电子零售巨头Ceconomy的计划遭遇阻碍,为这项原本推进顺利的收购案增添了不确定性。Ceconomy是MediaMarkt和Saturn两大电器连锁品牌的母公司,在11个欧洲国家运营着超过1000家门店,年营收接近230亿美元,是欧洲规模最大的全渠道零售平台之一。京东自去年夏天开始逐步增持该公司股份,目前持股比例已超过85%,计划以25亿美元的价格完成全面收购。尽管该交易已获得法国、意大利等主要市场的批准,德国和西班牙也有望通过,但奥地利竞争管理局暂时阻止了交易的推进。
亚马逊告别运通,联手美国银行和万事达推出新卡
AMZ123获悉,据外媒报道,3月31日,亚马逊宣布,将终止与美国运通在小企业信用卡领域的八年合作,转而联合美国银行和万事达卡推出两款全新的商务信用卡。新产品计划于今年春季上线,8月14日正式完成过渡。此次推出的两款信用卡分别为“Prime商务卡”和“亚马逊商务卡”,均由美国银行发行,属于万事达网络体系,均不收取年费。Prime会员使用前者在亚马逊购物可获得5%返现,后者则为非Prime会员提供3%返现。两类卡片在亚马逊以外的消费场景同样可获得奖励,并配有灵活的信用条款。更多权益细节预计在未来几个月内陆续公布。亚马逊方面表示,此次调整旨在回应小企业客户对奖励获取能力和现金流管理工具的需求。
美客多关闭自有加密货币业务Mercado Coin
Fin123获悉,近日,拉美电商平台美客多宣布,自4月17日起,将关闭其自有加密货币Mercado Coin,用户将无法购买、出售或通过消费获得Mercado Coin返现。Mercado Coin最早于2022年8月在巴西上线,随后扩展至其他市场。该代币基于以太坊ERC-20标准构建,并与加密交易平台Ripio合作推出,主要用于奖励用户在平台上的消费行为。参与活动的商品会提供Mercado Coin代币奖励,用户可以将其用于后续购物抵扣,或选择提现。该功能通过Mercado Pago应用实现,作为美客多提升用户活跃度和消费频次的一种工具。
梅西起诉中国跨境卖家!单件索赔200万,世界杯风口变“封号风口”
近日,歌手李荣浩在社交平台连发“四连问”,控诉单依纯未经授权翻唱其代表作《李白》,该事件刷屏全网,让版权合规问
境外主体失效!亚马逊Q4报送港、美主体涉税数据
近期,跨境电商圈被一句 “不是说境外主体不报送吗?” 彻底刷屏。
世贸组织电商关税禁令谈判陷入僵局
AMZ123获悉,近日,据外媒报道,World Trade Organization(世贸组织)第14届部长级会议(MC14)围绕是否延长跨境电商关税禁令展开激烈讨论,但成员之间始终存在分歧。该禁令自1998年实施以来,要求各成员不对电商(如数字下载和在线服务)征收关税,并在过去近30年中每两年延长一次。在本次会议中,多方一度考虑将该禁令延长五年,甚至有草案提出将期限延长至2031年6月30日。然而,截至会议结束,各方仍未达成最终一致意见。会议在喀麦隆首都雅温得举行,为期四天,最终未能形成正式协议或部长宣言。
亚马逊生意,加速向少数卖家集中
“强者愈强、富者愈富”的马太效应,正在亚马逊美国站疯狂上演。来自Marketplace Pulse的最新数据显示,截至2026年2月,在亚马逊美国站上,仅7760名的头部卖家就包揽了平台第三方总GMV的50%,而这部分卖家占活跃卖家总数的比例仅为1.6%。对比三年前,这项数据呈现出的趋势更为显著:2023年贡献50%份额的卖家尚有15000名,不到三年时间,撑起亚马逊半壁江山的卖家数量几乎锐减了一半,财富集中度正急剧上升。属于草根卖家的野蛮生长时代,正在彻底宣告落幕。中国卖家们在性价比的战场上大打出手,在品牌化的舞台上却有些力不从心。
2026年亚马逊权重逻辑巨变:别再堆关键词了,AI正在“冷落”你的Listing
如果你的运营思路还停留在“堆砌大词、狂烧广告”,那么你的链接很可能正在被系统悄悄降权。
突发!亚马逊搜索页大变天,Rufus 直接 “抢” 走大词流量
亚马逊搜索页更新!Rufus 截流大词,卖家如何保住流量?
趣味开瓶器爆火,靠情绪价值在TikTok拿下百万GMV
近年来,从圣诞树造型的厨房隔热垫,马卡龙配色的高颜值五金工具,再到能在浴室K歌的麦克风花洒,不难看出这些TikTok爆品的共性在于,跳出了 “纯工具、纯实用” 的刻板框架,转而以颜值、趣味、娱乐社交属性等为突破口,给人耳目一新的体验感。近期在TikTok美区,又一司空见惯的厨房用品成为被“选中的孩子”,凭借赋能后的趣味技能点在酒桌上开辟出一片“整活修罗场”。01TikTok爆款开瓶器TT123观察到,在一周的TikTok美区视频带货热销榜,新入围了一款炒热酒桌氛围的神器,发令枪开瓶器。近一周时间, 这款产品在一则播放突破420万+视频的拉动下,成为炙手可热的单品。
霍尔木兹海峡突传大消息!伊朗拟参照苏伊士运河实施收费制度,特朗普再放狠话...
全球航运、能源运输“咽喉”再起波澜。当地时间3月30日,伊朗方面释放重磅信号——正考虑对通过霍尔木兹海峡的船只实施准入许可与收费制度,模式或参照苏伊士运河等国际水道。这一动向叠加当前中东紧张局势,引发航运、能源及金融市场高度关注。美国总统特朗普再次释放强硬的信号。他在社交媒体上表示,美伊之间的磋商“已取得重大进展”,但若短期内无法达成协议且海峡未恢复正常通航,美方可能对伊朗关键基础设施实施打击,包括发电站、油井以及重要能源枢纽哈尔克岛等。霍尔木兹海峡局势近日出现新的变化。
卖家必看!2026出海全链路行动指南
在全球贸易格局深度重构、跨境电商从规模扩张转向高质量发展的今天,中国品牌出海已迈入全新阶段:精细化运营、品牌化建设、本地化深耕、生态化协同成为出海企业的核心竞争力。面对合规门槛提升、消费者需求升级、市场竞争加剧的多重挑战,单打独斗的出海模式早已行不通,与专业生态伙伴一起价值拼合,成为品牌高效破局、降低风险、实现可持续增长的必然选择。为此,卧兔WotoHub联合YinoLink易诺、店匠Shoplazza、连连、云途物流五大出海生态领军者,重磅发布《2026品牌出海行动指南》。
境外主体也难逃!亚马逊Q4税务数据穿透公司外壳,直指中国卖家!
注册地不再是“护身符”,税务合规已成跨境生存底线!
《TikTok Shop 2025年度报告》PDF下载
2025年,TikTok Shop进一步加快扩张步伐,在巩固欧美成熟市场的同时,积极开拓新兴市场,先后上线德国、意大利、法国、日本等站点。此举不仅为平台带来新增量,也体现出其多元化市场战略的初步成效,以分散地缘政治风险。
《Shopee2025印尼站点X 汽车摩托品类专题》PDF下载
印尼当地汽车保有量并不高,每一千人的机动车保有量仅96人,未来可提升的空间仍大。空间参照系可以看泰国和马来,2024年泰国汽车保有量为322辆/千人,马来西亚为531辆/千人。
《2026年Shopee运动户外类目自行车爆品分享》PDF下载
巴西骑行爱好群体广泛,但平台上热销品呈现出的国际大牌极少,推测可能原因是国际品牌可能主要通过线下经销或自行渠道销售,未深度参与Shopee等本土电商。因此巴西用户在平台上几乎接触不到这些高端品牌产品。平台上巴西用户更倾向购买本土品牌的自行车,可能出于价格实惠和售后便利考虑。
2025年TikTok生态发展白皮书
2025年,全球内容电商迈入深度跃迁的新周期。TikTokShop正以前所未有的速度拓展市场版图,完成从高速增长向高质量增长的跃迁。在这一进程中,生态结构重构、参与者多元化、全球政策协同等因素叠加,构成内容电商演进的核心变量。
《2026美妆健康与保健创新报告》PDF下载
每年,我们都会分析美妆与个护以及健康与家居类目的动态变化。但2026 年呈现了一个意外的新现象:这两个类目不再孤立运营。美妆和健康正与食品杂货融合,形成由配方创新、成分病毒式传播和消费者行为演变所驱动的强大三方生态系统。
《中国宠物食品行业出海国别机会洞察报告》PDF下载
本报告旨在深入分析中国宠物食品的全球出口机遇与国别差异,通过对行业发展现状、出口趋势及各国政策环境的研究,揭示中国宠物食品企业在国际市场中的竞争优势与面临的潜在挑战。
《市场洞察:2025中国汽车出海英国市场动态追踪》PDF下载
根据英国汽车制造商与贸易商协会数据显示,2025年1-9月中国汽车出海英国累计销量142,684辆,同比增长91%,远超英国整体市场4.2%增速。中国汽车出海英国市场份额从年初5%升至9月12.4%,成为英国第二大汽车来源国,仅次于德国。
《2026取暖电器行业简析报告》PDF下载
系统梳理了行业发展脉络、市场格局与未来趋势。取暖电器按能源类型与产品形态可分为电取暖、燃气取暖、辅助本报告为 2026 年中国取暖电器行业专业简析,集成类三大核心品类,行业发展历经萌芽起步、快速成长、加速升级、高质量发展四大阶段,完成了从单一功能向智能化、节能化、场景化的全面演进。
跨境学院
跨境电商大小事,尽在跨境学院。
跨境科普达人
科普各种跨境小知识,科普那些你不知道的事...
跨境电商赢商荟
跨境电商行业唯一一家一年365天不断更的媒体!
亿邦动力网
消除一切电商知识鸿沟,每日发布独家重磅新闻。
北美电商资讯
AMZ123旗下北美跨境电商新闻栏目,专注北美跨境电商热点资讯,为广大卖家提供北美跨境电商最新动态、最热新闻。
AMZ123跨境电商
专注跨境行业热点事件报道,每日坚持推送原创深度热文
侃侃跨境那些事儿
不侃废话,挣钱要紧!
跨境平台资讯
AMZ123旗下跨境电商平台新闻栏目,专注全球跨境电商平台热点事件,为广大卖家提供跨境电商平台最新动态、最热新闻。
首页
跨境头条
文章详情
如何使用 Python 和批量操作创建完美的亚马逊活动结构?
跨境电商SellerWin
2022-08-22 19:37
8157


今天向大家展示如何利用编程语言 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% 亚马逊卖家都在关注的微信公众号

二维码

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

回顶部