
Sora Fujimoto
AI Solutions Architect

検索エンジン結果ページ(SERP)は常に変化しています。特徴付きスニペットは回転し、People Also Askボックスは更新され、AIオーバービューは予期せず表示されたり非表示になったりします。SEOチームがこれらの機能を監視するAI検索エージェントには、リアルタイムのSERPデータへの継続的なアクセスが必要です。しかし、Googleや他の検索エンジンは、自動化されたSERP監視をブロックするための積極的なボット保護を展開しており、reCAPTCHAやレート制限が含まれます。このガイドでは、CapSolverを使用してAIエージェントのSERP機能モニタリングパイプラインを構築する方法を紹介します。
SEOおよびGEO(ジェネラティブエンジンオプティマイゼーション)チームは、正確でタイムリーなSERPデータに依存しています。AIエージェントがランク変化、特徴付きスニペットの機会、または競合の動きを監視する際、毎日数百から数千の検索クエリを実行する必要があります。Googleのボット検出システムはこのパターンを識別し、認証チャレンジをトリガーします。
認証の壁はいくつかの形で現れます。繰り返しのクエリ後に全画面のreCAPTCHAチャレンジ、"不審なトラフィック"のインテリスティシャルページ、または完全なIPブロックです。Googleのクローラーのドキュメンテーションによると、検索結果への自動アクセスはレート制限と認証要件の対象になります。Googleのクローラーのドキュメンテーション。
AI検索エージェントにとって、これは重要なギャップを生み出します。エージェントはSERPデータを brilliantly 分析できます—パターンの識別、変化の検出、アクションの推奨—しかし、機能するために必要なデータを収集できません。CapSolverはこのギャップを埋め、認証チャレンジを直線的にクリアすることで、モニタリングパイプラインが中断することなく継続できるようにします。
必要なパッケージをインストールしてください:
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install aiohttp beautifulsoup4 pandas schedule
APIキーを設定してください:
export CAPSOLVER_API_KEY="your-capsolver-api-key"
追加の要件:
AIエージェントが追跡する必要があるSERP機能を定義し、検出方法を示します:
from dataclasses import dataclass
from typing import List, Optional
from enum import Enum
class SERPFeature(Enum):
FEATURED_SNIPPET = "featured_snippet"
PEOPLE_ALSO_ASK = "people_also_ask"
AI_OVERVIEW = "ai_overview"
LOCAL_PACK = "local_pack"
KNOWLEDGE_PANEL = "knowledge_panel"
VIDEO_CAROUSEL = "video_carousel"
IMAGE_PACK = "image_pack"
TOP_STORIES = "top_stories"
SHOPPING_RESULTS = "shopping_results"
@dataclass
class SERPResult:
keyword: str
features_detected: List[SERPFeature]
featured_snippet_url: Optional[str]
featured_snippet_text: Optional[str]
paa_questions: List[str]
ai_overview_present: bool
ai_overview_sources: List[str]
organic_positions: List[dict] # [{url, title, position}]
timestamp: float
class SERPFeatureDetector:
"""パースされた検索結果ページからSERPの特徴を検出します。"""
def detect_features(self, html_content: str, keyword: str) -> SERPResult:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
features = []
# 特徴付きスニペットの検出
snippet_div = soup.select_one('[data-attrid="wa:/description"], .xpdopen')
featured_url = None
featured_text = None
if snippet_div:
features.append(SERPFeature.FEATURED_SNIPPET)
featured_text = snippet_div.get_text(strip=True)[:500]
link = snippet_div.find('a')
featured_url = link['href'] if link else None
# People Also Askの検出
paa_questions = []
paa_section = soup.select('[data-q]')
if paa_section:
features.append(SERPFeature.PEOPLE_ALSO_ASK)
paa_questions = [q.get('data-q', '') for q in paa_section[:8]]
# AI Overviewの検出
ai_overview = soup.select_one('[data-attrid*="ai"], .ai-overview-container')
ai_sources = []
if ai_overview:
features.append(SERPFeature.AI_OVERVIEW)
source_links = ai_overview.select('a[href]')
ai_sources = [a['href'] for a in source_links[:5]]
# ローカルパックの検出
if soup.select_one('.VkpGBb, [data-attrid*="local"]'):
features.append(SERPFeature.LOCAL_PACK)
return SERPResult(
keyword=keyword,
features_detected=features,
featured_snippet_url=featured_url,
featured_snippet_text=featured_text,
paa_questions=paa_questions,
ai_overview_present=SERPFeature.AI_OVERVIEW in features,
ai_overview_sources=ai_sources,
organic_positions=self._extract_organic(soup),
timestamp=time.time()
)
def _extract_organic(self, soup) -> list:
results = []
for i, item in enumerate(soup.select('.g, [data-sokoban-container]')[:10], 1):
link = item.select_one('a[href^="http"]')
title = item.select_one('h3')
if link and title:
results.append({
"position": i,
"url": link['href'],
"title": title.get_text(strip=True)
})
return results
Googleの認証チャレンジを処理するデータ収集レイヤーを構築します:
import asyncio
import aiohttp
import time
import random
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
class SERPCollector:
"""自動CAPTCHA処理を備えたSERPデータの収集。"""
def __init__(self, api_key: str, proxies: list):
self.cap = create_capsolver(api_key=api_key)
self.proxies = proxies
self.proxy_index = 0
self.stats = {"queries": 0, "captchas_solved": 0, "failures": 0}
def _get_proxy(self) -> str:
proxy = self.proxies[self.proxy_index % len(self.proxies)]
self.proxy_index += 1
return proxy
async def search(self, keyword: str, location: str = "us") -> str:
"""CAPTCHA処理を備えたGoogle検索を実行します。"""
proxy = self._get_proxy()
url = f"https://www.google.com/search?q={keyword}&gl={location}&hl=en"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml"
}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers, proxy=proxy, timeout=30) as resp:
html = await resp.text()
# CAPTCHAチャレンジをチェック
if self._is_captcha_page(html):
html = await self._solve_and_retry(keyword, location, proxy, session)
self.stats["queries"] += 1
return html
def _is_captcha_page(self, html: str) -> bool:
"""応答がCAPTCHAチャレンジページであるかを検出します。"""
captcha_indicators = [
"unusual traffic from your computer",
"g-recaptcha",
"recaptcha/api",
"sorry/index",
"captcha"
]
return any(indicator in html.lower() for indicator in captcha_indicators)
async def _solve_and_retry(self, keyword: str, location: str, proxy: str, session) -> str:
"""CAPTCHAを解決し、再試行します。"""
# GoogleはそのチャレンジページでreCAPTCHA v2を使用します
info = CaptchaInfo(
type=CaptchaType.RECAPTCHA_V2,
website_url="https://www.google.com/sorry/index",
website_key="6LfwuyUTAAAAAOAmoS0fdqijC2PbbdH4kjq62Y1b"
)
solution = await self.cap.solve(info)
self.stats["captchas_solved"] += 1
# 解決されたトークンを含めて再試行
retry_url = f"https://www.google.com/search?q={keyword}&gl={location}&hl=en"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
# CAPTCHAトークンをリトライリクエストに含めます
async with session.get(retry_url, headers=headers, proxy=proxy) as resp:
return await resp.text()
async def close():
await self.cap.aclose()
CapSolverのreCAPTCHA解決ガイドは、Googleの特定のreCAPTCHA実装の処理に関する追加の詳細を提供します。
収集と検出をスケジュールされたモニタリングパイプラインに統合します:
class SERPMonitoringPipeline:
"""完全なSERP機能モニタリングパイプライン。"""
def __init__(self, api_key: str, proxies: list):
self.collector = SERPCollector(api_key, proxies)
self.detector = SERPFeatureDetector()
self.results_history = []
async def monitor_keywords(self, keywords: list, location: str = "us") -> list:
"""SERP機能変化を検出するためにキーワードのバッチをモニタリングします。"""
results = []
for keyword in keywords:
try:
# SERPデータを収集
html = await self.collector.search(keyword, location)
# 機能を検出
serp_result = self.detector.detect_features(html, keyword)
results.append(serp_result)
# レートリミット—5〜10秒のランダムな遅延
await asyncio.sleep(random.uniform(5, 10))
except Exception as e:
results.append(SERPResult(
keyword=keyword, features_detected=[],
featured_snippet_url=None, featured_snippet_text=None,
paa_questions=[], ai_overview_present=False,
ai_overview_sources=[], organic_positions=[],
timestamp=time.time()
))
self.results_history.extend(results)
return results
def detect_changes(self, current: list, previous: list) -> list:
"""現在の結果と以前の結果を比較して変化を検出します。"""
changes = []
prev_map = {r.keyword: r for r in previous}
for result in current:
prev = prev_map.get(result.keyword)
if not prev:
continue
# 特徴付きスニペットの取得/喪失
had_snippet = SERPFeature.FEATURED_SNIPPET in prev.features_detected
has_snippet = SERPFeature.FEATURED_SNIPPET in result.features_detected
if has_snippet and not had_snippet:
changes.append(f"[取得] '{result.keyword}'の特徴付きスニペット: {result.featured_snippet_url}")
elif had_snippet and not has_snippet:
changes.append(f"[喪失] '{result.keyword}'の特徴付きスニペット")
# AI Overviewの出現/消失
if result.ai_overview_present and not prev.ai_overview_present:
changes.append(f"[新規] '{result.keyword}'にAI Overviewが出現")
elif prev.ai_overview_present and not result.ai_overview_present:
changes.append(f"[削除] '{result.keyword}'のAI Overviewが削除")
return changes
数百のキーワードをモニタリングするには、コストとパフォーマンスを最適化します:
| モニタリングされたキーワード数 | 日次チェック数 | 月間CAPTCHA(推定) | 月間コスト |
|---|---|---|---|
| 50キーワード | 4回/日 | ~600 | $1.2-1.8 |
| 200キーワード | 2回/日 | ~1,200 | $2.4-3.6 |
| 500キーワード | 2回/日 | ~3,000 | $6-9 |
| 1,000キーワード | 1回/日 | ~3,000 | $6-9 |
最適化戦略:
ボーナスコードを取得してください: CapSolverダッシュボードでコード WEBS を使用すると、すべての充電に追加の5%のボーナスを取得できます。SEOチームが大規模なSERPモニタリングを実行するには完璧です。
CapSolverのウェブスクレイピングドキュメンテーションは、高容量データ収集のための追加のインフラパターンをカバーしています。Cloudflare保護された検索ツールを処理するには、Turnstile解決ガイドが関連する実装の詳細を提供します。
AI検索エージェントのSERP機能モニタリングを構築するには、CAPTCHA対応のデータ収集レイヤー、機能検出パーサー、変化検出システムが必要です。CapSolverは、GoogleのreCAPTCHAチャレンジを3〜8秒で解決する検証クリアインフラを提供し、AIエージェントが常に最新のSERPデータを分析できるようにします。
最高優先度のキーワードから始めて、検出精度を検証し、その後、すべてのキーワードカバレッジにスケールしてください。住宅用プロキシ、知的レートリミット、自動CAPTCHA解決の組み合わせにより、管理可能なコストで98%以上のデータ収集信頼性を実現します。
適切なプロキシのローテーションとCAPTCHAの解決により、1つのパイプラインインスタンスから1日あたり500〜1,000キーワードを信頼性高くモニタリングできます。制限要因は通常、プロキシプールのサイズではなく、CAPTCHAの解決能力です。CapSolverは数千件の同時タスクを処理してもレート制限がありません。
はい。SERPの特徴検出機能は、検索結果内のAIオーバービューのセクションを識別します。AIオーバービューは標準的なGoogle検索結果ページに表示されるため、同じ収集およびCAPTCHA解決のアプローチで取得できます。どのキーワードがAIオーバービューをトリガーするか、どのソースが参照されるかを追跡してください。
住宅用プロキシとクエリ間の5〜10秒の遅延を使用すれば、CAPTCHAの遭遇率は通常5〜15%です。プロキシを使用しない場合や、クエリのタイミングを急げば、30〜50%に達することもあります。優れたプロキシとCAPTCHA解決の組み合わせにより、ほぼ100%のデータ収集成功が確保されます。
はい。オーガニックポジションの抽出により、各キーワードの上位10件の結果を取得できます。キーワードセット全体を通して競合URLを追跡し、順位の上昇・低下、および新規参入を検出してください。フェイチャードスニペットのトラッキングと組み合わせることで、コンテンツの機会を特定できます。
検索URLのgl(ジオロケーション)パラメータを設定して、特定の国をターゲットにします。Googleはこのパラメータに基づいてローカライズされた結果を表示します。CAPTCHA解決のアプローチはすべてのGoogleドメインで同じように動作します。同じreCAPTCHAシステムがすべての地域バージョンを保護しています。
スケーラブルなRustウェブスクレイピングアーキテクチャを学びましょう。リクエスト、スクレイパー、非同期スクレイピング、ヘッドレスブラウザスクレイピング、プロキシローテーション、およびコンプライアンス対応のCAPTCHA処理で。

2026年のデータ・アズ・ア・サービス(DaaS)を理解する。その利点、ユースケース、およびリアルタイムの洞察と拡張性を通じて企業を変革する方法について探る。
