AI企業は独自のクローラーをウェブ上に送り込み、サイト運営者はrobots.txt、つまり自動化された訪問者が取得してよいものを伝えるプレーンテキストファイルを通じて応答する。主要なAI企業はそれぞれ、自社のクローラーが応答する名前を公開しており、そのためサイトは検索エンジンを受け入れつつ、特定の1社、複数社、あるいは全社をブロックすることができる。
私たちは、誰がそれを行っているかの現状を把握したいと考えた。2026年10月6日、Trancoランキングの上位10,000ドメインすべてのrobots.txtをリクエストし、16種類のAIクローラーと2種類の検索クローラーについてルールを評価し、各サイトがホームページへのアクセスをどのクローラーに許可しているかを記録した。本ガイドでは、その結果と作成した評価ツール、そしてウェブデータを収集するすべての人にとっての意味を共有する。
主な要点
- 上位10,000ドメインのうち5,754件が読み取り可能なrobots.txtを提供していた。そのうちの5件に1件、20.4%が、ホームページへの少なくとも1つのAIクローラーをブロックしている。
- 最もブロックされているクローラーは、Common CrawlのCCBot(16.2%)、ByteDanceのBytespider(15.3%)、OpenAIのGPTBot(15.1%)、AnthropicのClaudeBot(14.0%)である。
- 検索エンジンがブロックされることはほとんどない。Googlebotは2.6%、Bingbotは3.3%で、そのほとんどは全クローラーをブロックしているサイトである。17.3%のサイトは両方の検索エンジンを受け入れつつ、少なくとも1つのAIクローラーをブロックしている。
- 多くのサイトは学習と回答を区別している。GPTBotをブロックしている871サイトのうち、345サイトは依然としてChatGPT-Userを許可している。これは人がChatGPTにページについて尋ねたときにそのページを取得するものである。
- サイトが大きいほどブロックする傾向が強い。上位1,000サイトの29.5%が少なくとも1つのAIクローラーをブロックしているのに対し、5,001位から10,000位のサイトでは18.8%である。
測定方法
各ドメインについて https://<domain>/robots.txt をリクエストし、失敗した場合は www. ホストにフォールバックした。User-Agentには私たちの名前と自サイトへのリンクを含め、控えめなペースで実行した。その後、各クローラーについてホームページのパス / に対するルールを評価した。
私たちは、多くのライブラリが採用する近道ではなく、robots.txtの標準であるRFC 9309に従った。
- クローラーは自身を名指ししているすべてのグループを使用し、どのグループも名指ししていない場合にのみ
*グループにフォールバックする。 - 最も長く一致するルールが優先され、同点の場合は
Allowが優先される。 - 4xxレスポンスはルールが存在しないことを意味し、5xxレスポンスはすべてが禁止されていることを意味する。
Pythonの組み込みパーサーは、最長一致ではなく最初に一致したルールを適用するため、Disallow: / の後に Allow: /$ が続くような一般的なファイルを誤って解釈する。そこで私たちは独自の評価ツールを作成し、標準のテストケースに対して検証した。クローラーがホームページを取得できない場合を「ブロック」としてカウントし、ファイルがそのクローラーを名指ししているか、* のみを通じてブロックしているかを別途記録した。
10,000ドメインのうち、5,877件が解析可能なrobots.txtを返し、そのうち5,754件が重複のないサイトだった。残りは主にAPIホスト、コンテンツ配信ネットワーク、その他ウェブサイトを提供しないドメインだった。460件はrobots.txtの代わりにHTMLページで応答しており、これは標準ではルールなしとして扱われる。
わかったこと
| クローラー | 運営元 | 目的 | ホームページからブロック | ファイルで名指し |
|---|---|---|---|---|
| CCBot | Common Crawl | AI学習に広く使われるオープンウェブアーカイブ | 16.2% | 15.2% |
| Bytespider | ByteDance | AIモデルのためのクロール | 15.3% | 13.1% |
| GPTBot | OpenAI | 学習 | 15.1% | 17.7% |
| ClaudeBot | Anthropic | 学習 | 14.0% | 15.1% |
| meta-externalagent | Meta | 学習およびAI製品 | 12.5% | 10.8% |
| Google-Extended | 学習とGeminiのグラウンディング、Searchとは別 | 12.3% | 13.5% | |
| anthropic-ai | Anthropic | 旧Anthropicトークン | 11.7% | 9.9% |
| Applebot-Extended | Apple | 学習、Applebotとは別 | 11.7% | 10.1% |
| Amazonbot | Amazon | Amazonサービスのためのクロール | 11.7% | 10.3% |
| cohere-ai | Cohere | AI製品 | 11.7% | 9.2% |
| PerplexityBot | Perplexity | 回答のための検索インデックス | 10.8% | 12.7% |
| ChatGPT-User | OpenAI | ユーザーが尋ねたときにページを取得 | 9.4% | 11.7% |
| Perplexity-User | Perplexity | ユーザーが尋ねたときにページを取得 | 7.7% | 6.2% |
| OAI-SearchBot | OpenAI | ChatGPT内の検索結果 | 7.5% | 9.9% |
| Claude-User | Anthropic | ユーザーが尋ねたときにページを取得 | 7.3% | 6.1% |
| Claude-SearchBot | Anthropic | Claude内の検索結果 | 7.2% | 6.1% |
| Bingbot | Microsoft | ウェブ検索 | 3.3% | 7.4% |
| Googlebot | ウェブ検索 | 2.6% | 9.1% |
パーセンテージは5,754サイトに対するものである。「名指し」は、ブロックするためであれ許可するためであれ、クローラーを名前で扱っているファイルをカウントしており、これが2つの列が異なる理由である。あるサイトはクローラーを名指しして歓迎するためだけにそうしており、153サイトはどのクローラーも名指しせずに * を通じてすべてをブロックしている。
3つのパターン
AIクローラーはブロックされるが、検索エンジンはブロックされない。 17.3%のサイトはGooglebotとBingbotの両方をホームページに受け入れつつ、少なくとも1つのAIクローラーをブロックしている。Googlebotを名指しでブロックしているのは0.2%にすぎない。サイト運営者は、検索のためにインデックスされることと、AIのために収集されることの間に明確な線引きをしている。
学習は回答よりもブロックされやすい。 学習データを収集するクローラーは、人からの質問によってページを取得するクローラーよりも顕著に頻繁にブロックされている。GPTBotは15.1%のサイトでブロックされているのに対し、ChatGPT-Userは9.4%である。ClaudeBotは14.0%に対し、Claude-Userは7.3%である。GPTBotをブロックしている871サイトのうち、345サイトは依然としてChatGPT-Userを許可しており、ClaudeBotをブロックしている806サイトのうち、390サイトは依然としてClaude-Userを許可している。つまり、多くのサイトは学習に貢献することなくAIの回答に登場したいと考えている。
規模が大きいほどブロックが増える。 上位1,000サイトのうち、29.5%が少なくとも1つのAIクローラーをブロックし、21.0%がGPTBotをブロックしている。5,001位から10,000位のサイトでは、これらの数字はそれぞれ18.8%と13.9%に低下する。学習にとって最も価値のあるコンテンツを持つ大手パブリッシャーやプラットフォームが、最もオプトアウトする可能性が高い。
最も目立つ5つのAIクローラー(GPTBot、ClaudeBot、Google-Extended、CCBot、PerplexityBot)をすべてブロックしつつGooglebotを許可しているサイトは、わずか5.2%である。オプトアウトのほとんどは選択的であり、あるサイトは一部の企業をブロックして他はブロックしない、あるいは学習をブロックして回答は許可する、といった具合である。
コード
以下のモジュールは、robots.txtファイルを解析し、RFC 9309のルールに基づいて任意のクローラーについて評価する。依存関係はない。
import re
from urllib.parse import quote, unquote
def parse_groups(text):
"""Split robots.txt into groups: a list of (user-agent tokens, [(allow, path)])."""
groups, agents, rules, in_rules = [], [], [], False
for raw in text.splitlines():
line = raw.split("#", 1)[0].strip()
if ":" not in line:
continue
key, value = (part.strip() for part in line.split(":", 1))
key = key.lower()
if key == "user-agent":
if in_rules: # a user-agent line after rules starts a new group
groups.append((agents, rules))
agents, rules, in_rules = [], [], False
agents.append(value.lower())
elif key in ("allow", "disallow") and agents:
in_rules = True
if value: # an empty Disallow allows everything
rules.append((key == "allow", value))
if agents:
groups.append((agents, rules))
return groups
def rules_for(groups, product_token):
"""RFC 9309: use every group naming the crawler's product token; otherwise the '*' groups."""
token = product_token.lower()
named = [r for agents, rules in groups for r in rules if token in agents]
if any(token in agents for agents, _ in groups):
return named
return [r for agents, rules in groups for r in rules if "*" in agents]
def _pattern(path):
regex = "".join(".*" if ch == "*" else re.escape(ch) for ch in path.rstrip("$"))
return re.compile(regex + ("$" if path.endswith("$") else ""))
def allowed(groups, product_token, path="/"):
"""Longest matching rule wins; Allow wins a tie (RFC 9309, section 2.2.2)."""
target = quote(unquote(path), safe="/?=&*$%:@!,;~+")
best_len, verdict = -1, True
for allow, rule in rules_for(groups, product_token):
rule = quote(unquote(rule), safe="/?=&*$%:@!,;~+")
if _pattern(rule).match(target):
length = len(rule)
if length > best_len or (length == best_len and allow):
best_len, verdict = length, allow
return verdict
def names(groups, product_token):
"""Does the file address this crawler by name, rather than only through '*'?"""
return any(product_token.lower() in agents for agents, _ in groups)
そして、サイトを確認する例として、私たち自身のものを示す。
import requests
from robots import parse_groups, allowed, names
text = requests.get("https://shifter.io/robots.txt", timeout=15,
headers={"User-Agent": "ExampleSurvey/1.0 (+https://example.com/bot)"}).text
groups = parse_groups(text)
for crawler in ["GPTBot", "ClaudeBot", "Google-Extended", "CCBot", "Googlebot"]:
print(f"{crawler:16} homepage allowed: {allowed(groups, crawler, '/')} named: {names(groups, crawler)}")
私たちのファイルは主要なAIクローラーを名指しして明示的に許可しているため、5つすべてが許可された結果となり、Googlebotは * を通じて許可される。私たちはこの評価ツールを、最長一致の優先順位、同点ルール、ワイルドカードとパス末尾パターン、グループの結合、空ファイルを含む16のケースに対してテストした。
データ収集にとっての意味
*だけでなく、クローラーごとにrobots.txtを読む。*を通じて全員を歓迎しているサイトでも、名指しされたクローラーをブロックしている場合があり、今やますます多くのサイトがまさにそうしている。- 自分の収集者を正直に識別する。 robotsルールは、クローラーが自分が誰であるかを明示して初めて機能する。自分自身の名前で収集している場合は、その名前に対するルールと、自分が収集している目的に対するルールの両方を確認すること。
- サイトが引いている区別を尊重する。 多くのサイトは現在、検索、学習、オンデマンドでの取得を区別している。学習データを収集する者は、自身の名前が記載されていなくても、学習クローラーへのブロックが自分にも適用されると考えるべきである。
- 定期的に再確認する。 サイトがファイルを更新するにつれてオプトアウトは変化するため、6か月前に作成したリストは古くなっている。
robots.txt、AIオプトアウトと予約シグナルに関する私たちのガイドでは、サイトが使用するその他のシグナルと欧州における法的背景を取り上げており、ウェブスクレイピングのベストプラクティスでは、訪問先のサイトに害を与えずに収集する方法を取り上げている。取得時にオプトアウトを尊重する必要がある学習データパイプラインについては、大規模な学習データセットの構築で取り上げている。
測定の限界
- ホームページのみ。 私たちはパス
/のみを評価した。多くのサイトは、記事や検索ページなど特定のセクションからAIクローラーをブロックしつつ、ホームページは開放している場合があるため、どこかでAIクローラーを制限しているサイトの割合はこれらの数字よりも高い。 - robots.txtのみ。 サイトはHTTPヘッダー、metaタグ、利用規約を通じてもシグナルを発し、ボット管理を通じて執行している。robots.txtでクローラーをブロックしていないサイトでも、ネットワークレベルではブロックしている場合がある。
- 1回限りのスナップショット。 これらは2026年10月6日に、1つのネットワークから取得された時点でのファイルである。
- 上位サイトのみ。 上位10,000ドメインはウェブ全体ではなく、より小規模なサイトは異なる振る舞いをする可能性がある。
結論
上位サイトの5件に1件が現在、少なくとも1つのAIクローラーにホームページへ近づかないよう伝えている一方で、そのほぼすべてが依然として検索エンジンを歓迎している。オプトアウトは選択的であり、学習クローラーはユーザーのためにページを取得するクローラーよりも頻繁にブロックされ、最大手のサイトが最もブロックしている。
ウェブデータを収集するすべての人にとっての実践的な教訓は、標準に従った評価ツールを使って、関連する特定のクローラーと目的についてrobots.txtを読むこと、そしてウェブがこうした線引きを更新し続ける中でそれを再確認し続けることである。
出典と参考資料
- IETF、RFC 9309: Robots Exclusion Protocol、2022年9月。
- Tranco、list Q2K34。
- 上記のコードを使い、Shifterが2026年10月6日にリクエストした上位10,000ドメインのrobots.txtファイル。