用 Python + OpenAI API 写一个博客 SEO 分析工具,自动检查关键词密度、生成内链建议、给标题打分,让你的每一篇文章都更容易被搜索引擎收录。
你有没有写过一篇好文章,但搜了半天还是找不到?
内容不错,排版也好看,可就是上不了搜索引擎的前几页。问题往往出在细节上——关键词密度不够、标题没吸引力、内链太少。手动检查太费时间,一篇篇文章翻过去,效率极低。
这个工具帮你自动化这件事。输入一篇 Markdown 格式的文章,它自动分析关键词密度、标题质量、内链建议,还能给出优化后的改写版本。
项目背景
个人博客、技术网站的内容创作者经常面临同样的问题:
- 不知道关键词密度是否合理
- 标题没有经过 SEO 优化
- 文章之间缺乏内链关系
- 发布后才发现问题,改起来很麻烦
传统 SEO 工具要么太重(Semrush、Ahrefs),要么不支持中文。我们需要的是一个轻量级的、能跑在本地的小工具。
这个项目用 Python 写,核心思路很简单:读取文章文本,做基础统计,再用 AI 做深度分析。
技术选型
| 组件 | 选型 | 理由 |
|---|---|---|
| 语言 | Python 3.10+ | 脚本开发快,生态丰富 |
| NLP | jieba | 中文分词首选 |
| AI | OpenAI API(兼容接口) | 做语义分析和改写 |
| 统计 | collections.Counter | 词频统计 |
| 配置 | YAML | 灵活定义关键词和目标密度 |
| 定时 | cron | 发布前自动检查 |
不需要数据库,不需要前端。纯命令行工具,集成到你的写作流程里就行。
实现步骤
第一步:安装依赖
pip install jieba openai pyyaml requests
第二步:创建配置文件 seo_config.yaml
target_keywords:
- "Python教程"
- "SEO优化"
- "博客写作"
target_density: 1.5 # 目标关键词密度百分比
min_title_length: 15 # 标题最少字符数
max_title_length: 60 # 标题最多字符数
internal_links_suggestion_count: 3 # 建议内链数量
第三步:创建主分析脚本 seo_analyzer.py
#!/usr/bin/env python3
"""博客 SEO 自动分析工具"""
import yaml
import jieba
import re
import math
from collections import Counter
from pathlib import Path
from openai import OpenAI
# ---------- 加载配置 ----------
with open("seo_config.yaml", "r", encoding="utf-8") as f:
config = yaml.safe_load(f)
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api.openai.com/v1" # 或用兼容接口如硅基流动
)
def read_article(filepath):
"""读取 Markdown 文件,提取正文"""
text = Path(filepath).read_text(encoding="utf-8")
# 去掉 front-matter
text = re.sub(r'^---.*?---\s*', '', text, flags=re.DOTALL)
# 去掉代码块(代码不参与 SEO 分析)
text = re.sub(r'```[\s\S]*?```', '', text)
return text
def get_title(text):
"""提取第一个 H1 标题"""
match = re.search(r'^#\s+(.+)$', text, re.MULTILINE)
return match.group(1).strip() if match else ""
def analyze_keyword_density(text, keywords):
"""分析关键词密度"""
# 去除标点符号后分词
clean_text = re.sub(r'[^\w\u4e00-\u9fff]', '', text)
words = jieba.lcut(clean_text)
total_words = len(words)
results = {}
for kw in keywords:
count = sum(1 for w in words if kw in w)
density = (count / total_words * 100) if total_words > 0 else 0
results[kw] = {
"count": count,
"density": round(density, 2),
"status": "ok" if 1.0 <= density <= 3.0 else "low" if density < 1.0 else "high"
}
return results, total_words
def score_title(title, min_len, max_len):
"""标题评分(满分100)"""
score = 100
issues = []
# 长度检查
if len(title) < min_len:
score -= 20
issues.append(f"标题过短({len(title)}字),建议{min_len}字以上")
elif len(title) > max_len:
score -= 10
issues.append(f"标题过长({len(title)}字),建议不超过{max_len}字")
# 包含数字加分
if re.search(r'\d+', title):
score += 5
# 包含问号/感叹号加分
if re.search(r'[?!!]', title):
score += 5
# 包含核心关键词加分
for kw in config["target_keywords"]:
if kw in title:
score += 10
break
return min(score, 100), issues
def suggest_internal_links(text, keywords):
"""用 AI 生成内链建议"""
preview = text[:2000]
prompt = f"""分析以下文章的内链需求。
文章标题和摘要:
{preview}
当前文章涉及的核心话题:{', '.join(keywords)}
请推荐3个适合添加的内链锚点描述,格式为JSON数组:
[
{{"anchor": "锚点文字", "url": "/path/to/article", "reason": "推荐理由"}}
]
只返回JSON,不要其他解释。"""
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.3,
max_tokens=500
)
return resp.choices[0].message.content
def generate_improvements(text, keyword_results):
"""用 AI 生成优化建议"""
low_kws = [k for k, v in keyword_results.items() if v["status"] != "ok"]
if not low_kws:
return "关键词密度良好,暂无需要优化的内容。"
prompt = f"""这篇文章的以下关键词密度不足或过高:
{low_kws}
请给出2-3条具体的优化建议,每条不超过50字。格式如下:
1. 建议内容
2. 建议内容
3. 建议内容"""
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.5,
max_tokens=300
)
return resp.choices[0].message.content
def run_analysis(article_path):
"""执行完整分析"""
print(f"\n{'='*50}")
print(f"📄 分析文章:{article_path}")
print(f"{'='*50}\n")
text = read_article(article_path)
title = get_title(text)
print(f"标题:{title}\n")
# 1. 关键词密度
keyword_results, total_words = analyze_keyword_density(text, config["target_keywords"])
print("📊 关键词密度分析:")
for kw, info in keyword_results.items():
emoji = {"ok": "✅", "low": "⚠️", "high": "🔴"}.get(info["status"], "?")
print(f" {emoji} 「{kw}」:出现{info['count']}次,密度{info['density']}% ({info['status']})")
print(f" 全文字数:{total_words}\n")
# 2. 标题评分
score, issues = score_title(title, config["min_title_length"], config["max_title_length"])
grade = "A+" if score >= 90 else "A" if score >= 80 else "B" if score >= 70 else "C"
print(f"🏷️ 标题评分:{score}分(等级{grade})")
for issue in issues:
print(f" ⚠️ {issue}")
print()
# 3. 内链建议
print("🔗 AI 内链建议:")
try:
links = suggest_internal_links(text, config["target_keywords"])
print(links)
except Exception as e:
print(f" (AI 调用失败:{e},跳过)")
print()
# 4. 优化建议
print("💡 优化建议:")
improvements = generate_improvements(text, keyword_results)
print(improvements)
print()
return {
"title_score": score,
"keyword_density": keyword_results,
"total_words": total_words
}
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("用法:python seo_analyzer.py <文章路径.md>")
sys.exit(1)
run_analysis(sys.argv[1])
第四步:创建测试文章
---
title: "如何用 Python 写一个简单的 SEO 优化工具"
date: 2026-06-17
---
# 如何用 Python 写一个简单的 SEO 优化工具
SEO 优化是每个内容创作者都需要面对的问题。这篇文章教你用 Python 写一个自动分析工具。
## 为什么要做 SEO 优化
好的 SEO 能让你的文章获得更多搜索流量。不需要复杂的工具,Python 就能搞定。
## 实现思路
核心思路是读取文章内容,分析关键词密度,然后给出改进建议。我们用 jieba 做中文分词,用 OpenAI API 做语义分析。
## 关键词密度的重要性
关键词密度是指某个关键词在文章中出现的频率。一般认为,1%-3% 是最理想的密度范围。太低了搜索引擎抓不到重点,太高了会被判定为堆砌。
## 总结
这个工具虽然简单,但能帮你快速发现文章中的 SEO 问题。
第五步:运行分析
python seo_analyzer.py test-article.md
预期输出类似:
==================================================
📄 分析文章:test-article.md
==================================================
标题:如何用 Python 写一个简单的 SEO 优化工具
📊 关键词密度分析:
✅ 「Python教程」:出现2次,密度1.2% (ok)
✅ 「SEO优化」:出现3次,密度1.8% (ok)
⚠️ 「博客写作」:出现0次,密度0.0% (low)
全文字数:168
🏷️ 标题评分:95分(等级A+)
🔗 AI 内链建议:
[
{"anchor": "关键词密度分析", "url": "/blog/keyword-density-guide", "reason": "读者可能对如何计算关键词密度感兴趣"},
{"anchor": "中文分词", "url": "/blog/jieba-tutorial", "reason": "工具核心依赖jieba分词,可引导至相关教程"},
{"anchor": "OpenAI API", "url": "/blog/openai-integration", "reason": "文章使用了AI分析功能,可关联API集成教程"}
]
💡 优化建议:
1. 增加「博客写作」相关关键词的出现次数,建议至少在正文中出现2-3次。
2. 可以在副标题中融入目标关键词,提升SEO效果。
运行效果
这个工具在本地运行,不需要任何服务器。你只需要:
- 写好文章(Markdown 格式)
- 运行
python seo_analyzer.py 文章.md - 根据输出的评分和建议修改文章
- 满意后再发布
整个过程不到一分钟。
你可以把它加到写作工作流里——每次写完文章先跑一遍,修改后再发布。比发布后发现排名不好再回头改,效率高得多。
优化方向
如果你想让这个工具更强,可以考虑这些方向:
- 批量分析:遍历整个博客目录,一次性分析所有文章
- 历史记录:把每次分析结果存到 SQLite,跟踪优化趋势
- 竞争对比:接入搜索引擎 API,分析竞品文章的关键词策略
- 自动改写:直接输出改写后的文章版本,减少手动编辑
- 插件集成:写成 Hugo/WordPress 插件,发布时自动触发
工具的核心价值不在于完美,而在于养成习惯。每次发布前花一分钟跑一下,几个月后你会发现搜索流量有明显变化。
你的下一篇文章,准备好优化了吗?
这篇文章对你有帮助吗?