如何從 SERP JSON 中提取標題、連結和摘要
了解如何使用 Python 從 SERP JSON 中提取 title、link、snippet、position、domain 和搜尋 metadata,包含 JSON 範例、解析程式碼、CSV 匯出,以及 SEO 和 AI 工作流程實用建議。
要從 SERP JSON 中提取 title、link 和 snippet,通常需要讀取 organic_results array,遍歷每條 result,然後提取 title、link 或 url、snippet 或 description 等欄位。正式使用時,還建議同時保存 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 search results 列表 |
|
|
搜尋結果排名位置 |
|
|
搜尋結果標題 |
|
|
目標頁面 URL |
|
|
搜尋結果摘要 |
|
|
從 URL 中提取的網站 domain |
|
|
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 穩定,且欄位固定為 title、link 和 snippet,這種方式已經可以工作。
提取 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 欄位可以幫助監測排名變化和競爭對手可見度。
|
欄位 |
作用 |
|
|
追蹤排名變化 |
|
|
查看搜尋結果展示標題 |
|
|
確認排名 URL |
|
|
用於 competitor analysis |
|
|
分析搜尋結果摘要 |
|
|
讓排名資料具備市場上下文 |
|
|
區分 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 可以幫助發現最新公開來源。
常用欄位包括:
|
欄位 |
用途 |
|
|
Source label |
|
|
抓取和引用 URL |
|
|
初步相關性判斷 |
|
|
來源篩選 |
|
|
Search visibility signal |
|
|
Retrieval context |
|
|
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 可能包含 position、title、link 和 snippet。部分 API 可能使用 url 或 description 等替代欄位。
如何將 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 會更容易保存、分析和重複使用。