ブログに戻ります

Google SERPスナップショットデータセットを構築するためのSEOリサーチ

Michael Lee
Michael Lee

Expert Network Defense Engineer

11-Sep-2026

TL;DR:

  • Google SERPトラッキングには検索の記録が必要であり、ランキングの列だけでは不十分です。 正確なリクエスト、クライアントタイムスタンプ、処理状態、そして生のレスポンスを一緒に保存します。
  • 自身の観察から履歴を構築します。 現在の検索リクエストは、収集が始まる前の日々を埋めるものではありません。
  • 固定されたコンテキスト内でオーガニック結果を比較します。 クエリ、国、言語、または収集の深さの変更は、異なる比較グループを作成します。

ランク値は、スプレッドシートがどの検索によって生成されたかを記録しなくなると、その意味を失います。同じページは異なるクエリ、異なる市場、そして異なる結果モジュールの下に表示されることがあります。有用なデータセットは、これらの条件をすべての観察に付随させておきます。

Google SERPトラッキングは、繰り返し可能な収集と比較可能な結果として何がカウントされるかの明確な定義で始まります。Scrapeless Google Search API は構造化された検索データを提供し、アプリケーションはストレージポリシーと履歴を供給します。この文書は、キャプチャファイルから別のアナリストが検査できるデータセットまで、その境界を明示的に構築します。

スケジュールの前に観察を定義する

スナップショットは、一つの設定された検索リクエストの保存された結果です。それは提出された入力と、クライアントによって受け取られたレスポンスを含みます。それは、そのクエリに対してすべてのユーザーが見たものを確立しません。

収集のスケジュールを設定する前にデータセットの範囲を書き留めてください。クエリリスト、市場のコンテキスト、言語、結果のタイプ、そしてページネーションポリシーを選択します。各クエリに研究トピックを割り当て、後のレポートでそのクエリが含まれた理由を説明できるようにします。小さなレビューされたサンプルは、大きなコレクションよりも解釈しやすく、意図が毎週変わるようなコレクションよりも解釈が容易です。

収集スケジュールを検索コンテキストから分離します。コンテキストは比較可能な観察を識別します;タイムスタンプはアプリケーションがそれらを要求し、受け取った時刻を特定します。クライアントの受取タイムスタンプは、Googleがページを生成した正確な瞬間についての主張ではありません。

生の記録と派生行を保持する

生の記録はリクエスト、レスポンス、及び収集状態を保持する必要があります。派生結果行は安定した実行識別子を通じてその記録を指し示すべきです。

positiontitlelink、および snippet のようなフィールドをオーガニック結果のプロジェクションに含めておきます。また、ソース順序を保持する必要がある場合は、配列の順序を別のフィールドとして保持します。返された位置が欠落している場合は、そのまま欠落の状態を保持するべきです;配列インデックスが静かにそれを置き換えるべきではありません。

JSONデータモデル は、配列、オブジェクト、およびヌルに異なる意味を与えます。それらの区別をアーカイブ内で保持し、報告層が後でより単純なテーブルを使用しても。生のレスポンスは、観察を再収集することなくマッピングを変更することを可能にします。

派生データとともにパーサーバージョンを保存します。パーサーが修正された場合は、影響を受けたプロジェクションを再生成し、新しいバージョンをマークします。パーサーの更新を市場の変化として扱うことは、誤ったトレンドを生むことになります。

キャプチャファイルの前提条件

requests パッケージがインストールされ、SCRAPELESS_API_KEY を通じてScrapeless APIキーが供給されたPythonを使用します。python3 -m pip install requests でクライアントをインストールします。残りのインポートは標準ライブラリを使用します。

以下のスクリプトをcapture_snapshot.pyとして保存し、python3 capture_snapshot.pyを実行します。それはsnapshotsの下に一意の名前のJSONファイルを1つ書き込みます。そのディレクトリは書き込み可能であり、あなたのストレージポリシーに含まれていることを確認してください。この例はローカルキャプチャプログラムです;スケジューラ、データベース、またはタスク結果の取得サービスを供給しません。

認証された実行には、あなた自身のアカウントキーが必要です。ここではライブアカウントの結果は主張されていません。リクエストインターフェースは現在のGoogle Searchリクエストワークフロー に対してチェックされています;周囲のファイルおよび状態の処理はローカルでテストできます。

