如何大規模追蹤 Google 排名,而無需自行建立爬蟲

了解如何使用 SERP API 大規模追蹤 Google 排名,收集關鍵字位置、目標網域、地區、裝置和歷史排名快照,而不需要維護自己的爬蟲。

talor ai
Last updated on
3 min read

追蹤一個 Google 排名很簡單。

打開瀏覽器,輸入關鍵字,找到自己的頁面,記下位置。完成。

但如果要每天追蹤 5,000 個關鍵字,還要區分國家、城市、語言和裝置,事情就完全不是一個量級了。這時候,自建爬蟲很容易從「聰明方案」變成一個每天都要餵的資料小怪獸。

對 SEO 團隊來說,排名追蹤不只是看「今天排第幾」。

更有價值的是趨勢:

哪些關鍵字上升或下降?
哪些頁面掉了?
哪些競品出現了?
Mobile 排名是否變了?
不同城市或語言的結果是否不同?

要穩定回答這些問題,你需要可重複的 SERP 資料。SERP API 可以提供結構化搜尋結果,讓你不必自己維護瀏覽器自動化、代理路由、CAPTCHA 處理和解析邏輯。

快速回答

要大規模追蹤 Google 排名,可以使用 SERP API 針對每個關鍵字、市場、語言和裝置取得 Google 結果。然後提取自然搜尋結果,匹配目標網域,保存排名位置,並比較每日快照。

實際流程通常是:

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

為什麼不建自己的 Google 爬蟲?

你當然可以自建爬蟲。很多團隊都試過。

第一版通常能跑。然後問題開始慢慢出現:

問題

影響

HTML 變化

搜尋頁版面變了,解析器就壞

地區差異

國家、城市、語言和裝置會影響結果

封鎖和 CAPTCHA

自動化流程不穩定

SERP features

廣告、Maps、Shopping、Images、PAA 讓解析更複雜

擴展成本

關鍵字越多,重試、佇列、存儲和監控越多

資料一致性

歷史對比需要穩定欄位

一次性實驗可以用爬蟲。
長期排名追蹤,最後會變成基礎設施工作。

大多數 SEO 團隊真正需要的是排名資料,不是爬蟲工程。

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

一個可用的排名追蹤器,不應該只保存關鍵字和排名。

欄位

為什麼重要

keyword

被追蹤的查詢

target_domain

要監控的網站

position

自然搜尋排名

matched_url

實際排名頁面

title

Google 顯示的結果標題

snippet

可見摘要

country

市場上下文

language

搜尋語言

location

城市或地區

device

Desktop 或 mobile

collected_at

用於歷史比較的時間戳

沒有國家、語言、裝置和時間戳,排名資料就會失去上下文。

美國 desktop SERP 的第 3 名,不等於 London mobile SERP 的第 3 名。

Step 1:準備關鍵字和市場

先從一組小資料開始。

KEYWORDS = [
    "best project management software",
    "crm software for small business",
    "email marketing tools",
]

MARKETS = [
    {
        "country": "us",
        "language": "en",
        "location": "United States",
        "device": "desktop",
    },
    {
        "country": "gb",
        "language": "en",
        "location": "London, England, United Kingdom",
        "device": "mobile",
    },
]

TARGET_DOMAIN = "example.com"

正式使用時,關鍵字通常來自 SEO 資料庫、Google Search Console 匯出、內容計畫或競品監控清單。

Step 2:發送 Google 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_google_results(keyword, market):
    payload = {
        "engine": "google",
        "q": keyword,
        "gl": market["country"],
        "hl": market["language"],
        "location": market["location"],
        "device": market["device"],
        "num": 10,
        "output": "json",
    }

    return call_serp_api(payload)

SERP API 的價值在於,每次請求都能帶上搜尋上下文:關鍵字、國家、語言、地區和裝置。

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,除非你的報表系統明確定義了這個規則。

Step 5:保存排名快照

第一版用 CSV 就夠。

