如何将 SERP API 结果导出到 Google Sheets

了解如何使用 Python 将 SERP API 结果导出到 Google Sheets,包含搜索结果获取、title、link、snippet、ranking、metadata 提取,以及自动写入表格。

talor ai
Last updated on
5 min read

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 通常包含:

字段

含义

query

搜索 keyword

engine

Google、Bing、Yandex、DuckDuckGo 等

location

搜索国家、地区或城市

device

Desktop 或 mobile

position

排名位置

title

搜索结果标题

link

目标 URL

domain

提取出的 domain

snippet

搜索结果摘要

collected_at

数据采集时间

这个结构适合 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 会更合适。

Scale Your Data
Operations Today.

Join the world's most robust proxy network.

Start Free Trial