输入一个种子关键词,用 Python 调用大模型 API 批量生成相关长尾词、搜索意图分类和内容选题建议,一键导出 Excel,适合 SEO 新手快速起步。
你有没有这种经历:接手一个新网站的 SEO,老板让你先出一份关键词矩阵。你打开百度指数、5118、Ahrefs,翻了一下午,最后拼出来的表格丑得自己都不想看。
换个思路。用大模型帮你生成关键词初稿,再用 Python 整理成结构化表格。效率提升不止十倍。
项目背景
SEO 关键词研究的核心工作流是:
- 从种子词出发,找到更多相关关键词
- 判断每个词的搜索意图(信息型/交易型/导航型)
- 按主题聚类,规划内容板块
- 给每个关键词匹配对应的文章选题
手动做这些活,一个项目至少花两天。用 AI 辅助的话,半小时就能出初稿,你只需要在后面做人工审核和微调。
这个项目的目标就是:输入一个种子词,自动输出完整的关键词矩阵 Excel 表。
技术选型
| 组件 | 选型 | 理由 |
|---|---|---|
| 语言 | Python 3.10+ | 数据处理能力强 |
| 大模型 | OpenAI / 通义千问 / 智谱 API | 兼容多种供应商 |
| HTTP | httpx | 异步支持,并发更高效 |
| 数据处理 | pandas + openpyxl | 生成 Excel 表格 |
| 输出格式 | CSV + Excel | 双格式兼容 |
不需要数据库。所有数据存在内存里,跑完直接导出表格。
实现步骤
第一步:安装依赖
pip install httpx pandas openpyxl python-dotenv
就四个包。httpx 用来调 API,pandas 处理表格数据,openpyxl 写 Excel,dotenv 管密钥。
第二步:配置环境变量
在项目根目录创建 .env 文件:
# 支持 OpenAI 兼容 API(智谱、通义、本地部署均可)
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://api.openai.com/v1
MODEL_NAME=gpt-4o-mini
如果你用智谱清言,把 BASE_URL 换成 https://open.bigmodel.cn/api/paas/v4/,MODEL_NAME 换成 glm-4-flash。
第三步:创建关键词生成器 keyword_miner.py
import os
import json
import httpx
import pandas as pd
from dotenv import load_dotenv
from typing import List, Dict
load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = os.getenv("OPENAI_BASE_URL", "https://api.openai.com/v1")
MODEL = os.getenv("MODEL_NAME", "gpt-4o-mini")
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
PROMPT_KEYWORDS = """你是一个SEO专家。根据用户提供的种子关键词,生成50个相关的长尾关键词。
要求:
1. 覆盖不同搜索意图(信息型、交易型、比较型、导航型)
2. 包含问答型关键词(如"怎么..."、"...是什么")
3. 包含地域型关键词(如"北京..."、"...附近")
4. 每个关键词附带搜索意图标签
请严格按以下JSON格式输出,不要添加任何额外文字:
[
{{"keyword": "关键词文本", "intent": "informational|transactional|comparative|navigational", "category": "主题分类"}}
]"""
PROMPT_CONTENT_IDEAS = """你是一个内容策略师。根据以下关键词列表,为每个主题生成3个文章选题建议。
要求:
1. 选题要有差异化角度
2. 标注预估难度(低/中/高)
3. 标注建议字数范围
请严格按以下JSON格式输出:
[
{{"topic": "主题分类", "ideas": [
{{"title": "文章标题", "difficulty": "low|medium|high", "word_count": "1500-3000"}}
]}}
]"""
def generate_keywords(seed_keyword: str, count: int = 50) -> List[Dict]:
"""调用大模型生成关键词列表"""
prompt = PROMPT_KEYWORDS.replace("{seed}", seed_keyword)
response = httpx.post(
f"{BASE_URL}/chat/completions",
headers=HEADERS,
json={
"model": MODEL,
"messages": [
{"role": "system", "content": "你是专业的SEO关键词研究助手。"},
{"role": "user", "content": f"种子关键词:{seed_keyword}\n请生成{count}个相关长尾关键词。"}
],
"temperature": 0.8,
"response_format": {"type": "json_object"}
},
timeout=30
)
response.raise_for_status()
data = response.json()
# 解析返回的JSON
content = data["choices"][0]["message"]["content"]
keywords = json.loads(content)
if isinstance(keywords, dict) and "keywords" in keywords:
keywords = keywords["keywords"]
return keywords
def generate_content_ideas(keywords: List[Dict]) -> List[Dict]:
"""基于关键词生成内容选题建议"""
# 先按 category 分组
categories = {}
for kw in keywords:
cat = kw.get("category", "其他")
categories.setdefault(cat, []).append(kw["keyword"])
ideas = []
for category, kws in categories.items():
sample_kws = kws[:5] # 每类取5个代表词
prompt = f"""以下是"{category}"主题的关键词:
{', '.join(sample_kws)}
请为这个主题生成3个差异化文章选题建议。按JSON格式输出:
[
{{"title": "文章标题", "difficulty": "low|medium|high", "word_count": "1500-3000"}}
]"""
response = httpx.post(
f"{BASE_URL}/chat/completions",
headers=HEADERS,
json={
"model": MODEL,
"messages": [
{"role": "system", "content": "你是专业的内容策略师。"},
{"role": "user", "content": prompt}
],
"temperature": 0.7,
"response_format": {"type": "json_object"}
},
timeout=30
)
response.raise_for_status()
data = response.json()
content = json.loads(data["choices"][0]["message"]["content"])
ideas.append({
"category": category,
"ideas": content if isinstance(content, list) else [content]
})
return ideas
def export_results(keywords: List[Dict], ideas: List[Dict], filename: str = None):
"""导出为Excel和CSV"""
if filename is None:
from datetime import datetime
filename = f"keywords_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
df = pd.DataFrame(keywords)
# 统计各意图数量
intent_counts = df["intent"].value_counts().to_dict()
# 保存Excel
excel_path = f"{filename}.xlsx"
with pd.ExcelWriter(excel_path, engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="关键词列表", index=False)
# 写入意图分布表
intent_df = pd.DataFrame(list(intent_counts.items()), columns=["意图", "数量"])
intent_df.to_excel(writer, sheet_name="意图分布", index=False)
# 写入内容选题
if ideas:
ideas_flat = []
for item in ideas:
for idea in item.get("ideas", []):
ideas_flat.append({
"主题分类": item["category"],
"文章标题": idea.get("title", ""),
"预估难度": idea.get("difficulty", ""),
"建议字数": idea.get("word_count", "")
})
pd.DataFrame(ideas_flat).to_excel(writer, sheet_name="内容选题", index=False)
# 保存CSV
csv_path = f"{filename}.csv"
df.to_csv(csv_path, index=False, encoding="utf-8-sig")
print(f"✅ 已导出: {excel_path}, {csv_path}")
return excel_path, csv_path
def main():
seed = input("请输入种子关键词: ").strip()
if not seed:
print("❌ 关键词不能为空")
return
print(f"🔍 正在生成关键词(种子词: {seed})...")
keywords = generate_keywords(seed)
print(f"✅ 生成了 {len(keywords)} 个关键词")
print("\n📋 关键词预览:")
for i, kw in enumerate(keywords[:10], 1):
intent_map = {
"informational": "信息型",
"transactional": "交易型",
"comparative": "比较型",
"navigational": "导航型"
}
intent_cn = intent_map.get(kw.get("intent", ""), kw.get("intent", ""))
print(f" {i}. [{intent_cn}] {kw['keyword']} ({kw.get('category', '-')})")
print("\n💡 正在生成内容选题建议...")
ideas = generate_content_ideas(keywords)
print(f"✅ 生成了 {sum(len(item['ideas']) for item in ideas)} 个选题建议")
print("\n📁 正在导出结果...")
excel_path, csv_path = export_results(keywords, ideas)
print(f"\n🎉 完成!文件保存在: {excel_path}")
if __name__ == "__main__":
main()
代码不长,但覆盖了整个工作流:调 API 生成关键词 → 按主题分组 → 生成内容选题 → 导出 Excel。
几个关键点:
temperature设 0.8,让模型输出更有创意,不会千篇一律- 强制 JSON 格式输出,方便后续用 pandas 处理
- 内容选题是按 category 分组后逐类生成的,避免一次请求太长导致截断
- 导出同时生成 Excel 和 CSV,Excel 有三个 sheet,CSV 方便导入其他工具
第四步:运行示例
python keyword_miner.py
交互流程很简单:
请输入种子关键词: 智能手表推荐
🔍 正在生成关键词(种子词: 智能手表推荐)...
✅ 生成了 50 个关键词
📋 关键词预览:
1. [交易型] 2026年最佳智能手表推荐 (产品评测)
2. [信息型] 智能手表和手环有什么区别 (知识科普)
3. [交易型] 华为智能手表哪款性价比最高 (产品对比)
4. [信息型] 智能手表怎么测量睡眠质量 (功能指南)
5. [比较型] Apple Watch vs 华为 Watch GT (竞品对比)
...
💡 正在生成内容选题建议...
✅ 生成了 18 个选题建议
📁 正在导出结果...
✅ 已导出: keywords_20260615_103000.xlsx, keywords_20260615_103000.csv
打开 Excel 你会看到三个 sheet:关键词列表(含意图标签)、意图分布饼图数据、内容选题建议(含难度和字数)。直接拿去给老板汇报够用。
运行效果
生成的关键词矩阵长这样:
| 关键词 | 搜索意图 | 主题分类 |
|---|---|---|
| 2026年最佳智能手表推荐 | transactional | 产品评测 |
| 智能手表怎么配对手机 | informational | 使用指南 |
| 儿童智能手表哪个品牌好 | transactional | 人群细分 |
| 智能手表和运动手环区别 | informational | 知识科普 |
| Apple Watch Ultra 2 评测 | comparative | 竞品对比 |
| 北京智能手表维修店 | navigational | 地域服务 |
内容选题 sheet 会给每个主题分类配上 3 个文章标题,标注难度和建议字数。你直接照着写就行。
优化方向
这个项目跑通之后,还有很多可以加的地方:
- 接入真实搜索量数据:用 5118 或 SEMrush API 补充每个关键词的搜索量和竞争度,让优先级排序更准
- 批量处理多个种子词:加一个配置文件,一次跑 10 个种子词,生成完整的内容矩阵
- 竞品分析模式:输入竞争对手域名,反推他们的关键词布局,找他们的漏网之鱼
- 自动写大纲:每个选题建议直接生成文章大纲,包括 H2/H3 结构和内链建议
- 网页版界面:用 Streamlit 搭个简单的前端,不用敲命令就能用
- 本地化部署:用 Ollama + Llama 3 本地跑,完全免费,适合预算有限的团队
核心思路不变:让 AI 做信息收集和结构化,你做人脑的判断和润色。分工明确,效率最高。
试一个种子词,看看半小时能产出多少内容规划?
这篇文章对你有帮助吗?