SEO 审核工具检查网站及其竞争对手在一组目标关键字的搜索结果中的表现。它检查存在哪些 SERP 功能(特色片段、AI 概述、PAA 框)、竞争对手排名以及存在哪些内容差距。企业 SEO 工具每月花费数千美元。本教程使用 Scavio API 构建一个轻量级审核工具,该工具免费生成可操作的逐个关键字报告,超出了 API 使用成本。
前置条件
- Python 3.10 或更高版本
- 请求已安装库
- Scavio API 密钥
- 要审核的目标域和关键字列表
操作指南
步骤 1: 定义审核目标
设置您的目标域、竞争对手域和要审核的关键字列表。
Python
TARGET = "mysite.com"
COMPETITORS = ["competitor-a.com", "competitor-b.com"]
KEYWORDS = ["python api tutorial", "rest api guide", "api authentication best practices"]步骤 2: 获取每个关键字的完整 SERP 数据
检索完整的 SERP 响应,包括有机结果、特色片段、AI 概述和 PAA。
Python
def audit_keyword(keyword: str) -> dict:
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": keyword, "country_code": "us"})
r.raise_for_status()
return r.json()步骤 3: 分析 SERP 特征和位置
对于每个关键字,检查存在哪些 SERP 功能以及目标域和竞争对手的排名。
Python
def analyze(keyword: str, data: dict) -> dict:
organic = data.get("organic_results", [])
target_pos = next((r["position"] for r in organic if TARGET in r.get("link", "")), None)
competitor_pos = {}
for c in COMPETITORS:
pos = next((r["position"] for r in organic if c in r.get("link", "")), None)
competitor_pos[c] = pos
return {
"keyword": keyword,
"target_position": target_pos,
"competitors": competitor_pos,
"has_featured_snippet": bool(data.get("featured_snippet")),
"has_ai_overview": bool(data.get("ai_overview")),
"paa_count": len(data.get("people_also_ask", [])),
}步骤 4: 生成审核报告
对所有关键字运行审核并打印格式化的摘要报告。
Python
def run_audit() -> None:
print(f"SEO Audit for {TARGET}\n" + "=" * 40)
for kw in KEYWORDS:
data = audit_keyword(kw)
result = analyze(kw, data)
pos = result["target_position"]
print(f"\n{kw}")
print(f" Your rank: {'#' + str(pos) if pos else 'not ranked'}")
print(f" AI Overview: {result['has_ai_overview']}, PAA: {result['paa_count']}")Python 示例
Python
import os
import requests
API_KEY = os.environ.get("SCAVIO_API_KEY", "your_scavio_api_key")
ENDPOINT = "https://api.scavio.dev/api/v1/search"
TARGET = "mysite.com"
KEYWORDS = ["python api tutorial", "rest api guide"]
def fetch(q):
r = requests.post(ENDPOINT, headers={"x-api-key": API_KEY},
json={"query": q, "country_code": "us"})
r.raise_for_status()
return r.json()
def analyze(kw, data):
organic = data.get("organic_results", [])
pos = next((r["position"] for r in organic if TARGET in r.get("link", "")), None)
return {"keyword": kw, "position": pos, "ai_overview": bool(data.get("ai_overview")), "paa": len(data.get("people_also_ask", []))}
if __name__ == "__main__":
for kw in KEYWORDS:
result = analyze(kw, fetch(kw))
print(f"{kw}: {'#' + str(result['position']) if result['position'] else 'not ranked'} | AI: {result['ai_overview']} | PAA: {result['paa']}")JavaScript 示例
JavaScript
const API_KEY = process.env.SCAVIO_API_KEY || "your_scavio_api_key";
const ENDPOINT = "https://api.scavio.dev/api/v1/search";
const TARGET = "mysite.com";
const KEYWORDS = ["python api tutorial", "rest api guide"];
async function fetch_(q) {
const res = await fetch(ENDPOINT, {
method: "POST",
headers: { "x-api-key": API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: q, country_code: "us" })
});
return res.json();
}
function analyze(kw, data) {
const organic = data.organic_results || [];
const match = organic.find(r => r.link.includes(TARGET));
return { keyword: kw, position: match?.position || null, aiOverview: !!data.ai_overview, paa: (data.people_also_ask || []).length };
}
async function main() {
for (const kw of KEYWORDS) {
const data = await fetch_(kw);
const r = analyze(kw, data);
console.log(`${r.keyword}: ${r.position ? "#" + r.position : "not ranked"} | AI: ${r.aiOverview} | PAA: ${r.paa}`);
}
}
main().catch(console.error);预期输出
JSON
SEO Audit for mysite.com
========================================
python api tutorial
Your rank: #6
AI Overview: true, PAA: 4
rest api guide
Your rank: not ranked
AI Overview: false, PAA: 3