Local SEO SERP API:如何按城市和語言追蹤排名

了解如何使用 SERP API 進行本地 SEO 排名追蹤,按城市、國家、語言和裝置收集搜尋結果,並保存排名快照用於本地 SEO 報告。

talor ai
Last updated on
4 min read

本地 SEO 排名追蹤很容易變複雜。

同一個網站,可能在一個城市排名很好,在另一個城市完全看不到。同一個關鍵字,也可能因國家、語言、裝置,甚至本地搜尋意圖不同而出現不同結果。對代理商、連鎖品牌、本地落地頁團隊和平台型網站來說,一份全國平均排名報告通常不夠。

本地 SEO 需要帶有地理上下文的 SERP 資料。

SERP API 可以用程式化方式收集搜尋結果,讓你按城市、語言、國家和裝置追蹤排名,而不是手動從不同地區查 Google。

快速回答

要追蹤本地 SEO 排名,可以針對每個關鍵字和目標市場發送 SERP API 請求,並帶上城市、國家、語言和裝置參數。然後提取自然搜尋結果,匹配目標網域,保存排名位置,並按時間比較排名快照。

實際流程通常是:

關鍵字列表
→ 城市和語言列表
→ SERP API 請求
→ 提取自然搜尋結果
→ 匹配目標網域
→ 保存排名快照
→ 按城市和語言比較變化

為什麼城市級排名很重要?

本地 SEO 不只是看網站有沒有排名,而是看它在哪裡有排名

例如:

Keyword: emergency plumber
City: Austin
Language: English

和下面這組條件可能看到不同結果:

Keyword: emergency plumber
City: Dallas
Language: English

語言還會再增加一層差異:

Keyword: dentist near me
City: Miami
Language: English

Keyword: dentista cerca de mí
City: Miami
Language: Spanish

如果報告只顯示一個平均排名,就可能把重要的本地差異藏起來。城市級報告可以幫你看清哪些地區可見度強,哪些落地頁較弱,哪些市場被競品搶走了。

本地排名追蹤應該收集哪些資料?

一條有用的本地排名資料,不應該只有關鍵字和排名。

欄位

為什麼重要

keyword

被追蹤的查詢

target_domain

要監控的網站

city

城市或本地市場

country

國家市場上下文

language

搜尋語言

device

Desktop 或 mobile

position

自然搜尋排名

matched_url

實際排名頁面

title

搜尋結果標題

snippet

可見摘要

collected_at

用於歷史比較的時間戳

沒有 location、language、device 和 timestamp,排名數字很容易被誤讀。

New York mobile 搜尋中的第 4 名,不等於 Chicago desktop 搜尋中的第 4 名。

自然搜尋排名 vs Local Pack 排名

本地 SEO 通常不只看一種結果類型。

結果類型

可以說明什麼

自然搜尋結果

哪些頁面出現在標準網頁結果中

Local Pack

哪些商家出現在地圖型本地結果中

Maps 結果

商家資料在地圖搜尋中的排名

Ads

哪些競品正在付費獲取可見度

People Also Ask

本地使用者常問哪些問題

Shopping 結果

本地商業查詢下出現哪些商品和商家

本文重點是自然搜尋排名,但同一套資料結構也可以延伸到 Maps 或 Local Pack。Talordata 的 SEO monitoring 頁面也描述了本地 SEO 監控場景,包括 map rankings、business profiles、ratings、reviews 和 local visibility data。

Step 1:準備關鍵字和地區

先從少量關鍵字和城市開始。

KEYWORDS = [
    "emergency plumber",
    "dentist near me",
    "coffee shop",
]

LOCATIONS = [
    {
        "city": "Austin",
        "country": "us",
        "language": "en",
        "location": "Austin, Texas, United States",
        "device": "desktop",
    },
    {
        "city": "Dallas",
        "country": "us",
        "language": "en",
        "location": "Dallas, Texas, United States",
        "device": "desktop",
    },
    {
        "city": "Miami",
        "country": "us",
        "language": "es",
        "location": "Miami, Florida, United States",
        "device": "mobile",
    },
]

TARGET_DOMAIN = "example.com"

正式使用時,可以把這些配置放在資料庫或試算表中。每一行代表一個追蹤組合:

keyword + city + country + language + device

這個組合就是你的 rank tracking unit。

Step 2:發送本地化 SERP API 請求

把請求層和解析層分開,後面會更好維護。查看完整文檔>>

import os
import requests


SERP_API_KEY = os.getenv("TALORDATA_API_KEY")
SERP_ENDPOINT = os.getenv("TALORDATA_SERP_ENDPOINT")


def call_serp_api(payload):
    if not SERP_API_KEY:
        raise RuntimeError("Missing TALORDATA_API_KEY")

    headers = {
        "Authorization": f"Bearer {SERP_API_KEY}",
        "Content-Type": "application/json",
    }

    response = requests.post(
        SERP_ENDPOINT,
        json=payload,
        headers=headers,
        timeout=30,
    )

    response.raise_for_status()
    return response.json()


def fetch_local_serp(keyword, location_config):
    payload = {
        "engine": "google",
        "q": keyword,
        "gl": location_config["country"],
        "hl": location_config["language"],
        "location": location_config["location"],
        "device": location_config["device"],
        "num": 10,
        "output": "json",
    }

    return call_serp_api(payload)

重點不是變數名稱,而是每次請求都要帶上本地上下文。

Step 3:提取自然搜尋結果

不同 API 或搜尋類型可能使用不同欄位,所以解析器要保持彈性。

from urllib.parse import urlparse


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.", "")


