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

在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的方式实现,具体步骤如下:

  1. 创建KeywordPlanCampaign对象,设置地域、语言、网络等目标参数
  2. 创建KeywordPlan关联到该Campaign
  3. 创建KeywordPlanAdGroup关联到该Keyword Plan
  4. 创建KeywordPlanKeyword,明确指定匹配类型为EXACT并关联到AdGroup
  5. 通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:03:29