ScavioScavio
产品定价文档
登录开始使用
  1. 首页
  2. 教程
  3. 如何建立历史 SERP 档案
教程

如何建立历史 SERP 档案

归档每日 SERP 快照,以跟踪随着时间的推移排名变化、SERP 功能外观和 AI 概述推出。 $0.005/快照。

获取免费API密钥API文档

历史 SERP 档案可让您准确查看 Google 在任何日期显示的任何关键字的内容,包括 AI 概述、特色片段和毫无预警地出现和消失的 PAA 框。大多数排名跟踪器仅存储位置编号。本教程以 0.005 美元/查询的价格归档完整的 SERP 快照,并构建可查询的排名和功能更改时间表。

前置条件

  • Python 3.8+
  • 请求库
  • 来自 scavio.dev 的 Scavio API 密钥
  • SQLite3(包含在 Python 中)

操作指南

步骤 1: 设置存档数据库

创建一个 SQLite 数据库来存储具有完整元数据的 SERP 快照。

Python
import sqlite3, json, os, requests
from datetime import datetime

API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}

db = sqlite3.connect('serp_archive.db')
db.execute('''CREATE TABLE IF NOT EXISTS snapshots (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    keyword TEXT NOT NULL,
    captured_at TEXT NOT NULL,
    top_3 TEXT,
    has_ai_overview INTEGER,
    has_featured_snippet INTEGER,
    paa_count INTEGER,
    full_json TEXT
)''')
db.execute('CREATE INDEX IF NOT EXISTS idx_kw_date ON snapshots(keyword, captured_at)')
db.commit()
print('Archive database ready.')

步骤 2: 捕获 SERP 快照

获取实时 SERP 数据并将其与提取的元数据一起存储。

Python
def capture(keyword):
    data = requests.post('https://api.scavio.dev/api/v1/search',
        headers=SH, json={'query': keyword, 'country_code': 'us'}).json()
    organic = data.get('organic_results', [])[:10]
    top_3 = json.dumps([{'pos': r['position'], 'title': r['title'][:60],
        'domain': r['link'].split('/')[2]} for r in organic[:3]])
    has_ao = 1 if data.get('ai_overview') else 0
    has_fs = 1 if data.get('answer_box') else 0
    paa = len(data.get('related_questions', []))
    db.execute('INSERT INTO snapshots (keyword, captured_at, top_3, has_ai_overview, has_featured_snippet, paa_count, full_json) VALUES (?, ?, ?, ?, ?, ?, ?)',
        (keyword, datetime.now().isoformat(), top_3, has_ao, has_fs, paa, json.dumps(data)))
    db.commit()
    print(f'  {keyword}: top={organic[0]["title"][:40] if organic else "N/A"}, AO={has_ao}, FS={has_fs}, PAA={paa}')
    return data

keywords = ['best serp api 2026', 'python web scraping', 'tiktok analytics tool']
for kw in keywords: capture(kw)
print(f'\nCaptured {len(keywords)} snapshots. Cost: ${len(keywords) * 0.005:.3f}')

步骤 3: 查询存档的更改

比较一段时间内的快照以检测排名和功能变化。

Python
def timeline(keyword, days=30):
    rows = db.execute(
        'SELECT captured_at, top_3, has_ai_overview, has_featured_snippet, paa_count FROM snapshots WHERE keyword = ? ORDER BY captured_at DESC LIMIT ?',
        (keyword, days)).fetchall()
    if not rows:
        print(f'No data for "{keyword}"')
        return
    print(f'\nTimeline for "{keyword}" ({len(rows)} snapshots):')
    prev_top = None
    for date, top_3, ao, fs, paa in rows:
        top = json.loads(top_3)
        top_domain = top[0]['domain'] if top else 'N/A'
        changed = ' CHANGED' if prev_top and prev_top != top_domain else ''
        print(f'  {date[:10]}: #1={top_domain:30} AO={ao} FS={fs} PAA={paa}{changed}')
        prev_top = top_domain

def feature_report(keyword):
    rows = db.execute(
        'SELECT COUNT(*), SUM(has_ai_overview), SUM(has_featured_snippet), AVG(paa_count) FROM snapshots WHERE keyword = ?',
        (keyword,)).fetchone()
    total, ao_count, fs_count, avg_paa = rows
    print(f'\n"{keyword}": {total} snapshots, AI Overview {ao_count}/{total} ({ao_count/total*100:.0f}%), Featured Snippet {fs_count}/{total} ({fs_count/total*100:.0f}%), Avg PAA: {avg_paa:.1f}')

timeline('best serp api 2026')
feature_report('best serp api 2026')

步骤 4: 使用 cron 安排每日捕获

设置通过 cron 或调度程序运行的每日捕获脚本。

Python
def daily_capture(keywords_file='keywords.txt'):
    try:
        with open(keywords_file) as f:
            keywords = [line.strip() for line in f if line.strip()]
    except FileNotFoundError:
        keywords = ['best serp api', 'tiktok analytics', 'web scraping tool']
        with open(keywords_file, 'w') as f:
            f.write('\n'.join(keywords))
        print(f'Created {keywords_file} with {len(keywords)} default keywords')

    print(f'Daily capture: {len(keywords)} keywords at {datetime.now().isoformat()}')
    for kw in keywords: capture(kw)
    cost = len(keywords) * 0.005
    print(f'Done. Cost: ${cost:.3f} ({len(keywords)} queries)')
    print(f'Monthly estimate: ${cost * 30:.2f}')
    return len(keywords)

