検索エンジン最適化(SEO)において、自社サイトが検索結果のどこに表示されているかを把握することは基本中の基本です。SERPトラッキングは、特定のキーワードに対する検索結果ページ(Search Engine Results Page)の順位や表示形式を継続的に監視し、変動を記録する手法です。本記事では、SERPトラッキングの仕組みから技術的課題、プロキシを活用した実装方法までを解説します。
SERPトラッキングの基礎知識
SERPトラッキングとは、指定したキーワード群について検索結果を定期的に取得し、URLごとの掲載順位やSERPフィーチャー(Featured Snippet、People Also Ask、画像パックなど)の出現状況を記録するプロセスを指します。手動で検索して順位を確認する方法はスケールせず、数百〜数万キーワードを日次で監視するには自動化が不可欠です。
検索結果はユーザーの位置、言語、検索履歴、デバイスによって変動します。たとえば東京から「ラーメン」を検索した結果と、大阪から検索した結果は異なります。そのため、正確なトラッキングには地理的位置を制御した上で検索リクエストを送信する必要があります。
Googleの検索結果は、Googlebotのクローリングと同様に、プログラムから取得可能ですが、大量の自動リクエストを送信するとボット検出の対象になります。詳細はGoogle検索セントラルのドキュメントも参照してください。
SERPフィーチャーの種類
- オーガニック結果:10件の青いリンク。従来型の順位。
- Featured Snippet:検索意図に直接回答する抜粋。順位0とも呼ばれる。
- People Also Ask:関連質問のアコーディオン。展開で追加結果を表示。
- 画像・動画パック:画像検索や動画検索結果へのリンク。
- ローカルパック:Googleビジネスプロフィールに基づく地図結果。
- ショッピング広告・リスティング広告:有料枠。SEOでは直接制御不可。
モダンなSERPトラッキングツールは、これらのフィーチャー出現状況も記録し、単一の「順位」だけでなく可視性の全体像を提供します。
なぜSERPトラッキングが技術的に難しいのか
SERPトラッキングを自前で実装する場合、以下の課題に直面します。
1. ボット検出とレート制限
Googleは1つのIPアドレスから短時間に大量の検索リクエストが送信されると、CAPTCHAを表示したり、一時的にブロックしたりします。1つのIPで1分間に100リクエストを超えるとリスクが高まると言われていますが、正確なしきい値は非公開です。
2. 地理的バイアス
検索結果は位置依存です。自社サーバーが東京にあれば、東京の検索結果しか取得できません。全国・全世界の順位を確認するには、各ロケーションからリクエストを送る必要があります。
3. パーソナライズ
ログイン状態や検索履歴によって結果が変わります。正確なトラッキングには、シークレットモード相当のクリーンなセッションでリクエストを送る必要があります。
4. 構造の変化
Googleは頻繁にSERPのレイアウトを変更します。HTML構造が変わるとスクレイパーが壊れるため、継続的なメンテナンスが必要です。
SERPトラッキングの実装アプローチ比較
| アプローチ | メリット | デメリット |
|---|---|---|
| 手動検索 | コストゼロ、直感的 | スケール不可、主観的バイアス |
| SaaSツール(Ahrefs、SE Ranking等) | 高機能、メンテ不要 | 月額$50〜$500、カスタマイズ制限 |
| 公式API(Google Custom Search API) | 安定、利用規約準拠 | 有料、広告含まない、パーソナライズ無し |
| 自前スクレイピング+プロキシ | 柔軟、低コスト、フル制御 | 開発・保守コスト、ブロックリスク |
多くのデータエンジニアやSEOチームは、SaaSツールと自前スクレイピングを併用します。自前実装の鍵は、信頼できるプロキシ基盤を用意することです。
プロキシを活用したSERPトラッキングの実装
ProxyHatのプロキシを使用すれば、IPローテーションとジオターゲティングを組み合わせて、Google検索結果を安定的に取得できます。以下にPythonでの実装例を示します。
基本的なHTTPプロキシ経由の検索リクエスト
import requests
keyword = "proxy service"
url = f"https://www.google.com/search?q={keyword}&num=10&hl=ja"
proxies = {
"http": "http://user-country-US:pass@gate.proxyhat.com:8080",
"https": "http://user-country-US:pass@gate.proxyhat.com:8080",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
}
resp = requests.get(url, proxies=proxies, headers=headers, timeout=30)
print(resp.status_code, len(resp.text))
user-country-USのフラグにより、米国のIPアドレスからリクエストが送信されます。日本の結果を取得したい場合はuser-country-JPに変更してください。
スティッキーセッションで一貫性を確保
複数ページを連続して取得する場合、同じIPを使い続けることでセッションの一貫性を維持できます。
proxies = {
"http": "http://user-country-JP-session-abc123:pass@gate.proxyhat.com:8080",
"https": "http://user-country-JP-session-abc123:pass@gate.proxyhat.com:8080",
}
# ページ2を取得
url_page2 = f"https://www.google.com/search?q={keyword}&num=10&start=10&hl=ja"
resp2 = requests.get(url_page2, proxies=proxies, headers=headers, timeout=30)
都市レベルのジオターゲティング
ローカルSEOのトラッキングでは都市単位の制御が有効です。
proxies = {
"http": "http://user-country-US-city-newyork:pass@gate.proxyhat.com:8080",
"https": "http://user-country-US-city-newyork:pass@gate.proxyhat.com:8080",
}
利用可能なロケーションについてはプロキシロケーション一覧を参照してください。
curlでの簡単テスト
curl -x "http://user-country-DE:pass@gate.proxyhat.com:8080" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \
-H "Accept-Language: de-DE,de;q=0.9" \
"https://www.google.com/search?q=seo+tools&hl=de"
Node.jsでの実装例
const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');
const proxy = 'http://user-country-GB:pass@gate.proxyhat.com:8080';
const agent = new HttpsProxyAgent.HttpsProxyAgent(proxy);
async function trackSerp(keyword) {
const url = `https://www.google.com/search?q=${encodeURIComponent(keyword)}&num=10&hl=en`;
const res = await axios.get(url, {
httpsAgent: agent,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept-Language': 'en-GB,en;q=0.9',
},
timeout: 30000,
});
return res.data;
}
よくある失敗と対策
1. 単一IPで大量リクエスト
データセンタープロキシを1つだけ使って1,000キーワードを連続取得すると、数十分以内にブロックされます。ローテーションプロキシでリクエストごとにIPを変えるか、リクエスト間隔を2〜5秒空けてください。
2. User-Agentの使い回し
固定の古いUser-Agentはボットの典型パターンです。最新のブラウザ文字列を使用し、必要に応じて複数パターンをローテーションします。
3. 結果のHTML解析エラー
GoogleはA/BテストでHTML構造を変更することがあります。CSSセレクタに依存しすぎず、複数のフォールバックセレクタを用意してください。
4. robots.txtの無視
Googleのrobots.txtは検索結果ページのクロールを許可していませんが、API経由でない限り技術的には取得可能です。ただし利用規約と法的リスクを理解した上で実施してください。robots.txt仕様を確認することを推奨します。
プロキシタイプの選択
| プロキシタイプ | SERPトラッキングへの適性 | 目安コスト |
|---|---|---|
| データセンタープロキシ | 高速だが検出されやすい。軽量トラッキング向け。 | 低 |
| レジデンシャルプロキシ | 実IPに近く検出されにくい。本格運用に推奨。 | 中〜高 |
| モバイルプロキシ | モバイル検索結果の取得に最適。高コスト。 | 高 |
SERPトラッキングでは、レジデンシャルプロキシが最もバランスが良い選択肢です。ProxyHatではプランごとに各タイプを提供しています。
ベストプラクティスまとめ
- キーワードあたり1日1〜2回の取得頻度から始める。
- リクエスト間隔を2〜5秒空け、バーストを避ける。
- ジオターゲティングで監視対象ロケーションを明示する。
- 結果は生HTMLと解析済みデータの両方を保存し、後から再解析可能にする。
- アラート閾値を設定し、順位の大幅変動時に通知する。
SERPトラッキングの実装詳細やユースケースについては、SERPトラッキングのユースケースページおよびWebスクレイピングのユースケースも参照してください。技術的な接続仕様はProxyHatドキュメントで確認できます。
Key Takeaways: SERPトラッキングは検索順位とSERPフィーチャーの変動を継続監視する手法。自動化にはプロキシによるIPローテーションとジオターゲティングが必須。レジデンシャルプロキシが検出リスクとコストのバランスに優れる。リクエスト間隔とUser-Agent管理でブロックを回避する。






