如何從 SERP JSON 中提取標題、連結和摘要

了解如何使用 Python 從 SERP JSON 中提取 title、link、snippet、position、domain 和搜尋 metadata,包含 JSON 範例、解析程式碼、CSV 匯出,以及 SEO 和 AI 工作流程實用建議。

如何從 SERP JSON 中提取標題、連結和摘要
Cecilia Hill
最後更新於
6 分鐘閱讀

要從 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 會更容易保存、分析和重複使用。

立即開展您的數據業務

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

免費試用