# Run: python archive.py
# Cron: 0 6 * * * cd /path/to/project && python archive.py
daily_capture()

Python 示例

Python
import os, requests, sqlite3, json
from datetime import datetime

SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
db = sqlite3.connect('serp_archive.db')
db.execute('CREATE TABLE IF NOT EXISTS snapshots (id INTEGER PRIMARY KEY, keyword TEXT, captured_at TEXT, top_3 TEXT, has_ai_overview INTEGER, full_json TEXT)')

def capture(kw):
    data = requests.post('https://api.scavio.dev/api/v1/search',
        headers=SH, json={'query': kw, 'country_code': 'us'}).json()
    top = json.dumps([r['title'][:40] for r in data.get('organic_results', [])[:3]])
    db.execute('INSERT INTO snapshots VALUES (NULL,?,?,?,?,?)',
        (kw, datetime.now().isoformat(), top, 1 if data.get('ai_overview') else 0, json.dumps(data)))
    db.commit()
    print(f'{kw}: captured ({"AO" if data.get("ai_overview") else "no AO"})')

capture('best serp api 2026')

JavaScript 示例

JavaScript
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
import Database from 'better-sqlite3';
const db = new Database('serp_archive.db');
db.exec('CREATE TABLE IF NOT EXISTS snapshots (id INTEGER PRIMARY KEY, keyword TEXT, captured_at TEXT, top_3 TEXT, has_ai_overview INTEGER, full_json TEXT)');

async function capture(kw) {
  const data = await fetch('https://api.scavio.dev/api/v1/search', {
    method: 'POST', headers: SH,
    body: JSON.stringify({ query: kw, country_code: 'us' })
  }).then(r => r.json());
  const top = JSON.stringify((data.organic_results||[]).slice(0,3).map(r => r.title.slice(0,40)));
  db.prepare('INSERT INTO snapshots VALUES (NULL,?,?,?,?,?)').run(
    kw, new Date().toISOString(), top, data.ai_overview ? 1 : 0, JSON.stringify(data));
  console.log(`${kw}: captured (${data.ai_overview ? 'AO' : 'no AO'})`);
}
capture('best serp api 2026').catch(console.error);

预期输出

JSON
Archive database ready.
  best serp api 2026: top=Scavio - Unified Search API for Dev..., AO=1, FS=0, PAA=4
  python web scraping: top=Beautiful Soup: Web Scraping with P..., AO=0, FS=1, PAA=3
  tiktok analytics tool: top=Pentos - TikTok Analytics Platform..., AO=1, FS=0, PAA=5

Captured 3 snapshots. Cost: $0.015

Timeline for "best serp api 2026" (3 snapshots):
  2026-05-18: #1=scavio.dev                     AO=1 FS=0 PAA=4

"best serp api 2026": 3 snapshots, AI Overview 2/3 (67%), Featured Snippet 1/3 (33%), Avg PAA: 4.0

相关教程

  • 如何构建有竞争力的 SERP 监控器
  • 如何使用搜索 API 构建自定义 SEO 仪表板
  • 如何监控排名之外的搜索表面

常见问题

大多数开发者在15到30分钟内完成本教程。您需要一个Scavio API密钥(免费套餐即可)和可用的Python或JavaScript环境。

Python 3.8+. 请求库. 来自 scavio.dev 的 Scavio API 密钥. SQLite3(包含在 Python 中). Scavio API密钥注册即送50个免费积分。

可以。免费套餐注册即送50个积分,完全足够完成本教程并构建一个可运行的原型解决方案。

Scavio提供原生LangChain包(langchain-scavio)、MCP服务器以及适用于任何HTTP客户端的REST API。本教程使用 the raw REST API, 但您可以根据需要适配您选择的框架。

相关资源

Best Of

2026 年最佳基于队列的 SERP API

Read more
Best Of

Google I/O 2026 AI模式变化后最佳搜索API

Read more
Solution

从SERP API获取Google Ads数据

Read more
Comparison

Google CSE (Paid Tier) vs Third-Party SERP API (Scavio, SerpApi, Serper)

Read more
Glossary

SERP API

Read more
Glossary

Google Maps Places API成本

Read more

开始构建

归档每日 SERP 快照,以跟踪随着时间的推移排名变化、SERP 功能外观和 AI 概述推出。 $0.005/快照。

获取免费API密钥阅读文档
ScavioScavio

面向AI智能体的实时搜索API。搜索所有平台,不仅仅是Google。

产品

  • 功能
  • 定价
  • 控制台
  • 联盟计划

开发者

  • 文档
  • API参考
  • 快速开始
  • MCP集成
  • Python SDK

替代方案

  • Tavily替代方案
  • SerpAPI替代方案
  • Firecrawl替代方案
  • Exa替代方案

工具

  • JSON格式化
  • cURL转代码
  • Token计数器
  • 全部工具

© 2026 Scavio. 保留所有权利。

Featured on TAAFT
服务条款隐私政策