如何从 SERP JSON 中提取标题、链接和摘要

了解如何使用 Python 从 SERP JSON 中提取 title、link、snippet、position、domain 和搜索 metadata,包含 JSON 示例、解析代码、CSV 导出,以及 SEO 和 AI 工作流实用建议。

talor ai
最後更新於
5 分鐘閱讀

要从 SERP JSON 中提取 title、link 和 snippet,通常需要读取 organic_results array,遍历每条 result,然后提取 titlelinkurlsnippetdescription 等字段。正式使用时,还建议同时保存 position、domain、query、location、language、device 和 timestamp。

SERP JSON 是 SERP API 返回的结构化搜索结果 response。它通常包含 organic results、ads、local results、news results、shopping results、related searches,以及 query、location、language、device 等搜索 metadata。

对很多工作流来说,最先需要的通常是三个字段:

  • title

  • link

  • snippet

这些字段足以建立搜索结果表格、把 URL 传给 crawler、监测排名变化,或为 AI Agent / RAG workflow 准备数据来源。

SERP JSON 通常长什么样?

一个典型 SERP API response 可能像这样:

{
  "search_parameters": {
    "engine": "google",
    "query": "best project management software",
    "location": "United States",
    "language": "en",
    "device": "desktop"
  },
  "organic_results": [
    {
      "position": 1,
      "title": "Best Project Management Software of 2026",
      "link": "https://example.com/project-management-software",
      "snippet": "Compare the best project management software for teams, pricing, features, and integrations."
    }
  ]
}

核心通常是 organic_results。这个 array 里的每个 item,代表一条 organic search result。

常见 SERP JSON 字段

SERP JSON 字段

含义

organic_results

Organic search results 列表

position

搜索结果排名位置

title

搜索结果标题

link / url

目标页面 URL

snippet / description

搜索结果摘要

domain

从 URL 中提取的网站 domain

search_parameters

query、engine、location、language、device 等上下文

对 SEO 和 AI workflow 来说,不应只保存 title、link 和 snippet。Search metadata 也很重要,因为同一个 query 在不同国家、城市、语言和设备下,可能返回不同结果。

基础 Python 示例

最简单的提取方式如下:

results = []

for item in serp_json.get("organic_results", []):
    results.append({
        "position": item.get("position"),
        "title": item.get("title"),
        "link": item.get("link"),
        "snippet": item.get("snippet")
    })

print(results)

如果你的 JSON schema 稳定,且字段固定为 titlelinksnippet,这种方式已经可以工作。

提取 Title、Link、Snippet、Position 和 Domain

不同 SERP API 的字段命名可能略有不同。

例如,有些 API 使用 url 而不是 link,有些使用 description 而不是 snippet

更安全的 parser 应该兼容这些差异。

from urllib.parse import urlparse


def get_domain(url: str | None) -> str | None:
    if not url:
        return None

    parsed = urlparse(url)
    return parsed.netloc.replace("www.", "") if parsed.netloc else None


def extract_organic_results(serp_json: dict) -> list[dict]:
    organic_results = serp_json.get("organic_results", [])
    extracted = []

    for index, item in enumerate(organic_results, start=1):
        link = item.get("link") or item.get("url")

        extracted.append({
            "position": item.get("position") or index,
            "title": item.get("title"),
            "link": link,
            "domain": get_domain(link),
            "snippet": item.get("snippet") or item.get("description")
        })

    return extracted

domain 对 competitor tracking、去重和来源筛选很有用。

将 SERP JSON 结果导出为 CSV

提取字段后,可以将结果保存为 CSV。

import csv


def save_results_to_csv(results: list[dict], filename: str = "serp_results.csv") -> None:
    fieldnames = ["position", "title", "link", "domain", "snippet"]

    with open(filename, mode="w", newline="", encoding="utf-8") as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(results)


results = extract_organic_results(serp_json)
save_results_to_csv(results)

CSV 适合用于 spreadsheet 查看、dashboard 导入,或与 SEO 团队共享原始搜索结果。

从 API Response 解析 SERP JSON

在真实项目中,SERP JSON 通常来自 API request。

整体流程通常是:

Send query parameters
→ Receive SERP JSON
→ Extract organic results
→ Normalize fields
→ Store or export the data

简化 Python 示例:

import os
import requests


API_KEY = os.getenv("SERP_API_KEY")

params = {
    "query": "best project management software",
    "location": "United States",
    "language": "en",
    "device": "desktop"
}

headers = {
    "Authorization": f"Bearer {API_KEY}"
}

response = requests.get(
    "https://api.example.com/search",
    params=params,
    headers=headers,
    timeout=30
)

response.raise_for_status()

serp_json = response.json()
results = extract_organic_results(serp_json)