def get_organic_results(serp_json):
    return (
        serp_json.get("organic_results")
        or serp_json.get("organic")
        or serp_json.get("results")
        or []
    )


def normalize_organic_results(serp_json):
    rows = []

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

        rows.append({
            "position": item.get("position") or item.get("rank") or index,
            "title": clean_text(item.get("title")),
            "url": url,
            "domain": get_domain(url),
            "snippet": clean_text(item.get("snippet") or item.get("description")),
        })

    return rows

這樣每個城市和語言返回的結果都能整理成同一種格式。

Step 4:匹配目標網域

排名追蹤要回答的問題很直接:

目標網域有沒有出現在這個本地 SERP 裡?排第幾?

def find_target_ranking(results, target_domain):
    target = target_domain.replace("www.", "").lower()

    for item in results:
        domain = item["domain"].lower()

        if domain == target or domain.endswith("." + target):
            return {
                "position": item["position"],
                "matched_url": item["url"],
                "title": item["title"],
                "snippet": item["snippet"],
            }

    return {
        "position": None,
        "matched_url": "",
        "title": "",
        "snippet": "",
    }

如果沒有找到目標網域,保留 None。不要偷偷改成 99 或 100,除非你的報表系統明確定義了這個規則。

Step 5:保存本地排名快照

第一版用 CSV 就夠。

import csv
from datetime import datetime, timezone


CSV_COLUMNS = [
    "keyword",
    "target_domain",
    "city",
    "country",
    "language",
    "location",
    "device",
    "position",
    "matched_url",
    "title",
    "snippet",
    "collected_at",
]


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


def run_local_rank_tracking():
    collected_at = datetime.now(timezone.utc).isoformat()
    output_rows = []

    for keyword in KEYWORDS:
        for location_config in LOCATIONS:
            serp_json = fetch_local_serp(keyword, location_config)
            organic_results = normalize_organic_results(serp_json)
            ranking = find_target_ranking(organic_results, TARGET_DOMAIN)

            output_rows.append({
                "keyword": keyword,
                "target_domain": TARGET_DOMAIN,
                "city": location_config["city"],
                "country": location_config["country"],
                "language": location_config["language"],
                "location": location_config["location"],
                "device": location_config["device"],
                "position": ranking["position"],
                "matched_url": ranking["matched_url"],
                "title": ranking["title"],
                "snippet": ranking["snippet"],
                "collected_at": collected_at,
            })

    export_rankings(output_rows)


if __name__ == "__main__":
    run_local_rank_tracking()

每天跑一次,就能累積本地排名歷史。

如何使用這些排名資料?

有了排名快照後,就能回答更有價值的問題。

問題

怎麼看

哪些城市較弱?

按 city 分組,比較平均排名

哪些頁面在本地排名?

matched_url 分組

哪種語言表現更好?

比較 English、Spanish、French 或其他語言資料

哪些地區排名下跌?

比較今天和昨天的快照

哪些關鍵字需要本地頁面?

找出目標城市中沒有排名的關鍵字

Mobile 和 desktop 是否不同?

比較 device 欄位

這會讓本地 SEO 從猜測變成可重複的報告流程。

什麼時候該用資料庫?

CSV 適合測試。
一旦 workflow 定期執行,就應該改用資料庫。

一張簡單資料表可以包含:

欄位

類型

id

UUID 或 integer

keyword

Text

target_domain

Text

city

Text

country

Text

language

Text

device

Text

position

Integer 或 null

matched_url

Text

collected_at

Timestamp

之後可以做本地 SEO 看板、排名提醒、城市對比報告、連鎖門店可見度報告或每週 SEO 摘要。

Best practices

固定追蹤同一組 keyword 和 location 組合。頻繁變更追蹤範圍,會讓趨勢失真。

每一行都保存 city、country、language、device 和 timestamp。沒有上下文的本地排名資料沒有太多價值。

自然搜尋、Maps、Local Pack、Ads 和 Shopping 要分開。它們應該進入不同報告。

開發階段保存原始 API 回應。這有助於排查 parser 問題和 SERP feature 變化。

不要過度追蹤穩定關鍵字。對多數本地 SEO 來說,每日追蹤已經足夠。高頻追蹤更適合重要發布或波動市場。

使用本地語言查詢。不要只翻譯介面語言,真實搜尋行為可能和字面翻譯不同。

FAQ

什麼是用於本地 SEO 的 SERP API?

它是一種可以按關鍵字、地區、語言、國家和裝置程式化收集搜尋結果的 API,適合用於大規模追蹤本地排名。

為什麼要按城市追蹤排名?

Google 搜尋結果可能因城市而變化。同一個業務在一個市場排名很好,在另一個市場可能排名很弱。

為什麼語言會影響本地 SEO 追蹤?

搜尋語言會影響查詢意圖、結果標題、摘要和排名頁面。在多語市場,只追蹤一種語言可能會漏掉可見度缺口。

Desktop 和 mobile 要分開追蹤嗎?

要。Desktop 和 mobile SERP 可能不同。應把 device 作為獨立欄位保存,避免報告混合不同搜尋上下文。

這個流程可以追蹤 Google Maps 排名嗎?

可以,但 Maps 排名應該和自然搜尋排名分開解析和報告。Local Pack 和 Maps 回答的問題,與標準網頁結果不同。

CSV 足夠做本地 SEO 排名追蹤嗎?

CSV 適合原型和小型報告。如果要做定期追蹤、提醒、歷史趨勢和看板,建議使用資料庫。

免費試用TalorData

Scale Your Data
Operations Today.

Join the world's most robust proxy network.

Start Free Trial