🎯 カスタマイズ可能で検出回避型のクラウドブラウザ。自社開発のChromiumを搭載し、ウェブクローラーAIエージェント向けに設計されています。👉今すぐ試す
ブログに戻ります

スクレイプレス Deep SerpApiを使用してランクトラッカーを構築する

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

29-Jun-2026

TL;DR:

  • ランクトラッカーはスプレッドシートではなくループです。 各キーワードでGoogleにクエリを送り、オーガニックポジションを確認し、あなたのドメインがどこに位置するかを見つけ、その番号をスケジュールに書き留める — それが全体の仕組みです。
  • 難しいのはクリーンで解析可能なSERPを取得することです。 Googleは結果をパーソナライズし、レート制限をかけるため、ランクトラッカーは、毎回安定したpositionlinkを持つ構造化されたorganic_resultsを返す検索ソースが必要です。
  • Scrapeless Deep SerpApiはGoogleの結果をJSONで返します。 {"q": "<keyword>"}scraper.google.searchアクターに対して1つのPOST送信することで、organic_results配列が返されます — 各エントリはpositionlinkを持ち、これがランクトラッカーがあなたのドメインと一致させるために必要なすべてです。
  • ドメインの一致は文字列検索ではなくホスト比較です。 各結果のlinkをホストに解析し、www.を取り除いて、ターゲットドメインと比較します — したがって、blog.yourdomain.comyourdomain.com/pathは両方ともヒットとしてカウントされます。
  • 時間の経過によるスナップショットはポジションをデルタに変えます。 各実行を日付でキー付けして保存し、今日と最後の保存された実行を比較して、どのキーワードが上昇し、下落し、または結果から完全に外れたかを確認します。
  • 無料で始める。 新しいScrapelessアカウントには無料のDeep SerpApiクレジットが含まれています — app.scrapeless.comでサインアップし、このガイドのトラッカーを自分のキーワードセットに対して実行します。

はじめに:ランクトラッカーを構築せよ、借りるな

検索ランクはリスト内の位置です。あるキーワードに対して、あなたのドメインはオーガニックポジション3、または11、または最初のページには存在しない — そしてその数字はGoogleが再ランク付けし、競合他社が新しいコンテンツを公開すると変化します。それを追跡することは、ページが先週4から9にすべり落ちたことを知ることと、トラフィックが既に去ったかどうかを知ることの違いです。

ほとんどの「ランクトラッカーを構築する」ウォークスルーは、手動で更新するGoogleシートで終わったり、一度に1つのセルをスクレイピングしてGoogleがマークアップを変更する瞬間に壊れる式で終わります。それは月に一度チェックされる5つのキーワードには機能しますが、実際に気にするキーワードセットにはスケールしませんし、比較するための履歴も与えません。

このガイドは、Scrapeless Deep SerpApiの上にPythonで実際のプログラム的なランクトラッカーを構築します。APIはGoogleのオーガニック結果を構造化されたJSONとして返すため、トラッカーは小さく保たれます:キーワードをクエリし、ポジションを解析し、ドメインを一致させ、スナップショットを保存し、実行を比較して動きを計算します。最終的には、任意のキーワードセットを指してスケジュールに従って実行できるスクリプトが得られます。


プログラム的なランクトラッカーでできること

  • スケジュールに従ってキーワードセットを追跡する。 同じスクリプトを使って毎日または毎週数十のキーワードに対して実行し、ブラウザに触れずにポジションの履歴を構築します。
  • 単一ページのキーワードの広がりを観察する。 トラッカーを1つのURLのターゲットキーワードにポイントし、どの用語で、どこにランクしているかを確認します。
  • トラフィックの前にドロップを検出する。 ポジションが5から14に移動すると、その日は対処できる信号となります、月末に知るのではなく。
  • 地域ランキングを比較する。 同じキーワードは国ごとに異なるランクを持つため、glパラメータを変えるトラッカーは各市場での順位を示します。
  • ランキングを自分のダッシュボードにフィードする。 すべての結果がJSON形式なので、ポジションデータはデータベース、ノートブック、またはレポート作業に直接挿入され、スクレイピングの手間がかかりません。
  • 移行やデザインの監査を行う。 サイトの変更前にランキングのスナップショットを取り、変更後に比較しますので、回帰はドロップしたキーワードのリストとして表示されます。

なぜScrapeless Deep SerpApiなのか

