在Google Ads API的GenerateKeywordIdeas中如何指定Exact匹配类型?
问题
原通过已弃用的AdWords API中TrafficEstimationService提取关键词流量信息,现迁移至Google Ads API v10实现相同需求,编写代码如下(初始化代码省略):
# [... some initialization (clients, service accounts, etc.) bits here] # fetch an instance of the Google Ads client gc = GoogleAdsClient.load_from_storage(gads_credentials_file, version="v10") # fetch an instance of the Google Ads service gs = gc.get_service("GoogleAdsService") # fetch an instance of the Geo Target Constant service gtcs = gc.get_service("GeoTargetConstantService").geo_target_constant_path # fetch an instance of the keyword plan idea service ks = gc.get_service("KeywordPlanIdeaService") # build the initial search request rq = gc.get_type("GenerateKeywordIdeasRequest") rq.customer_id = gads_account_id.replace("-", '') rq.geo_target_constants = [gtcs(get_location_id(gads_country))] rq.keyword_plan_network = (gc.enums.KeywordPlanNetworkEnum.GOOGLE_SEARCH_AND_PARTNERS) rq.language = gs.language_constant_path(get_language_id(gads_language)) rq.keyword_annotation = gc.enums.KeywordPlanKeywordAnnotationEnum if len(gads_keywords) > 0: rq.keyword_seed.keywords.extend(gads_keywords) # generate keyword ideas keyword_ideas = ks.generate_keyword_ideas(request=rq) rows = [] for idea in keyword_ideas: rows.append({ "date": r, "text": idea.text, "competition_value": idea.keyword_idea_metrics.competition.name, "avg_monthly_searches": idea.keyword_idea_metrics.avg_monthly_searches })
当前代码可指定地域、语言及种子关键词,成功获取到类似{'date': '2022-08-09', 'text': 'zapatos', 'competition_value': 'MEDIUM', 'avg_monthly_searches': 301000}的关键词数据,但需确保匹配类型为Exact(精确匹配),查阅KeywordPlanIdeaService文档及源码未找到相关参数,咨询是否可实现及具体方法。
解决方案
GenerateKeywordIdeasService确实不支持直接指定匹配类型,要获取精确匹配的关键词流量数据,需通过创建临时Keyword Plan的方式实现,具体步骤如下:
- 创建
KeywordPlanCampaign对象,设置地域、语言、网络等目标参数 - 创建
KeywordPlan关联到该Campaign - 创建
KeywordPlanAdGroup关联到该Keyword Plan - 创建
KeywordPlanKeyword,明确指定匹配类型为EXACT并关联到AdGroup - 通过
GoogleAdsService查询该计划的流量估算指标
修改后的核心代码示例:
# 替换原GenerateKeywordIdeas相关代码,改用Keyword Plan流程 import time # 获取所需服务类型 keyword_plan_service = gc.get_service("KeywordPlanService") keyword_plan_ad_group_service = gc.get_service("KeywordPlanAdGroupService") keyword_plan_ad_group_keyword_service = gc.get_service("KeywordPlanAdGroupKeywordService") keyword_plan_campaign_service = gc.get_service("KeywordPlanCampaignService") # 1. 创建Keyword Plan Campaign campaign_op = gc.get_type("KeywordPlanCampaignOperation") campaign = campaign_op.create campaign.name = f"Temp_Exact_Match_Campaign_{int(time.time())}" campaign.cpc_bid_micros = 1000000 # 1 USD,仅用于估算,不实际投放 campaign.geo_target_constants.append(gtcs(get_location_id(gads_country))) campaign.language_constants.append(gs.language_constant_path(get_language_id(gads_language))) campaign.keyword_plan_network = gc.enums.KeywordPlanNetworkEnum.GOOGLE_SEARCH_AND_PARTNERS # 创建Campaign campaign_response = keyword_plan_campaign_service.mutate_keyword_plan_campaigns( customer_id=gads_account_id.replace("-", ''), operations=[campaign_op] ) campaign_resource = campaign_response.results[0].resource_name # 2. 创建Keyword Plan plan_op = gc.get_type("KeywordPlanOperation") plan = plan_op.create plan.name = f"Temp_Exact_Match_Plan_{int(time.time())}" plan.campaign = campaign_resource plan_response = keyword_plan_service.mutate_keyword_plans( customer_id=gads_account_id.replace("-", ''), operations=[plan_op] ) plan_resource = plan_response.results[0].resource_name # 3. 创建Keyword Plan AdGroup ad_group_op = gc.get_type("KeywordPlanAdGroupOperation") ad_group = ad_group_op.create ad_group.name = f"Temp_Exact_Match_AdGroup_{int(time.time())}" ad_group.cpc_bid_micros = 1000000 ad_group.keyword_plan = plan_resource ad_group_response = keyword_plan_ad_group_service.mutate_keyword_plan_ad_groups( customer_id=gads_account_id.replace("-", ''), operations=[ad_group_op] ) ad_group_resource = ad_group_response.results[0].resource_name # 4. 添加精确匹配的关键词 keyword_ops = [] for kw_text in gads_keywords: keyword_op = gc.get_type("KeywordPlanAdGroupKeywordOperation") keyword = keyword_op.create keyword.text = kw_text keyword.match_type = gc.enums.KeywordMatchTypeEnum.EXACT keyword.keyword_plan_ad_group = ad_group_resource keyword_ops.append(keyword_op) keyword_response = keyword_plan_ad_group_keyword_service.mutate_keyword_plan_ad_group_keywords( customer_id=gads_account_id.replace("-", ''), operations=keyword_ops ) # 5. 获取精确匹配的流量估算数据 query = f""" SELECT keyword_plan_ad_group_keyword.text, keyword_plan_ad_group_keyword.match_type, keyword_plan_ad_group_keyword.keyword_idea_metrics.avg_monthly_searches, keyword_plan_ad_group_keyword.keyword_idea_metrics.competition FROM keyword_plan_ad_group_keyword WHERE keyword_plan_ad_group_keyword.keyword_plan_ad_group = '{ad_group_resource}' """ response = gs.search(customer_id=gads_account_id.replace("-", ''), query=query) rows = [] for row in response: keyword = row.keyword_plan_ad_group_keyword rows.append({ "date": r, "text": keyword.text, "match_type": keyword.match_type.name, "competition_value": keyword.keyword_idea_metrics.competition.name, "avg_monthly_searches": keyword.keyword_idea_metrics.avg_monthly_searches }) # 可选:删除临时创建的Keyword Plan资源,避免占用账号空间 # 删除关键词 cleanup_kw_ops = [] for kw_result in keyword_response.results: op = gc.get_type("KeywordPlanAdGroupKeywordOperation") op.remove = kw_result.resource_name cleanup_kw_ops.append(op) keyword_plan_ad_group_keyword_service.mutate_keyword_plan_ad_group_keywords( customer_id=gads_account_id.replace("-", ''), operations=cleanup_kw_ops ) # 删除AdGroup op = gc.get_type("KeywordPlanAdGroupOperation") op.remove = ad_group_resource keyword_plan_ad_group_service.mutate_keyword_plan_ad_groups( customer_id=gads_account_id.replace("-", ''), operations=[op] ) # 删除Plan op = gc.get_type("KeywordPlanOperation") op.remove = plan_resource keyword_plan_service.mutate_keyword_plans( customer_id=gads_account_id.replace("-", ''), operations=[op] ) # 删除Campaign op = gc.get_type("KeywordPlanCampaignOperation") op.remove = campaign_resource keyword_plan_campaign_service.mutate_keyword_plan_campaigns( customer_id=gads_account_id.replace("-", ''), operations=[op] )
说明
- 临时创建的Keyword Plan仅用于获取精确匹配的流量数据,不会产生实际投放行为
- 建议在获取数据后删除临时资源,避免账号内产生过多无效计划
- 流量估算指标与
GenerateKeywordIdeasService一致,但限定为精确匹配维度
内容的提问来源于stack exchange,提问作者Julio María Meca Hansen
相关产品推荐
相关产品推荐

