当前位置: 首页 > news >正文

用搜索API做关键词挖掘,我一周找到了200个长尾词

做内容的同学都懂,找长尾词是个体力活。传统工具不是贵就是不准。这篇文章分享我用 SerpBase 做关键词挖掘的完整流程,从采集到筛选到验证,全部自动化。

一、为什么我对传统关键词工具失望了

我做的是技术博客的内容运营,目标很明确:找到有搜索量、竞争低、跟产品相关的长尾词,然后写内容去覆盖

之前用过几个主流工具:

  • 某知名SEO工具的关键词挖掘:数据挺全,但一个月 $99,我这种小团队用不起
  • Google Keyword Planner:免费,但给的数据太泛,而且很多长尾词根本没覆盖到
  • 各种免费长尾词工具:不是广告就是数据滞后半年,参考价值有限
  • 5118/站长工具:中文数据还行,但技术类长尾词覆盖率一般

最让我崩溃的是,这些工具推荐的关键词,10个里有8个我早就写过了。真正有价值的新词,它们挖不出来。

后来我想通了:工具的数据库再大,也大不过 Google 的索引。与其用二手数据,不如直接去 Google 搜,看用户到底在搜什么

二、核心思路:用 Google 的"Related Searches"和"PAA"挖矿

Google 搜索结果页里有两个宝藏区域:

  1. Related Searches(相关搜索):在页面底部,Google 主动告诉用户"搜了这个的人还搜了什么"
  2. People Also Ask(PAA):页面中部,用户常问的问题列表,每个问题点开会展开更多

这两个区域的数据有几个特点:

  • 实时性强:反映的是当前用户的真实搜索行为
  • 长尾词密集:Related Searches 里大量是 3-5 个词的长尾查询
  • 意图明确:PAA 直接告诉你用户在关心什么问题

我的策略就是:从一个种子词出发,递归采集 Related Searches 和 PAA,构建一个关键词树

三、技术实现

3.1 基础采集模块

importrequestsimportjsonimporttimefromtypingimportList,Set,Dictfromurllib.parseimportquote API_KEY="YOUR_KEY"BASE_URL="https://api.serpbase.com/v1/search"classKeywordMiner:def__init__(self,api_key:str):self.api_key=api_key self.base_url=BASE_URL self.seen_queries=set()# 去重defsearch(self,query:str,gl:str="us",hl:str="en",num:int=10)->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:r=requests.get(self.base_url,params=params,timeout=30)r.raise_for_status()returnr.json()exceptExceptionase:print(f"Search error for '{query}':{e}")return{}defextract_related(self,data:Dict)->List[str]:"""提取 Related Searches"""related=data.get("related_searches",[])return[item.get("query","")foriteminrelatedifitem.get("query")]defextract_paa(self,data:Dict)->List[str]:"""提取 People Also Ask"""paa=data.get("people_also_ask",[])return[item.get("question","")foriteminpaaifitem.get("question")]defmine(self,seed_keywords:List[str],depth:int=2,gl:str="us",hl:str="en")->Dict[str,List[str]]:""" 递归挖掘 depth: 递归深度,1=种子词,2=种子+相关词,3=再挖一层 """all_keywords={"related":[],"paa":[],"original_seeds":seed_keywords.copy()}current_level=seed_keywords.copy()fordinrange(depth):print(f"\n=== 挖掘深度{d+1}===")next_level=[]forqueryincurrent_level:print(f" 正在搜索:{query}")data=self.search(query,gl=gl,hl=hl)ifnotdata:continuerelated=self.extract_related(data)paa=self.extract_paa(data)all_keywords["related"].extend(related)all_keywords["paa"].extend(paa)# 下一层的种子next_level.extend(related)time.sleep(0.8)# 控制 QPS,别浪current_level=list(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_keywords

3.2 运行示例