Scrapeless Deep SerpApiは、SERPを生のHTMLではなく構造化されたJSONとして返すマネージドGoogle検索エンドポイントです。特にランクトラッカーのために、以下の利点を提供します:

  • 構造化されたorganic_results — 各結果はpositiontitlelinkを持つオブジェクトであり、HTMLパースやGoogleの次のレイアウト変更によって壊れるCSSセレクタはありません。
  • 安定したpositionフィールド — APIは各オーガニック結果のランクを報告し、これはランクトラッカーが記録する正確な値です。
  • 国と言語の制御glおよびhlパラメータを使用すれば、1つのエンドポイントから市場ごとのランキングを測定できます。
  • 裏での住宅プロキシの使用 — 検索は195カ国以上の住宅プロキシ経由で行われるため、結果はデータセンターにフラグされていない実際のユーザーのSERPを反映します。
  • インラインレスポンスscraper.google.searchアクターは同じリクエストで結果を返すため、トラッカーはポーリングステップなしでJSONを直接読み取ります。

無料プランでAPIキーを取得するには、app.scrapeless.comにアクセスしてください。


前提条件

  • Python 3.10以上
  • requestsライブラリ(pip install requests
  • ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップ
  • トラッキングしたいキーワードセットとターゲットドメイン
  • ターミナルの基本的な操作に慣れていること

APIキーを環境から読み取り、スクリプトに埋め込まないようにします:

bash Copy

export SCRAPELESS_API_KEY="your_api_token_here"

Copy
---

## ステップ 1 — 1 つのキーワードで Google にクエリを送信する

トラッカーの最小単位は 1 つのキーワードクエリです。`scraper.google.search` アクターを使用して Deep SerpApi エンドポイントに `POST` を送信し、クエリを含む `input` オブジェクトを持たせます。`q` フィールドはキーワードであり、`gl` および `hl` は国と言語を設定するため、すべての実行が同じ市場を測定します。

```python
import os
import requests

ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"


def search(query, gl="us", hl="en"):
    payload = {
        "actor": "scraper.google.search",
        "input": {"q": query, "gl": gl, "hl": hl},
    }
    response = requests.post(
        ENDPOINT,
        json=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]},
    )
    response.raise_for_status()
    return response.json()


data = search("scrapeless scraping browser")
results = data.get("organic_results", [])
print(f"{len(results)} organic results")
for result in results[:5]:
    print(result["position"], result["link"])

レスポンスは、単一のラウンドで返される JSON オブジェクトです。organic_results はトラッカーが読み取る配列です。各要素は、ページ上のランクである position と、結果の URL である link を持ちます。titlesnippet、および source も存在しますが、ランクトラッカーは positionlink のみが必要です。


ステップ 2 — オーガニックポジションを解析する

ステップ 1 のクエリは、オーガニック結果、広告、関連検索、および Google がそれらを表示するインラインビデオを含む完全な SERP オブジェクトを返します。トラッカーは organic_results のみを扱い、各エントリあたり 2 つのフィールドのみで動作します。各結果を (position, link) ペアに縮小し、一致のステップがスキャンするクリーンなリストを持つようにします。

python Copy
def organic_positions(data):
    pairs = []
    for result in data.get("organic_results", []):
        pairs.append((result["position"], result["link"]))
    return pairs


positions = organic_positions(search("scrapeless scraping browser"))
for position, link in positions:
    print(position, link)

position は、Google が返されたページ上で結果に割り当てたランクです。リストインデックスをカウントするのではなく、フィールドから直接読むことで、API が結果タイプを省略したり、ページ構成が実行間で変動した場合でも値が正しく保たれます。


ステップ 3 — ドメインにランクを一致させる

ランクは、そのリストにおけるあなたのドメインの position です。一致させるのはホストに基づかなければならず、URL のサブストリングではないため、生のリンクにおける "yourdomain" の検索は競合他社のパスやクエリストリングと誤って一致しません。各 link をホストに解析し、先頭の www. を削除し、サブドメインもヒットとして扱います。

python Copy
from urllib.parse import urlparse


def host_of(url):
    host = urlparse(url).netloc.lower()
    return host[4:] if host.startswith("www.") else host


def rank_of(domain, data):
    domain = domain.lower()
    for result in data.get("organic_results", []):
        host = host_of(result["link"])
        if host == domain or host.endswith("." + domain):
            return result["position"]
    return None


data = search("scrapeless scraping browser")
rank = rank_of("scrapeless.com", data)
print("scrapeless.com:", rank if rank is not None else "not in returned results")

rank_of は、あなたのドメインが持つ最初の位置を返すか、返された結果に表示されない場合は None を返します。None は実際のデータであり、これはドメインがそのキーワードのために API が返したページにないことを意味し、トラッカーはそれを記録すべきであり、スキップすべきではありません。

無料プランで API キーを取得してください: app.scrapeless.com


ステップ 4 — キーワードセットを追跡し、スナップショットを保存する

単一のキーワードはトラッカーではありません。キーワードセットを通じて一致を実行し、結果に日付スタンプを付け、それを履歴ファイルに追加します。各スナップショットは 1 回の実行です: 日付とキーワードから位置へのマップになります。それらをリストとして保存することで、差分ステップのために完全なタイムラインを一箇所に保持できます。

python Copy
import json
from datetime import date, timezone, datetime
from pathlib import Path

HISTORY = Path("rank_history.json")


def snapshot(domain, keywords):
    ranks = {}
    for keyword in keywords:
        ranks[keyword] = rank_of(domain, search(keyword))
    return {"date": date.today().isoformat(), "domain": domain, "ranks": ranks}


def append_snapshot(snap):
    history = json.loads(HISTORY.read_text()) if HISTORY.exists() else []
    history.append(snap)
    HISTORY.write_text(json.dumps(history, indent=2))
    return history


keywords = [
    "scrapeless scraping browser",
    "scrapeless deep serp api",
    "anti detection cloud browser",
]
snap = snapshot("scrapeless.com", keywords)
append_snapshot(snap)
for keyword, position in snap["ranks"].items():
    print(f"{position if position is not None else '—':>3}  {keyword}")

各実行は1つのスナップショットを追加します。キーワードセットはあなたが定義するもので、ページがランク付けされるために意図されている用語に入れ替えます。Noneとして返されるポジションは履歴にnullとして書き込まれ、ページから落ちたキーワードはギャップではなく、記録されたイベントとなります。


ステップ5 — 実行間のランクデルタを計算する

履歴は、それを比較したときにのみ有用です。同じドメインの最新のスナップショットを前のものと比較し、各キーワードを分類します: 改善、ドロップ、変更なし、新たにランクイン、または脱落。デルタは以前のポジションから現在のポジションを引いたものなので、正の数はドメインがページ上で上昇したことを意味します。

python Copy
def deltas(history, domain):
    runs = [s for s in history if s["domain"] == domain]
    if len(runs) < 2:
        return {}
    previous, current = runs[-2]["ranks"], runs[-1]["ranks"]
    report = {}
    for keyword, now in current.items():
        before = previous.get(keyword)
        if now is None and before is not None:
            report[keyword] = "結果から脱落"
        elif now is not None and before is None:
            report[keyword] = f"新たに{now}でランクイン"
        elif now is not None and before is not None:
            move = before - now
            report[keyword] = "変更なし" if move == 0 else f"{move:+d} (以前は{before}、現在は{now})"
    return report


history = json.loads(HISTORY.read_text())
for keyword, change in deltas(history, "scrapeless.com").items():
    print(f"{keyword}: {change}")

最初の実行では比較するものがないため、deltasは空を返します — トラッカーは単にベースラインを保存します。2回目の実行以降、各キーワードは移動ラベルを持ち、それをアラート、ダッシュボード、または週次レポートにルーティングできます。ステップ4 + ステップ5のペアをcronやCIジョブでスケジュールすれば、ランクトラッカーは自動で実行されます。


返ってくるもの

履歴ファイルはトラッカーの出力です: 各実行ごとに1つのスナップショット、各々が日付とキーワードからポジションへのマップを持っています。以下の形は、append_snapshotが書き込むものと正確に一致します。

json Copy
// 説明的なサンプル — スキーマはまさにappend_snapshotが書き込むもの; フィールド値は説明的です。
[
  {
    "date": "2026-06-16",
    "domain": "yourdomain.com",
    "ranks": {
      "あなたの主なキーワード": 4,
      "あなたの副次的なキーワード": 11,
      "まだランク付けされていないキーワード": null
    }
  },
  {
    "date": "2026-06-23",
    "domain": "yourdomain.com",
    "ranks": {
      "あなたの主なキーワード": 2,
      "あなたの副次的なキーワード": 9,
      "まだランク付けされていないキーワード": 18
    }
  }
]

ライブキーワード実行からのいくつかの正直な観察:

  • ポジションカウントはAPIのpositionフィールドから取得されます。 直接読んでください; 配列インデックスからランクを推測しないでください、なぜなら返される結果の混合は実行ごとに異なるからです。
  • オーガニック結果のカウントはクエリごとに異なります。 ある実行では6つのオーガニック結果が返され、別の実行では8つが返されることがあるので、深くランク付けされたドメインのNoneは単にその日返されたセットの下位にあったことを意味することがあります。
  • snippet_highlighted_wordsは条件付きです。 一部の結果はそれを持ち、一部は持たない; ランクトラッカーはそれを無視しますが、他のフィールドを読むものはそれをヌル可能として扱うべきです。
  • 国が重要です。 同じキーワードはglの値ごとに異なるランクを持つため、トラッキングするキーワードごとに1つの国を指定し、実行間で常に一定に保つことで、比較対象を同じにします。

結論: ランクトラッキングパイプラインをスケールする

ランクトラッカーは5つの動きに要約されます: キーワードをクエリし、オーガニックポジションを解析し、ホスト上でドメインを一致させ、日付付きのスナップショットを保存し、最後の実行と比較します。Deep SerpApiに基づいて構築されたこれらの動きは、GoogleのHTMLと戦うのではなく構造化されたorganic_results配列を読み取るため、全体のトラッカーは100行未満に保たれます。

ここから、重要な軸に沿ってスケールします: キーワードセットを広げ、マーケットごとにglを変え、スナップショットをデータベースにプッシュして履歴が単一のファイルを超えて長生きできるようにします。同じJSONファーストアプローチは、Scrapeless Scraper APIガイドでカバーされている他のサーフェスにも拡張されます。価格プランDeep SerpApiドキュメントを確認して、完全なパラメータセットを取得し、キーワードごとに1つの国を固定し、positionフィールドからポジションを読み取り、欠如しているドメインを実際のnullとして扱ってください。


AI駆動の検索パイプラインを構築する準備はできましたか?

私たちのコミュニティに参加して無料プランを取得し、ランクトラッキングと検索パイプラインを構築している開発者とつながりましょう: Discord · Telegram
app.scrapeless.comに登録して無料のDeep SerpApiクレジットを手に入れ、上記のトラッカーをプロジェクトのニーズに合わせたキーワードセットと市場に適応させてください。


FAQ

Q: APIを使ってGoogleのランキングを追跡することは合法ですか?
公開されている検索結果を照会するのがランキングトラッキングの一般的な仕組みであり、Deep SerpApiはブラウザが返すのと同じ公開のSERPを返します。すなわち、Googleがクロールしインデックスしたランク付けされたページ、サイト所有者がサイトマッププロトコルを通じて公開する同じURLのセットです。ルールは管轄や使用ケースによって異なるため、Googleの利用規約を確認し、ロボット排除プロトコルのクロール指令と合わせて、特定のアプリケーションについて法律相談を行ってください。

Q: これはGoogle Sheetsのランキングトラッカーとどう違いますか?
スプレッドシートのトラッカーは、1つのセルをチェックし、実際の履歴を保存しません。このスクリプトは、フルキーワードセットをプログラム的に照会し、日付付きスナップショットを記録し、実行間の動きを計算するので、大規模なキーワードセットにスケールし、スケジュールに沿って実行されます。

Q: トラッカーを実行するのにプロキシは必要ですか?
別途プロキシの設定は必要ありません。Deep SerpApiは、195以上の国々で住宅用出口を通じて検索をルーティングするため、結果はIPを管理せずに実際のユーザーのSERPを反映します。

Q: 特定の国のランキングを追跡するにはどうすればよいですか?
searchを呼び出す際に、glパラメータに国コードを、hlに言語を設定してください。特定のキーワードに対しては、実行ごとに同じglを維持して、位置履歴を比較できるようにしてください。

Q: nullの位置は何を意味しますか?
それは、ドメインがその実行に対してAPIが返したキーワードのオーガニック結果に存在しなかったことを意味します。つまり、返されたセットよりも下位に順位しているか、ページから消えてしまったということです。トラッカーはそれを実際のイベントとして記録するため、脱落がデルタに表示されます。

Q: トラッカーはどのくらいの頻度で実行すべきですか?
ほとんどのニーズには日次または週次がカバーできます。スナップショットと差分ステップをcronまたはCIジョブでスケジュールしてください。ランクはGoogleのタイムラインで動くため、1日未満のポーリングは信号を追加することはほとんどありません。

Q: サブドメインやパスを私のドメインにマッチさせることはできますか?
はい。rank_ofマッチャーはホストで比較し、サブドメインをヒットとして扱うため、blog.yourdomain.comyourdomain.com/pageの両方があなたのドメインのランキングにカウントされます。

Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