🚀

AI 关键词挖掘工具:用 Python + 大模型自动生成 SEO 关键词矩阵和内容选题

输入一个种子关键词,用 Python 调用大模型 API 批量生成相关长尾词、搜索意图分类和内容选题建议,一键导出 Excel,适合 SEO 新手快速起步。

👁️ - 次阅读

你有没有这种经历:接手一个新网站的 SEO,老板让你先出一份关键词矩阵。你打开百度指数、5118、Ahrefs,翻了一下午,最后拼出来的表格丑得自己都不想看。

换个思路。用大模型帮你生成关键词初稿,再用 Python 整理成结构化表格。效率提升不止十倍。

项目背景

SEO 关键词研究的核心工作流是:

  • 从种子词出发,找到更多相关关键词
  • 判断每个词的搜索意图(信息型/交易型/导航型)
  • 按主题聚类,规划内容板块
  • 给每个关键词匹配对应的文章选题

手动做这些活,一个项目至少花两天。用 AI 辅助的话,半小时就能出初稿,你只需要在后面做人工审核和微调。

这个项目的目标就是:输入一个种子词,自动输出完整的关键词矩阵 Excel 表

技术选型

组件选型理由
语言Python 3.10+数据处理能力强
大模型OpenAI / 通义千问 / 智谱 API兼容多种供应商
HTTPhttpx异步支持,并发更高效
数据处理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 个文章标题,标注难度和建议字数。你直接照着写就行。

优化方向

这个项目跑通之后,还有很多可以加的地方:

  1. 接入真实搜索量数据:用 5118 或 SEMrush API 补充每个关键词的搜索量和竞争度,让优先级排序更准
  2. 批量处理多个种子词:加一个配置文件,一次跑 10 个种子词,生成完整的内容矩阵
  3. 竞品分析模式:输入竞争对手域名,反推他们的关键词布局,找他们的漏网之鱼
  4. 自动写大纲:每个选题建议直接生成文章大纲,包括 H2/H3 结构和内链建议
  5. 网页版界面:用 Streamlit 搭个简单的前端,不用敲命令就能用
  6. 本地化部署:用 Ollama + Llama 3 本地跑,完全免费,适合预算有限的团队

核心思路不变:让 AI 做信息收集和结构化,你做人脑的判断和润色。分工明确,效率最高。

试一个种子词,看看半小时能产出多少内容规划?

这篇文章对你有帮助吗?