import csv
from datetime import datetime, timezone


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


def export_rankings(rows, filename="google_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_tracking():
    collected_at = datetime.now(timezone.utc).isoformat()
    output_rows = []

    for keyword in KEYWORDS:
        for market in MARKETS:
            serp_json = fetch_google_results(keyword, market)
            organic_results = normalize_organic_results(serp_json)
            ranking = find_target_ranking(organic_results, TARGET_DOMAIN)

            output_rows.append({
                "keyword": keyword,
                "target_domain": TARGET_DOMAIN,
                "country": market["country"],
                "language": market["language"],
                "location": market["location"],
                "device": market["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_tracking()

這會輸出一份排名快照。

每天跑一次,就有了排名歷史。

什麼時候 CSV 不夠用?

CSV 適合測試。
一旦你每天追蹤排名,就應該改用資料庫。

一張基礎表可以這樣設計:

欄位

類型

id

UUID 或 integer

keyword

Text

target_domain

Text

position

Integer 或 null

matched_url

Text

country

Text

language

Text

location

Text

device

Text

collected_at

Timestamp

後續可以做:

  • 排名趨勢圖

  • 關鍵字變動提醒

  • 頁面掉排名報告

  • 競品可見度報告

  • 本地 SEO 看板

  • 每週 SEO 摘要

擴展檢查清單

當追蹤規模變大,真正難的就不是幾段程式碼,而是運維。

可以用這份清單檢查:

項目

建議

排程

按日、按週或按小時執行

佇列

把大量關鍵字拆成任務

重試

對失敗請求做 backoff retry

去重

避免重複追蹤同一組 keyword + market

存儲

保存每次快照,不只保存最新結果

監控

追蹤 API 錯誤、空結果、異常下跌

成本控制

不要過度頻繁追蹤穩定關鍵字

報告

區分排名變化和 SERP feature 變化

規模一大,rank tracking 就是資料管線。
讓它保持簡單,才會穩。

Best practices

固定追蹤同一組關鍵字。
如果每天換關鍵字,趨勢就很難判斷。

每一行都保存 location、language、country、device 和 timestamp。
沒有上下文的排名,只是一個飄在空中的數字。

自然搜尋、廣告、Local Pack、Shopping、Maps 要分開。
它們回答的是不同問題。

開發階段保留原始回應。
這有助於排查欄位缺失和解析問題。

不要每小時追蹤所有關鍵字,除非真的有業務需要。
資料多,不等於資料更有價值。

查看排名下跌時,要看上下文。
可能是新競品出現,也可能是 SERP feature 變化、地區差異,或者你的頁面確實失去相關性。

FAQ

什麼是 Google 排名追蹤?

Google 排名追蹤是指持續監控某個網站在特定關鍵字搜尋結果中的排名位置。好的排名追蹤還會保存市場、語言、裝置、URL 和時間戳。

不自建爬蟲也能追蹤 Google 排名嗎?

可以。SERP API 可以返回結構化 Google 搜尋結果,你可以直接提取 position、URL、title、snippet 和 domain,而不需要維護自己的爬蟲。

為什麼 SERP API 比自建爬蟲更適合排名追蹤?

自建爬蟲需要長期處理解析、封鎖、地區、重試和版面變化。SERP API 能提供更乾淨的資料層,更適合長期排名追蹤。

多久追蹤一次排名比較合適?

活躍 SEO 專案通常可以每日追蹤。變化較慢的網站,每週追蹤也可以。高頻追蹤應留給重要關鍵字、產品發布或波動市場。

Desktop 和 mobile 要分開追蹤嗎?

要。Desktop 和 mobile 結果可能不同。應把 device 作為獨立欄位保存,避免報表混在一起。

可以追蹤本地排名嗎?

可以。加入 city 或 region 等 location 欄位,並在每次排名快照中保存。本地 SEO 不應只看國家級搜尋結果。

Scale Your Data
Operations Today.

Join the world's most robust proxy network.

Start Free Trial