Local SEO SERP API:如何按城市和語言追蹤排名
了解如何使用 SERP API 進行本地 SEO 排名追蹤,按城市、國家、語言和裝置收集搜尋結果,並保存排名快照用於本地 SEO 報告。
本地 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
如果報告只顯示一個平均排名,就可能把重要的本地差異藏起來。城市級報告可以幫你看清哪些地區可見度強,哪些落地頁較弱,哪些市場被競品搶走了。
本地排名追蹤應該收集哪些資料?
一條有用的本地排名資料,不應該只有關鍵字和排名。
|
欄位 |
為什麼重要 |
|
|
被追蹤的查詢 |
|
|
要監控的網站 |
|
|
城市或本地市場 |
|
|
國家市場上下文 |
|
|
搜尋語言 |
|
|
Desktop 或 mobile |
|
|
自然搜尋排名 |
|
|
實際排名頁面 |
|
|
搜尋結果標題 |
|
|
可見摘要 |
|
|
用於歷史比較的時間戳 |
沒有 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 分組,比較平均排名 |
|
哪些頁面在本地排名? |
按 |
|
哪種語言表現更好? |
比較 English、Spanish、French 或其他語言資料 |
|
哪些地區排名下跌? |
比較今天和昨天的快照 |
|
哪些關鍵字需要本地頁面? |
找出目標城市中沒有排名的關鍵字 |
|
Mobile 和 desktop 是否不同? |
比較 device 欄位 |
這會讓本地 SEO 從猜測變成可重複的報告流程。
什麼時候該用資料庫?
CSV 適合測試。
一旦 workflow 定期執行,就應該改用資料庫。
一張簡單資料表可以包含:
|
欄位 |
類型 |
|
|
UUID 或 integer |
|
|
Text |
|
|
Text |
|
|
Text |
|
|
Text |
|
|
Text |
|
|
Text |
|
|
Integer 或 null |
|
|
Text |
|
|
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 適合原型和小型報告。如果要做定期追蹤、提醒、歷史趨勢和看板,建議使用資料庫。