1つのパイプラインで6つのAI回答エンジンを通じてブランドを追跡する
Lead Scraping Automation Engineer
主要なポイント:
- 6つのAI回答エンジン、1つのパイプライン。 ChatGPT、Grok、Gemini、Perplexity、Copilot、およびGoogleのAI Overviewは、すべて購入に関する質問に対し引用を伴って回答します。これらの6つはすべて、1つのエンドポイント、1つの
x-api-token、および1つの{ status, task_id, task_result }エンベロープを介して取得可能です。 - プラットフォームはフィールドレベルでのみ異なる。 各エンジンは引用を異なるキーの下に保存します(
content_references、web_search_results、citations、web_results、source)。6行のフィールドマップが、これらを1つの引用ストリームに統一します。 - 引用の割合は出力メトリックです。 プラットフォームとプロンプトごとに正規化された引用をドメイン別にグループ化し、時間の経過に伴うカウントがブランドのAI回答の可視性を示します。
- 3つのステージ、3つの短いスクリプト。 回答をキャプチャし、引用を正規化し、カウントを報告します — 各ステージはスケジュールに設定可能なPythonファイルです。
- 動く変数を固定する。 国、Grokの推論モード、プロンプトセットは各シリーズごとに固定されますが、回答は実行ごとに異なり、その変動があなたがチャート化するシグナルです。
- 無料で始められます。 新しいScrapelessアカウントには無料トライアルクレジットが含まれています — app.scrapeless.comでサインアップしてください。
パイプラインの概要
購入者がAIアシスタントにどのツールを選ぶべきか尋ねると、アシスタントは誰かの名前を挙げ、その後に引用された情報の短いリストをバックアップします。その誰かがあなたであるかどうかはプラットフォームごとに異なります:あなたを引用するエンジンが、購入者が使用するエンジンであるとは限りません。1つのプラットフォームを追跡することで、そのプラットフォームに関する情報が得られます。その可視性の全体像は、6つのプラットフォームを並べたときに見えてきます。
以下のパイプラインは、その全体像を端から端まで生成します:
- キャプチャ — 固定のプロンプトをすべての6つのエンジンでScrapelessアクターを介して実行し、生の回答をJSONLとして保存します。
- 正規化 — 各プラットフォームの引用フィールドを1つの統一された
{platform, prompt, domain, url, title}ストリームにマッピングします。 - レポート — プラットフォームごとにドメイン別で引用をカウントし、自分のドメインがどこに表示されているかを確認します。
ステージ1がネットワークに触れる唯一のステージです。ステージ2と3は純粋な変換作業なので、分析を再実行することは無料です。AI回答の引用が可視性のメトリックとなった理由に関する概念的な背景は、GEOとブランドAIの可視性に関する記事で網羅されており、このガイドはその手段を構築しています。
前提条件
- ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップしてください。
- Python 3.10以上、
requestsライブラリが必要です。 - 購入者が実際に尋ねる可能性のある固定プロンプト(作成例では1つを使用;本番運用では一式を使用)。
環境にキーを保存することで、コードに記載されることはありません:
bash
export SCRAPELESS_API_KEY=your_api_token_here
ステージ 1 — 回答をキャプチャ
1つの関数がすべての6つのエンジンをカバーしています。なぜなら、アクターは同じエンドポイントとエンベロープを共有しているからです。エンジンごとの違いは入力マップに限られます — Grokは推論modeを必要とし、Perplexityはweb_searchフラグを要求し、Copilotは独自のmodeを取ります:
| プラットフォーム | アクター | 追加入力 | 引用が保存される場所 |
|---|---|---|---|
| ChatGPT | scraper.chatgpt |
— | content_references[] |
| Grok | scraper.grok |
mode(必須) |
web_search_results[] + x_search_results[] |
| Gemini | scraper.gemini |
— | citations[] |
| Perplexity | scraper.perplexity |
web_search: true |
web_results[] |
| Copilot | scraper.copilot |
mode: "smart" |
citations[] |
| Google AI Overview | scraper.overview |
— | source[] |
python
# capture.py — 6つのAI回答エンジンで1つのプロンプトを実行し、生の回答を保存
import json
import os
import time
import requests
ENDPOINT = "https://api.scrapeless.com/api/v2/scraper/execute"
HEADERS = {
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
}
PROMPT = "JavaScript重視のサイトに最適なウェブスクレイピングAPIは何ですか?"
COUNTRY = "US"
ENGINES = {
"chatgpt": {"actor": "scraper.chatgpt", "extra": {}},
"grok": {"actor": "scraper.grok", "extra": {"mode": "MODEL_MODE_FAST"}},
"gemini": {"actor": "scraper.gemini", "extra": {}},
"perplexity": {"actor": "scraper.perplexity", "extra": {"web_search": True}},
"copilot": {"actor": "scraper.copilot", "extra": {"mode": "smart"}},
"google-ai-overview": {"actor": "scraper.overview", "extra": {}},
}
with open("answers.jsonl", "w", encoding="utf-8") as out:
for platform, spec in ENGINES.items():
payload = {
"actor": spec["actor"],
"input": {"prompt": PROMPT, "country": COUNTRY, **spec["extra"]},
}
resp = requests.post(ENDPOINT, headers=HEADERS, json=payload, timeout=300)
resp.raise_for_status()
data = resp.json()
out.write(json.dumps({
```json
{
"platform": platform,
"prompt": PROMPT,
"country": COUNTRY,
"captured_at": int(time.time()),
"status": data.get("status"),
"task_id": data.get("task_id"),
"task_result": data.get("task_result"),
}
各プラットフォームの完全なキャプチャ(回答、引用、および実行メタデータ)が task_id によって整理され、一行ごとに answers.jsonl に記録されます。
無料プランのAPIキーを入手してください: app.scrapeless.com
ステージ2 — 引用を正規化する
フィールドマップが全てのカギです:各プラットフォームはその引用配列に異なる名前を付け、エントリを異なる形で構成しますが、すべてのエントリにはURLが含まれています。6つのマッピングにより、6つのスキーマが1つのストリームに統合されます:
python
# normalize.py — answers.jsonl -> citations.jsonl (引用されたソースごとに一行)
import json
from urllib.parse import urlparse
# プラットフォーム -> task_result 内の (array_field, url_key) ペアのリスト
CITATION_FIELDS = {
"chatgpt": [("content_references", "url")],
"grok": [("web_search_results", "url"), ("x_search_results", "url")],
"gemini": [("citations", "url")],
"perplexity": [("web_results", "url")],
"copilot": [("citations", "url")],
"google-ai-overview": [("source", "url")],
}
with open("answers.jsonl", encoding="utf-8") as inp, \
open("citations.jsonl", "w", encoding="utf-8") as out:
for line in inp:
row = json.loads(line)
result = row.get("task_result") or {}
for field, url_key in CITATION_FIELDS[row["platform"]]:
for entry in result.get(field) or []:
url = entry.get(url_key) or ""
if not url.startswith("http"):
continue
out.write(json.dumps({
"platform": row["platform"],
"prompt": row["prompt"],
"country": row["country"],
"captured_at": row["captured_at"],
"panel": field,
"domain": urlparse(url).netloc.removeprefix("www."),
"url": url,
"title": entry.get("title") or entry.get("name") or "",
}) + "\n")
print(sum(1 for _ in open("citations.jsonl", encoding="utf-8")), "件の引用が正規化されました")
Grok は2つのパネル — オープンウェブページとX投稿 — を提供し、panel フィールドはそれらを下流で区別するのに役立ちます。
ステージ3 — 引用のシェアを報告する
1つの引用ストリームを持つことで、報告はグループ化になります。プラットフォームごとに、エンジンがどのドメインを信用し、あなたのドメインがその中に含まれているかを示します:
python
# report.py — citations.jsonl -> プラットフォームごとの引用シェアテーブル
import json
import os
from collections import Counter, defaultdict
BRAND = os.environ.get("BRAND_DOMAIN", "scrapeless.com")
per_platform = defaultdict(Counter)
with open("citations.jsonl", encoding="utf-8") as inp:
for line in inp:
row = json.loads(line)
per_platform[row["platform"]][row["domain"]] += 1
for platform, counts in per_platform.items():
total = sum(counts.values())
brand_hits = counts.get(BRAND, 0)
print(f"\n{platform} — {total} 件の引用 · {BRAND}: {brand_hits}")
for domain, n in counts.most_common(5):
marker = " ←" if domain == BRAND else ""
print(f" {n:>3} {domain}{marker}")
スケジュールで実行すると、このテーブルは時系列になります:プラットフォームごと、プロンプトごと、市場ごとに — あなたを引用する回答の数と、代わりに引用されるドメインが表示されます。このシリーズは、GEOプログラムが報告する成果物です。
シリーズのスケジューリングと拡張
- 変数を維持する。 同じプロンプト、同じ
country、同じGrokモードで毎回実行 — プロセスが一定であるときのみ、シリーズは読みやすくなります。毎日または毎週キャプチャしてください;AIの回答は両方のタイムスケールで進みます。 - 新しいコードではなく、乗算によってスケールする。 より多くのプロンプトはステージ1をループすること;より多くの市場は2つ目の
COUNTRYです。どちらも実行回数を増加させるため、予算を適切に設計してください — アクターは使用に基づいて請求し、現在の料金は pricing ページで確認できます。 - 生データを保持する。
answers.jsonlは、報告書のすべての数字の証拠です。正規化の選択が変わっても、生の回答は変わりません。 - 空のパネルを予期する。 一部のプロンプトは、特定のエンジンで引用が得られない場合があります(特にGrokのXパネルはプロンプト依存です)。空の配列はデータポイントであり、失敗ではありません。
俳優たちはユニバーサルスクレイピングAPIラインに住んでいます;最高のLLMスクレイパーガイドはツールを比較する場合にカテゴリーをランク付けします。
よくある質問
Q: この方法でAIの回答をキャプチャするのは合法ですか?
俳優たちは公開された回答コンテンツをキャプチャします。ルールは管轄によって異なり、各プラットフォームの利用規約も異なります — 関連する利用規約を確認し、使用ケースについて弁護士に相談してください。GDPRまたはCCPAで保護された個人データを収集しないでください。
Q: 例でなぜセットではなく一つのプロンプトですか?
明確さのためです。プロダクションはステージ1の周りでプロンプトセットをループします;すべての下流はすでに複数のプロンプトを処理するため、各行がpromptを持っています。
Q: どのくらいのラン数で使えるシリーズになりますか?
非決定論的な表面の単一キャプチャはほとんど証明になりません。2〜3週間にわたる日次キャプチャは、ほとんどのプロンプトセットでトレンドとノイズを分離するのに十分なポイントを提供します。
Q: GoogleのAIモードタブについてはどうですか?
それは同じエンベロープの下に独自の俳優(scraper.aimode)を持っています — エンジンマップに7番目のエントリーを追加します。AI概要ガイドはGoogleの回答表面を詳しくカバーしています。
Q: プロキシは必要ですか?
いいえ。居住者の出口とジオルーティングは俳優に組み込まれており、country入力が全体の設定になります。
Q: AIエージェントやSDKなしで実行できますか?
はい — 3つのステージはHTTP上のプレーンなPythonです。任意のスケジューラー(cron、CI、ワークフロ runner)によって実行できます。
結論:一つのエンベロープ、六つのエンジン、一つの数値
パイプラインは3つのファイルに集約されます:6つの俳優を通して回答をキャプチャし、エンドポイントとエンベロープを共有し、6つの引用スキーマを正規化して6行フィールドマップでカウントします。出力はAI時代の可視性作業が欠けていた数字 — 各回答エンジンがどれだけの頻度であなたにクレジットを与えるか、時間を追って、マーケットごとに追跡されたものです。それをスケジュールすると、チャートが自動的に描画されます。
AI回答データパイプラインを構築する準備はできましたか?
私たちのコミュニティに参加して無料プランを主張し、AI回答パイプラインを構築している開発者とつながりましょう:Discord · Telegram。
app.scrapeless.comにサインアップして無料トライアルクレジットを取得し、ブランドが回答するプロンプト、エンジン、市場にパイプラインを向けてください。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



