如何将 SERP API 结果导出到 Google Sheets
了解如何使用 Python 将 SERP API 结果导出到 Google Sheets,包含搜索结果获取、title、link、snippet、ranking、metadata 提取,以及自动写入表格。
Google Sheets 通常是查看 SERP data 最简单的地方。
一开始你不一定需要完整 database。如果团队只是想查看 rankings、比较 domains、审核 snippets,或把搜索结果分享给 SEO、产品、内容团队,spreadsheet 通常已经足够。
整体流程很简单:
SERP API request
→ Receive SERP JSON
→ Extract titles, links, snippets, positions, and metadata
→ Append rows to Google Sheets
这篇文章会示范如何用 Python 将 SERP API results 导出到 Google Sheets。示例保持 provider-neutral,所以可以改成 Talordata、SerpApi、Serper.dev、Bright Data、SearchAPI 或其他返回 structured JSON 的 SERP API。
应该导出哪些 SERP Data?
多数 workflow 可以先从 organic search results 开始。你不需要把 raw response 里所有字段都导出。
一份实用 spreadsheet 通常包含:
|
字段 |
含义 |
|---|---|
|
|
搜索 keyword |
|
|
Google、Bing、Yandex、DuckDuckGo 等 |
|
|
搜索国家、地区或城市 |
|
|
Desktop 或 mobile |
|
|
排名位置 |
|
|
搜索结果标题 |
|
|
目标 URL |
|
|
提取出的 domain |
|
|
搜索结果摘要 |
|
|
数据采集时间 |
这个结构适合 SEO rank tracking、competitor monitoring、brand visibility check 和 AI source discovery。
Step 1:安装 Python 套件
需要安装三个 package:
pip install requests gspread google-auth
requests 用来调用 SERP API。gspread 用来写入 Google Sheets。google-auth 用来处理 Google service account authentication。
Step 2:准备 Google Sheets 权限
建立一个 Google Sheet,并建立名为 SERP Results 的 tab。
接着建立 Google Cloud service account,下载 JSON credentials file,并把你的 Google Sheet 分享给 service account email。
项目文件夹可以像这样:
project/
export_serp_to_sheets.py
service_account.json
不要把 service_account.json 上传到 GitHub 或任何公开 repository。
Step 3:请求 SERP API Results
不同 SERP API 的 endpoint 会不同,下面示例保持通用。
import os
import requests
SERP_API_KEY = os.getenv("SERP_API_KEY")
SERP_API_ENDPOINT = os.getenv("SERP_API_ENDPOINT")
def fetch_serp_results(query, location="United States", device="desktop"):
params = {
"engine": "google",
"query": query,
"location": location,
"device": device,
"output": "json"
}
headers = {
"Authorization": f"Bearer {SERP_API_KEY}"
}
response = requests.get(
SERP_API_ENDPOINT,
params=params,
headers=headers,
timeout=30
)
response.raise_for_status()
return response.json()
有些 API 使用 q 而不是 query,有些把 API key 放在 query parameter,而不是 authorization header。建议将 API request 和 parsing logic 分开,这样更换 provider 时不会影响 Google Sheets 写入逻辑。
Step 4:Normalize SERP JSON
不同 SERP API 的字段命名可能不同。有些返回 link,有些返回 url;有些返回 snippet,有些返回 description。
更稳定的做法是写一个兼容型 parser。
from urllib.parse import urlparse
from datetime import datetime, timezone
def clean_text(value):
if not value:
return ""
return " ".join(str(value).split())
def get_domain(url):
if not url:
return ""
parsed = urlparse(url)
return parsed.netloc.replace("www.", "") if parsed.netloc else ""
def extract_organic_results(serp_json, query, location, device):
organic_results = serp_json.get("organic_results", [])
collected_at = datetime.now(timezone.utc).isoformat()
rows = []
for index, item in enumerate(organic_results, start=1):
link = item.get("link") or item.get("url")
if not link:
continue
rows.append([
query,
serp_json.get("search_parameters", {}).get("engine", "google"),
location,
device,
item.get("position") or index,
clean_text(item.get("title")),
link,
get_domain(link),
clean_text(item.get("snippet") or item.get("description")),
collected_at
])
return rows
这个 function 会按照 spreadsheet columns 的顺序返回 rows。
Step 5:Append Rows 到 Google Sheets
接着连接 Google Sheets,将 rows 写入表格。
import gspread
from google.oauth2.service_account import Credentials
GOOGLE_SHEET_NAME = "SERP API Results"
WORKSHEET_NAME = "SERP Results"
SERVICE_ACCOUNT_FILE = "service_account.json"
def get_worksheet():
scopes = [
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/drive"
]
credentials = Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE,
scopes=scopes
)
client = gspread.authorize(credentials)
spreadsheet = client.open(GOOGLE_SHEET_NAME)
return spreadsheet.worksheet(WORKSHEET_NAME)
def append_rows_to_sheet(rows):
if not rows:
print("No rows to append.")
return
worksheet = get_worksheet()
worksheet.append_rows(rows, value_input_option="RAW")
print(f"Appended {len(rows)} rows.")
写入前,可以先在表格中建立 header row:
query | engine | location | device | position | title | link | domain | snippet | collected_at
完整代码
import os
import requests
import gspread
from urllib.parse import urlparse
from datetime import datetime, timezone
from google.oauth2.service_account import Credentials
SERP_API_KEY = os.getenv("SERP_API_KEY")
SERP_API_ENDPOINT = os.getenv("SERP_API_ENDPOINT")
GOOGLE_SHEET_NAME = "SERP API Results"
WORKSHEET_NAME = "SERP Results"
SERVICE_ACCOUNT_FILE = "service_account.json"
def clean_text(value):
if not value:
return ""
return " ".join(str(value).split())
def get_domain(url):
if not url:
return ""
parsed = urlparse(url)
return parsed.netloc.replace("www.", "") if parsed.netloc else ""
def fetch_serp_results(query, location="United States", device="desktop"):
params = {
"engine": "google",
"query": query,
"location": location,
"device": device,
"output": "json"
}
headers = {
"Authorization": f"Bearer {SERP_API_KEY}"
}
response = requests.get(
SERP_API_ENDPOINT,
params=params,
headers=headers,
timeout=30
)
response.raise_for_status()
return response.json()
def extract_organic_results(serp_json, query, location, device):
organic_results = serp_json.get("organic_results", [])
collected_at = datetime.now(timezone.utc).isoformat()
rows = []
for index, item in enumerate(organic_results, start=1):
link = item.get("link") or item.get("url")
if not link:
continue
rows.append([
query,
serp_json.get("search_parameters", {}).get("engine", "google"),
location,
device,
item.get("position") or index,
clean_text(item.get("title")),
link,
get_domain(link),
clean_text(item.get("snippet") or item.get("description")),
collected_at
])
return rows
def get_worksheet():
scopes = [
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/drive"
]
credentials = Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE,
scopes=scopes
)
client = gspread.authorize(credentials)
spreadsheet = client.open(GOOGLE_SHEET_NAME)
return spreadsheet.worksheet(WORKSHEET_NAME)
def append_rows_to_sheet(rows):
if not rows:
print("No rows to append.")
return
worksheet = get_worksheet()
worksheet.append_rows(rows, value_input_option="RAW")
print(f"Appended {len(rows)} rows.")
if __name__ == "__main__":
query = "best project management software"
location = "United States"
device = "desktop"
serp_json = fetch_serp_results(query, location, device)
rows = extract_organic_results(serp_json, query, location, device)
append_rows_to_sheet(rows)
Talordata 和其他 SERP API 适合放在哪里?
这套 workflow 适用于任何返回 structured JSON 的 SERP API。
如果只是快速 Google-only prototype,Serper.dev 或 SerpApi 可能比较容易开始。如果是较大的 data collection workflow,团队可能会比较 Bright Data、SearchAPI 或 DataForSEO。
如果你需要 structured SERP results、JSON / HTML output、geo-targeted searches,以及 Google、Bing、Yandex、DuckDuckGo 等多搜索引擎支持,Talordata 值得测试(开始免费测试1000次API请求)。当 Google Sheets 只是第一步,后续还要进 dashboard、AI Agent 或 monitoring system 时,这类能力会更有用。
实际测试方式很简单:用同一批 queries 跑 2–3 个 API,把结果导出到同一张 sheet,再比较 field completeness、missing URLs、localization quality 和 cost per usable row。
常见使用场景
SEO排名跟踪
把 SERP data 导出到 Google Sheets,可以让团队在还没搭建 dashboard 前就开始查看 ranking position。
竞争对手监控
你可以按 domain 分组,追踪哪些 competitors 出现在重要 keywords 下。
内容研究
内容团队可以先查看 titles、snippets 和 ranking URLs,再规划新内容。
AI智能体
AI Agent 可以把 spreadsheet rows 当作轻量 source list,再决定是否抓取完整页面。
FAQ
可以自动将 SERP API results 导出到 Google Sheets 吗?
可以。你可以用 Python 调用 SERP API,解析 JSON response,然后通过 Google Sheets API 或 gspread 将 rows 写入 Google Sheets。
应该导出哪些 SERP 字段?
建议先导出 query、engine、location、device、position、title、link、domain、snippet 和 timestamp。这些字段适合 SEO、competitor monitoring 和 AI source discovery。
一定需要 database 吗?
不一定。Google Sheets 适合测试、小型报告和团队 review。如果是大规模长期 monitoring,database 会更合适。