miner=KeywordMiner(api_key="YOUR_KEY")# 技术博客的种子词seeds=["docker compose tutorial","python asyncio best practices","nextjs vs react"]results=miner.mine(seeds,depth=2,gl="us",hl="en")print(f"\n原始种子:{len(results['original_seeds'])}个")print(f"Related Searches:{len(results['related'])}个")print(f"People Also Ask:{len(results['paa'])}个")print(f"总计:{len(results['related'])+len(results['paa'])}个")# 保存到文件withopen("mined_keywords.json","w",encoding="utf-8")asf:json.dump(results,f,ensure_ascii=False,indent=2)

3.3 实际跑出来的效果

以 “docker compose tutorial” 为种子,深度2:

  • 第一层 Related:docker 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 筛选维度

我定的规则:

  1. 长度过滤:太短的词(<3个单词)通常竞争大,优先 4-8 个词的长尾
  2. 去重和归一:“docker compose” 和 “docker-compose” 算同一个词
  3. 业务相关性:包含种子词核心概念的保留,完全无关的剔除
  4. 问题词优先: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_lower=keyword.lower()returnany(conceptinkw_lowerforconceptinself.core_concepts)defnormalize(self,keyword:str)->str:"""归一化:去掉多余空格,统一连字符"""kw=keyword.lower().strip()kw=re.sub(r'\s+',' ',kw)kw=kw.replace("-"," ")returnkwdeffilter_keywords(self,keywords:List[str],min_words:int=4,max_words:int=10)->List[Dict]:filtered=[]seen=set()forkwinkeywords:normalized=self.normalize(kw)ifnormalizedinseen:continueseen.add(normalized)word_count=len(normalized.split())ifnot(min_words<=word_count<=max_words):continueifnotself.is_relevant(normalized):continue# 标记是不是问题is_question=any(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":"high"ifis_questionelse"medium"})# 问题优先,再按词长排序(越长通常越精准)filtered.sort(key=lambdax:(0ifx["is_question"]else1,-x["word_count"]))returnfiltered# 使用filter_engine=KeywordFilter(core_concepts=["docker","container","kubernetes","compose"])all_keywords=results["related"]+results["paa"]qualified=filter_engine.filter_keywords(all_keywords,min_words=3,max_words=12)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"}r=requests.get(BASE_URL,params=params,timeout=30)data=r.json()organic=data.get("organic_results",[])big_sites=["github.com","stackoverflow.com","medium.com","google.com","amazon.com","microsoft.com"]big_site_count=0total_results=len(organic)foriteminorganic:domain=item.get("link","").split("/")[2].replace("www.","")ifany(bindomainforbinbig_sites):big_site_count+=1# 规则:如果前10里超过7个是大站,竞争度极高;少于3个,有机会competition="high"ifbig_site_count>=7else("medium"ifbig_site_count>=3else"low")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个check=quick_competition_check(item["keyword"],API_KEY)item["competition"]=check["competition_level"]time.sleep(0.5)

这个评估虽然粗糙,但比第三方工具的 KD 值更真实,因为它看的是实际搜索结果。

五、实战数据:一周 200 个长尾词

我把这套流程跑了一周,数据如下:

步骤数量
种子词15 个
原始挖掘(深度2)680 个
去重+归一后420 个
相关性过滤后245 个
竞争度评估后(low/medium)198 个
最终选题(结合团队产能)30 个

也就是说,一周时间,我从 15 个种子词出发,最终锁定了 30 个高价值选题。按我们一周产出 4-5 篇内容的速度,这 30 个选题够写两个月。

六、成本核算

很多人关心 API 费用。我算一下:

  • 15 个种子词 × 深度2 ≈ 15 + 80 + 200 = 295 次搜索(挖掘阶段)
  • 245 个词做竞争度评估 = 245 次搜索
  • 总计 ≈ 540 次搜索
  • SerpBase 1 credit/次,用 $3 的 Starter Boost(1万次),540 次只花了 $0.16

就算后续每周补充新词,一个月 2000 次搜索也绰绰有余。关键词挖掘这个环节,一个月 API 成本不到 $1

七、几个踩坑点

坑1:PAA 展开的递归陷阱

PAA 每个问题点开会展开更多问题,理论上可以无限递归。但我发现展开到第3层后,相关性急剧下降,很多是广告导向的问题。