リクエストとその処理状態をキャプチャする

キャプチャプログラムはactor: scraper.google.searchを検索設定とともにinput内に送信します。認証にはx-api-tokenヘッダーを使用します。

注:このブロックはSCRAPELESS_API_KEYおよびサービスアクセスを必要とします。この記事のためにライブアカウントに対して実行されていません。保留中のタスクレスポンスは検査のために保存されます;タスク結果の取得はこの例の範囲外です。

python Copy
import json
import os
import uuid
from datetime import datetime, timezone
from pathlib import Path
import requests

def capture(input_parameters, directory="snapshots"):
    key = os.environ["SCRAPELESS_API_KEY"]
    request = {"actor": "scraper.google.search", "input": input_parameters}
    record = {
        "schema_version": 1,
        "run_id": str(uuid.uuid4()),
        "requested_at": datetime.now(timezone.utc).isoformat(),
        "request": request,
    }
    try:
        response = requests.post(
            "https://api.scrapeless.com/api/v1/scraper/request",
            headers={"x-api-token": key}, json=request, timeout=120,
        )
        record["http_status"] = response.status_code
        record["received_at"] = datetime.now(timezone.utc).isoformat()
        try:
            payload = response.json()
        except ValueError:
            payload = None
            record["response_text"] = response.text
        record["response"] = payload
        organic = payload.get("organic_results") if isinstance(payload, dict) else None
        if response.status_code == 201:
            record["state"] = "pending"
        elif response.status_code != 200:
            record["state"] = "http_error"
        elif not isinstance(organic, list) or any(not isinstance(x, dict) for x in organic):
            record["state"] = "unmapped"
        else:
            record["state"] = "observed" if organic else "empty"
    except requests.RequestException as exc:
        record["state"] = "transport_error"
        record["error_type"] = type(exc).__name__
    root = Path(directory)
    root.mkdir(parents=True, exist_ok=True)
    path = root / (record["run_id"] + ".json")
    with path.open("x", encoding="utf-8") as handle:
        json.dump(record, handle, ensure_ascii=False, indent=2)
    print(path, record["state"])
    return path

if __name__ == "__main__":
    capture({"q": "coffee", "gl": "us", "hl": "en", "start": 0,
             "google_domain": "google.com", "device": "desktop"})

スクリプトは、コレクションのカバレッジに役立つエラーの結果を含むHTTP操作の後にレコードを書き込みます。例外記録には、不必要なリクエストの詳細を公開する可能性のある完全な診断文字列ではなく、例外の種類が含まれています。キーはアーカイブされた検索データとは別に保存してください。

120 タイムアウトはアプリケーションの選択です。これはサービスの応答時間の保証ではありません。Pythonのタイムゾーン対応のタイムスタンプは、クライアントの時間を明示的にします。別のコレクターがデータセットに書き込むときは、同じ慣例を使用してください。

Scrapelessを使用してスクレイピングを開始する

Scrapelessでウェブスクレイピングと自動化のワークフローを強化しましょう!
今すぐ登録して、$5の無料クレジットを獲得しましょう — クレジットカードは不要です

今すぐScrapeless Dashboardで無料クレジットを請求してください。

欠落したコレクションを独自の結果として扱う

失敗した観測は、トラックされたドメインが消失したことを意味しません。ステートフィールドがその誤りからレポートを保護します。

observedは、成功したデータ応答が非空のオーガニックオブジェクトの配列を含んでいたことを意味します。emptyは、配列が存在し空であったことを意味します。unmappedは、成功した応答がその最小の形に一致しなかったことを意味します。これらはアプリケーションラベルであり、追加のAPIステータスコードではありません。

pendingは、文書化されたHTTP 201タスクの状態を記録します。返されたタスク識別子は生の応答と一緒に保持し、その実行を観測されたとカウントする前に、別に検証された結果取得ワークフローを使用してください。HTTPエラーとトランスポートエラーはコレクションレポートに属し、ランキング動きのチャートには含まれません。

週次ビューを準備するときは、いくつの予定された観測が利用可能であったかを示してください。欠落しているか解決されていない実行のリストを結果比較の横に保持してください。失敗したコレクションを静かに除外するチャートは、証拠が薄くなる間は安定しているように見える場合があります。

