做内容的同学都懂找长尾词是个体力活。传统工具不是贵就是不准。这篇文章分享我用 SerpBase 做关键词挖掘的完整流程从采集到筛选到验证全部自动化。一、为什么我对传统关键词工具失望了我做的是技术博客的内容运营目标很明确找到有搜索量、竞争低、跟产品相关的长尾词然后写内容去覆盖。之前用过几个主流工具某知名SEO工具的关键词挖掘数据挺全但一个月 $99我这种小团队用不起Google Keyword Planner免费但给的数据太泛而且很多长尾词根本没覆盖到各种免费长尾词工具不是广告就是数据滞后半年参考价值有限5118/站长工具中文数据还行但技术类长尾词覆盖率一般最让我崩溃的是这些工具推荐的关键词10个里有8个我早就写过了。真正有价值的新词它们挖不出来。后来我想通了工具的数据库再大也大不过 Google 的索引。与其用二手数据不如直接去 Google 搜看用户到底在搜什么。二、核心思路用 Google 的Related Searches和PAA挖矿Google 搜索结果页里有两个宝藏区域Related Searches相关搜索在页面底部Google 主动告诉用户搜了这个的人还搜了什么People Also AskPAA页面中部用户常问的问题列表每个问题点开会展开更多这两个区域的数据有几个特点实时性强反映的是当前用户的真实搜索行为长尾词密集Related Searches 里大量是 3-5 个词的长尾查询意图明确PAA 直接告诉你用户在关心什么问题我的策略就是从一个种子词出发递归采集 Related Searches 和 PAA构建一个关键词树。三、技术实现3.1 基础采集模块importrequestsimportjsonimporttimefromtypingimportList,Set,Dictfromurllib.parseimportquote API_KEYYOUR_KEYBASE_URLhttps://api.serpbase.com/v1/searchclassKeywordMiner:def__init__(self,api_key:str):self.api_keyapi_key self.base_urlBASE_URL self.seen_queriesset()# 去重defsearch(self,query:str,gl:strus,hl:stren,num:int10)-Dict:ifqueryinself.seen_queries:return{}self.seen_queries.add(query)params{q:query,api_key:self.api_key,num:num,hl:hl,gl:gl}try:rrequests.get(self.base_url,paramsparams,timeout30)r.raise_for_status()returnr.json()exceptExceptionase:print(fSearch error for {query}:{e})return{}defextract_related(self,data:Dict)-List[str]:提取 Related Searchesrelateddata.get(related_searches,[])return[item.get(query,)foriteminrelatedifitem.get(query)]defextract_paa(self,data:Dict)-List[str]:提取 People Also Askpaadata.get(people_also_ask,[])return[item.get(question,)foriteminpaaifitem.get(question)]defmine(self,seed_keywords:List[str],depth:int2,gl:strus,hl:stren)-Dict[str,List[str]]: 递归挖掘 depth: 递归深度1种子词2种子相关词3再挖一层 all_keywords{related:[],paa:[],original_seeds:seed_keywords.copy()}current_levelseed_keywords.copy()fordinrange(depth):print(f\n 挖掘深度{d1})next_level[]forqueryincurrent_level:print(f 正在搜索:{query})dataself.search(query,glgl,hlhl)ifnotdata:continuerelatedself.extract_related(data)paaself.extract_paa(data)all_keywords[related].extend(related)all_keywords[paa].extend(paa)# 下一层的种子next_level.extend(related)time.sleep(0.8)# 控制 QPS别浪current_levellist(set(next_level))# 去重print(f 本层发现{len(current_level)}个新词)# 最终去重all_keywords[related]list(dict.fromkeys(all_keywords[related]))all_keywords[paa]list(dict.fromkeys(all_keywords[paa]))returnall_keywords3.2 运行示例minerKeywordMiner(api_keyYOUR_KEY)# 技术博客的种子词seeds[docker compose tutorial,python asyncio best practices,nextjs vs react]resultsminer.mine(seeds,depth2,glus,hlen)print(f\n原始种子:{len(results[original_seeds])}个)print(fRelated Searches:{len(results[related])}个)print(fPeople Also Ask:{len(results[paa])}个)print(f总计:{len(results[related])len(results[paa])}个)# 保存到文件withopen(mined_keywords.json,w,encodingutf-8)asf:json.dump(results,f,ensure_asciiFalse,indent2)3.3 实际跑出来的效果以 “docker compose tutorial” 为种子深度2第一层 Relateddocker compose tutorial for beginners, docker compose multiple containers, docker compose vs kubernetes…第二层从 “docker compose multiple containers” 继续挖docker compose mysql nodejs, docker compose nginx reverse proxy, docker compose env file…PAA 出来的问题What is the difference between docker compose and dockerfile? Is docker compose still used in 2025?深度2就能挖出 150-200 个词。如果深度3理论上能到 500但相关性会下降需要更强的过滤。四、关键词筛选不是所有词都值得写挖出来几百个词不可能全写。需要按规则筛选。4.1 筛选维度我定的规则长度过滤太短的词3个单词通常竞争大优先 4-8 个词的长尾去重和归一“docker compose” 和 “docker-compose” 算同一个词业务相关性包含种子词核心概念的保留完全无关的剔除问题词优先PAA 里的问题直接对应文章标题转化率通常更高importreclassKeywordFilter:def__init__(self,core_concepts:List[str]):core_concepts: 业务核心词比如 [docker, kubernetes, container]self.core_concepts[c.lower()forcincore_concepts]defis_relevant(self,keyword:str)-bool:kw_lowerkeyword.lower()returnany(conceptinkw_lowerforconceptinself.core_concepts)defnormalize(self,keyword:str)-str:归一化去掉多余空格统一连字符kwkeyword.lower().strip()kwre.sub(r\s, ,kw)kwkw.replace(-, )returnkwdeffilter_keywords(self,keywords:List[str],min_words:int4,max_words:int10)-List[Dict]:filtered[]seenset()forkwinkeywords:normalizedself.normalize(kw)ifnormalizedinseen:continueseen.add(normalized)word_countlen(normalized.split())ifnot(min_wordsword_countmax_words):continueifnotself.is_relevant(normalized):continue# 标记是不是问题is_questionany(normalized.startswith(w)forwin[what,how,why,when,where,is,does,can])filtered.append({keyword:normalized,word_count:word_count,is_question:is_question,priority:highifis_questionelsemedium})# 问题优先再按词长排序越长通常越精准filtered.sort(keylambdax:(0ifx[is_question]else1,-x[word_count]))returnfiltered# 使用filter_engineKeywordFilter(core_concepts[docker,container,kubernetes,compose])all_keywordsresults[related]results[paa]qualifiedfilter_engine.filter_keywords(all_keywords,min_words3,max_words12)print(f筛选后合格关键词:{len(qualified)}个)print(Top 10 问题词:)foritemin[kforkinqualifiedifk[is_question]][:10]:print(f ❓{item[keyword]})4.2 竞争度快速评估长尾词的竞争度不能只看工具给的 KD 值Keyword Difficulty那个算法各家不一样参考价值有限。我的土办法直接搜这个词看第一页都是什么站。defquick_competition_check(keyword:str,api_key:str)-Dict:快速评估竞争度params{q:keyword,api_key:api_key,num:10,hl:en,gl:us}rrequests.get(BASE_URL,paramsparams,timeout30)datar.json()organicdata.get(organic_results,[])big_sites[github.com,stackoverflow.com,medium.com,google.com,amazon.com,microsoft.com]big_site_count0total_resultslen(organic)foriteminorganic:domainitem.get(link,).split(/)[2].replace(www.,)ifany(bindomainforbinbig_sites):big_site_count1# 规则如果前10里超过7个是大站竞争度极高少于3个有机会competitionhighifbig_site_count7else(mediumifbig_site_count3elselow)return{keyword:keyword,big_sites_in_top10:big_site_count,competition_level:competition,top_domains:[item.get(link,).split(/)[2]foriteminorganic[:5]]}# 对筛选后的词批量评估foriteminqualified[:20]:# 先评估前20个checkquick_competition_check(item[keyword],API_KEY)item[competition]check[competition_level]time.sleep(0.5)这个评估虽然粗糙但比第三方工具的 KD 值更真实因为它看的是实际搜索结果。五、实战数据一周 200 个长尾词我把这套流程跑了一周数据如下步骤数量种子词15 个原始挖掘深度2680 个去重归一后420 个相关性过滤后245 个竞争度评估后low/medium198 个最终选题结合团队产能30 个也就是说一周时间我从 15 个种子词出发最终锁定了 30 个高价值选题。按我们一周产出 4-5 篇内容的速度这 30 个选题够写两个月。六、成本核算很多人关心 API 费用。我算一下15 个种子词 × 深度2 ≈ 15 80 200 295 次搜索挖掘阶段245 个词做竞争度评估 245 次搜索总计 ≈ 540 次搜索SerpBase 1 credit/次用 $3 的 Starter Boost1万次540 次只花了 $0.16就算后续每周补充新词一个月 2000 次搜索也绰绰有余。关键词挖掘这个环节一个月 API 成本不到 $1。七、几个踩坑点坑1PAA 展开的递归陷阱PAA 每个问题点开会展开更多问题理论上可以无限递归。但我发现展开到第3层后相关性急剧下降很多是广告导向的问题。建议只采集页面直接展示的 PAA不展开点击。SerpBase 返回的 PAA 默认就是页面加载时显示的够用了。坑2中英文混合词的编码问题如果做中文内容搜索词里有中英文混合比如Python教程记得设置hlzh-CN、glcn。我在这个参数上踩过坑默认英文设置下搜中文词结果质量很差。坑3Google 结果的地域差异同一个英文词glus和gluk的 Related Searches 差异很大。如果你的目标市场是英国千万别用美国的数据做内容规划。坑4别迷信长尾词数量深度3能挖出几千个词但大部分跟你业务无关。宁可少而精不要多而杂。我现在的做法是深度2 严格过滤产出质量反而比深度3好。八、总结这套关键词挖掘方案的核心就一句话Google 已经告诉你用户在搜什么了直接去拿就行不需要猜。传统关键词工具是二手数据而 Related Searches 和 PAA 是 Google 的一手推荐。用 SerpBase 这种搜索 API相当于自动化了这个采集过程低成本、高实时性、数据量大。如果你也在做内容运营建议你选 5-10 个核心种子词跑一遍我上面的流程。大概率你会发现一堆原来用户还在关心这个问题的惊喜。代码已经放出来了直接复制改改参数就能跑。有问题评论区交流。下一步我打算把挖掘出来的词和实际内容产出后的流量数据做个关联分析看哪些长尾词真的带来了流量哪些只是看起来美。等数据够了再写一篇复盘。