不同 provider 的 endpoint 和 authentication method 可能不同。重点是解析层:只要拿到 JSON,就应该把它 normalize 成你的系统可直接使用的数据结构。

你可以用 SerpApi、SearchAPI、Bright Data 或 Talordata 测试这类 workflow。真正重要的是 JSON response 是否足够干净,能让 SEO tool、AI Agent 或 data pipeline 直接使用。

安全处理缺失字段

SERP results 并不总是完全一致。

有些结果可能没有 snippet;有些 link 可能缺失;有些结果可能属于 news、shopping、images 或 local pack,而不是标准 organic result。

Parser 不应因为某个字段缺失就中断。

def clean_text(value: str | None) -> str:
    if not value:
        return ""
    return " ".join(value.split())


def extract_organic_results_safe(serp_json: dict) -> list[dict]:
    organic_results = serp_json.get("organic_results", [])
    extracted = []

    for index, item in enumerate(organic_results, start=1):
        link = item.get("link") or item.get("url")

        result = {
            "position": item.get("position") or index,
            "title": clean_text(item.get("title")),
            "link": link or "",
            "domain": get_domain(link) or "",
            "snippet": clean_text(item.get("snippet") or item.get("description"))
        }

        if result["title"] and result["link"]:
            extracted.append(result)

    return extracted

这个版本会清理多余空格,并跳过没有 title 或 link 的结果。

加入搜索 Metadata

Title、link 和 snippet 本身有用,但与 search metadata 一起保存时,价值更高。

def add_search_metadata(results: list[dict], serp_json: dict) -> list[dict]:
    params = serp_json.get("search_parameters", {})

    for result in results:
        result["query"] = params.get("query") or params.get("q") or ""
        result["engine"] = params.get("engine") or ""
        result["location"] = params.get("location") or ""
        result["language"] = params.get("language") or ""
        result["device"] = params.get("device") or ""

    return results

这对 SEO tracking 尤其重要。没有 query、location、language、device 和 timestamp 的 ranking position,很难在之后进行比较。

实作前,也可以 review SERP API query parameters,了解 query、location、language、device 和 result controls 通常如何设计。

使用场景

SEO Rank Tracking

对 SEO 来说,提取后的 SERP 字段可以帮助监测排名变化和竞争对手可见度。

字段

作用

position

追踪排名变化

title

查看搜索结果展示标题

link

确认排名 URL

domain

用于 competitor analysis

snippet

分析搜索结果摘要

location

让排名数据具备市场上下文

device

区分 desktop 和 mobile 结果

AI Agent

AI Agent 可以把 SERP JSON 作为 source discovery layer。

常见流程是:

User question
→ Generate search query
→ Get SERP JSON
→ Extract titles, links, and snippets
→ Filter useful sources
→ Fetch selected pages
→ Generate grounded answer

Agent 不应抓取所有 URL,而应先根据 title、snippet、domain 和 result type 进行筛选。

RAG Pipeline

对 RAG 来说,SERP JSON 可以帮助发现最新公开来源。

常用字段包括:

字段

用途

title

Source label

link

抓取和引用 URL

snippet

初步相关性判断

domain

来源筛选

position

Search visibility signal

query

Retrieval context

timestamp

Freshness tracking

FAQ

什么是 SERP JSON?

SERP JSON 是 SERP API 返回的结构化搜索结果 response,通常包含 organic results、ads、local results、news results、shopping results,以及 query、location、language、device 等 search metadata。

Title、link 和 snippet 通常存在哪里?

在很多 SERP API response 中,title、link 和 snippet 通常位于 organic_results array 中。每个 item 可能包含 positiontitlelinksnippet。部分 API 可能使用 urldescription 等替代字段。

如何将 SERP API 结果导出为 CSV?

可以遍历 organic_results array,把字段 normalize 成 dictionary,然后使用 Python 内置的 csv.DictWriter 导出。常见字段包括 query、location、device、position、title、link、domain 和 snippet。

SEO tracking 应该保存哪些字段?

SEO tracking 建议保存 query、location、language、device、timestamp、position、title、link、domain 和 snippet。这些字段可以让排名数据在不同市场、设备和时间段之间可比较。

结语

从 SERP JSON 中提取 title、link 和 snippet,通常是搜索数据工作流的第一步。

对 SEO 团队来说,这些字段支持 ranking analysis 和 competitor monitoring。

对 AI Agent 来说,它们可以帮助发现并筛选有用来源。

对 RAG pipeline 来说,它们能在抓取完整页面前提供 citation-ready metadata。

关键是将 response normalize 成简单、稳定的结构。当你拥有 position、title、link、domain、snippet 和 search metadata 后,SERP data 会更容易保存、分析和重复使用。

立即開展您的數據業務

加入全球最強大的代理網絡

免費試用