類似のオーガニック結果を比較する

比較キーには、観測に影響を与える可能性のあるすべての提出された検索設定を含める必要があります。最も単純で保守的な実装は、アプリケーションのタイムスタンプや実行識別子を除外して、ソートされたキーでリクエストオブジェクト全体を直列化します。

Pythonの決定論的JSONシリアライゼーションオプションは、ソートされた辞書キーをサポートします。これにより、提出された設定の再現可能な表現がアプリケーションに提供されます。異なる設定が意味的に同等であることは証明されず、上流の検索動作を固定することはありません。

ページスライスを比較する際は、startをキーに保持してください。レポートが複数のページを1つのコレクションウィンドウに統合する場合は、その高レベルのウィンドウを別に定義し、欠落したページにマークを付けてください。最初のページの観測をより深いコレクションと混同し、その違いをランキングの向上と呼ばないでください。

取得したオーガニックポジションは、収集した応答によってサポートされる解釈の範囲内でのみ使用してください。画像、ローカル、その他のモジュールは別々に扱います。Search Consoleの位置測定ルールは異なる報告システムを説明しています。サンプルされたAPI位置をSearch Consoleの平均位置として再ラベル付けすべきではありません。

レビュー可能な変更ログを作成する

有用な変更記録は、古い実行、新しい実行、コンテキスト、影響を受けたURL、および変更を検出したルールを特定します。原因を提案する前に観測を説明する必要があります。

ドメインの場合、「両方のキャプチャスライスに存在する」、「このスライスで新たに観測された」、「後のスライスで観測されなかった」と区別してください。最後のラベルは「Googleから削除された」よりも狭いです。ドメインは収集された深さの外にあり、URLの置き換えはドメインの存在を変えない場合があります。

URLの場合、正確なリンクと正規化されたホストの比較の両方を保持します。正規化はページをグループ化するのに役立ちますが、パス、パラメーター、またはサブドメインを削除すると、調査が重要視する事柄が混在する可能性もあります。各正規化ルールを文書化し、派生値の隣に元のリンクを保持してください。

保存された証拠を持って人間のレビューにルート変更を送信します。ページの更新、クエリコンテキスト、およびより広い検索の変更はすべて調査に値するかもしれません。スナップショットのペアだけでは、どちらが動きを引き起こしたかを確立できません。

結論

データセットを明示的なスコープと生のキャプチャ記録で開始します。実行状態が理解されてからのみ、派生したオーガニック行を追加し、リクエスト設定が一致するレコードを比較します。その結果は、あなたのチームが監査できる履歴であり、コレクションのギャップがランキングの主張へと変換されるのではなく可視化されます。
A Python検索コレクション のウォークスルーは追加の背景を提供します。現在のリクエストインターフェースをここで示されているデータセットに使用してください。

次の検索観察を構築する

チームが答える必要のある質問に基づいて Google Search API を構成します。収集頻度を設定する前に Scrapelessの価格 を確認してください。Google Searchパラメータモデル はこのワークフローで使用されるコンテキスト制御を説明しています。

Discord または Telegram でコミュニティと実装を議論してください。

FAQ

Q: これは収集開始前の歴史的なGoogleランキングを取得しますか?

いいえ。このワークフローは、保存した観察から歴史を構築します。以前のスナップショットを作成したり、歴史的なランキングデータベースを提供したりすることはありません。

Q: 空のオーガニック配列はリクエストの失敗と同じですか?

いいえ。存在する空の配列は empty として記録されます;HTTPの失敗、トランスポートの失敗、保留中のタスク、およびマッピングされていないレスポンスには別々の状態があります。

Q: 異なる国は同じランキング履歴を共有できますか?

共有のストレージシステムを持つことはできますが、比較グループは別々のままであるべきです。国はリクエストコンテキストの一部です。

Q: 結果の位置は訪問数や収益を測定しますか?

いいえ。返された検索観察を説明します。トラフィックとビジネスの成果には、それぞれの証拠と一致する定義が必要です。

Q: スナップショットはどのくらいの頻度で収集すべきですか?

研究の質問、予算、およびレビュー能力に合ったリズムを選択してください。見逃した観察を記録し、サンプリングされたスケジュールがすべての変化をキャッチしていることを示唆しないようにしてください。

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

最も人気のある記事

カタログ