建议:只采集页面直接展示的 PAA,不展开点击。SerpBase 返回的 PAA 默认就是页面加载时显示的,够用了。

坑2:中英文混合词的编码问题

如果做中文内容,搜索词里有中英文混合(比如"Python教程"),记得设置hl=zh-CNgl=cn。我在这个参数上踩过坑,默认英文设置下搜中文词,结果质量很差。

坑3:Google 结果的地域差异

同一个英文词,gl=usgl=uk的 Related Searches 差异很大。如果你的目标市场是英国,千万别用美国的数据做内容规划。

坑4:别迷信长尾词数量

深度3能挖出几千个词,但大部分跟你业务无关。宁可少而精,不要多而杂。我现在的做法是深度2 + 严格过滤,产出质量反而比深度3好。

八、总结

这套关键词挖掘方案的核心就一句话:Google 已经告诉你用户在搜什么了,直接去拿就行,不需要猜

传统关键词工具是"二手数据",而 Related Searches 和 PAA 是 Google 的"一手推荐"。用 SerpBase 这种搜索 API,相当于自动化了这个采集过程,低成本、高实时性、数据量大。

如果你也在做内容运营,建议你选 5-10 个核心种子词,跑一遍我上面的流程。大概率你会发现一堆"原来用户还在关心这个问题"的惊喜。

代码已经放出来了,直接复制改改参数就能跑。有问题评论区交流。


下一步我打算把挖掘出来的词和实际内容产出后的流量数据做个关联分析,看哪些长尾词真的带来了流量,哪些只是看起来美。等数据够了再写一篇复盘。

http://www.jsqmd.com/news/780579/

相关文章:

  • Go语言构建大语言模型API网关:xllm-go/bypass架构与实战
  • go语言:实现求 1 到 20 的所有数整除的最小正数算法(附带源码)
  • 如何理解 ES2019 后 sort 方法在各浏览器中的稳定性
  • 使用Taotoken CLI工具一键配置多开发环境下的AI助手接入
  • Dify应用——AI美妆护肤智能客服
  • 1 虚拟文件系统
  • Instagit:为AI编程助手注入源码洞察力,告别API幻觉与过时文档
  • 本地靠谱的定制软件开发公司供应商
  • 5G波形技术革新:块滤波OFDM与同频全双工实战验证
  • ConvNeXt优化扩散模型:高效图像生成新方案
  • 破解研发数字化转型中的协同效率瓶颈
  • LLM智能体记忆优化:RL驱动的mem-agent架构解析
  • OpenClaw开源项目:AI驱动机器人灵巧手抓取技术全解析
  • WebMCP:基于MCP协议的大模型与外部工具连接实战指南
  • 语音驱动AI智能体:从Whisper到工具调用的全链路实践
  • 语音技能开发框架解析:从事件驱动到插件化实现
  • 基于RAG与智能体的长链推理知识库问答系统架构与实践
  • Arm Neoverse V3AE核心架构解析与配置优化
  • AI Agent安全工程2026:越狱攻击、提示词注入与防御体系完整指南
  • AI智能体设计智库:从结构化数据到可编程设计技能
  • 基于Hermes协议与MQTT构建开源语音技能:从架构到部署实践
  • 经过1天的时间基本得出结论------看到的2个框其实是不同时间的同一个框
  • 构建可执行技能手册:开发者知识管理的GitHub实践
  • Linux sh文件报错: cannot execute: required file not found
  • 基于MCP协议实现AFFiNE知识库与AI助手深度集成:部署与实战指南
  • Linux动画光标主题制作:从Windows光标到XCursor的自动化转换
  • dsPIC30F实现AC感应电机控制的关键技术与实践
  • 2026年4月仓储货架供应商口碑推荐,家庭库房货架/公司库房货架/智能仓储货架/高层货架,仓储货架源头厂家口碑推荐 - 品牌推荐师
  • 别再用MNIST了!用Sklearn的load_digits数据集5分钟搞定你的第一个逻辑回归分类器
  • agent使用初体验