「robots.txt でAIクローラーを許可したのに、本当に来ているのか分からない」。「ChatGPT や Perplexity に読まれているかを、数字で見たい」。
AI検索への対策を始めると、こうした疑問が出てきます。
Google アナリティクスでは、この疑問に答えられません。GA4 は、既知のボットとスパイダーのトラフィックを自動で除外する仕様だからです。
確実に確かめられるのは、Webサーバーが記録している「アクセスログ」です。ログには、誰がどのページを取りに来て、サーバーが何を返したかが、1行ずつ残っています。
この記事は、自社サイトを運営する中小企業のWeb担当者に向けて書きました。ログの手に入れ方、コマンドでの集計、結果の読み方、なりすましへの注意を、手を動かしながら進められる形で説明します。
コマンドは、1つずつ意味を添えます。ログの調査に慣れていなくても、コピーして実行できる形にしました。
各社のクローラー名と仕様は、2026年10月18日に公式資料で確かめた内容です。コマンドは、筆者が作った架空のログで動作を確かめました。
AIクローラーを許可するか拒否するかの判断は、別の記事にまとめています。この記事は「実際に来ているかをログで確かめる」ところに絞ります。
先に結論:ログ確認の6つの要点
要点を、先に表にまとめます。
| 番号 | 要点 | 理由 |
|---|---|---|
| 1 | AIクローラーの訪問は、サーバーのアクセスログで調べる | GA4 は既知のボットを自動で除外し、除外した量も見られない |
| 2 | 探すのは、ユーザーエージェントの中にある名前 | 名前の部分だけで探せば、バージョンの変更に左右されない |
| 3 | Google-Extended と Applebot-Extended は、ログに出ない | 制御用の名前で、Applebot-Extended はページをクロールしない |
| 4 | CDN を使うなら、自社サーバーのログは実際より少なく見える | キャッシュから返した分は、自社サーバーに届かないと考えられる |
| 5 | 集計は、日別・ボット別・ページ別・ステータス別の4軸 | 来ているか、読めているかが分かる |
| 6 | ブロックや許可を決める前に、公式のIP一覧で本物か確かめる | ユーザーエージェントは、誰でも名乗れる |
全体の流れを、図で確認します。
この記事で確かめた範囲
公式資料の確認
次の公式資料を、2026年10月18日に開いて確かめました。
| 資料 | 確かめた内容 |
|---|---|
| OpenAI のクローラー一覧のページ | GPTBot・OAI-SearchBot・ChatGPT-User・OAI-AdsBot の役割、名乗る文字列の例、IP一覧の場所 |
| Anthropic のヘルプ記事と公開IP一覧 | ClaudeBot・Claude-User・Claude-SearchBot の役割、robots.txt の扱い |
| Perplexity のクローラーのページ | PerplexityBot・Perplexity-User の文字列、役割、IP一覧の場所 |
| Google のクローラー一覧と、確認方法のページ | Google-Extended の扱い、リクエストの確かめ方 |
| Apple の Applebot のページ | 文字列の形式、Applebot-Extended の役割、逆引きDNSでの確認 |
| Bing のクローラーのページ | bingbot の文字列、文字列は偽装されうるという説明 |
| Microsoft の Copilot のプライバシーのページ | Copilot Chat が Bing 検索で回答を根拠づけること |
| Apache と Nginx のログの説明 | combined 形式の定義、ログの回転と圧縮 |
| Cloudflare の3つのページ | キャッシュの応答、元のIPの記録、AI Crawl Control の画面 |
| Google アナリティクスのヘルプ | 既知のボットの自動除外 |
コマンドの動作確認
コマンドは、筆者が作った架空のログで実行して確かめました。環境は、Mac の標準の awk と、ターミナルの bash です。
Linux のサーバーで使われる awk では、実行していません。使った機能は、標準的なものに限っています。
ログの例に出るIPアドレスは、説明用に予約されている範囲のものです。ページの名前や件数もすべて架空です。
解析ツールでAIクローラーを数えられない理由
GA4 は既知のボットを除外する
Google アナリティクスのヘルプには、既知のボットとスパイダーのトラフィックは自動で除外されると書かれています。この除外は無効にできず、どれだけ除外されたかも見られません。
つまり、GA4 の数字に AIクローラーが出ていなくても、来ていないとは言えません。GA4 で見られるのは、人が AI のリンクから訪れた流入です。
ログには、サーバーが受けた要求がそのまま残る
アクセスログは、Webサーバーが受けた要求を1行ずつ記録したファイルです。ユーザーエージェントが記録されていれば、名乗った名前で見分けられます。
解析ツールのような「除外の仕組み」を通らないため、クローラーの訪問も記録されます。
ログで分かること、分からないこと
| 分かること | 分からないこと |
|---|---|
| クローラーが来たかどうか | そのページが、回答で引用されたかどうか |
| 来た日時と、取りに来たページ | 取得した内容が、学習に使われたかどうか |
| サーバーが返した結果(成功・エラー) | AI の利用者が、そのページを見たかどうか |
| 名乗った名前と、アクセス元のIP | 名乗りが本物かどうか(IPの照合が別に必要) |
読まれたことと、引用されたことは別です。ログは「読める状態か」を確かめる道具として使います。
AIクローラーの種類と、ログに出る名前
主なクローラー一覧(2026年10月時点)
各社の公式資料で確かめた、ログで探す名前と役割です。
| 運営 | ログで探す名前 | 公式の説明の要約 | robots.txt の扱い |
|---|---|---|---|
| OpenAI | GPTBot | 基盤モデルの学習に使われうる内容の収集 | robots.txt で管理できる |
| OpenAI | OAI-SearchBot | ChatGPT の検索機能に、サイトを表示するための収集 | robots.txt で管理できる |
| OpenAI | ChatGPT-User | 利用者の操作をきっかけに、ページを取得する | ルールが適用されない場合があると説明 |
| OpenAI | OAI-AdsBot | ChatGPT の広告として出されたページの安全性の確認 | 公式資料に記載なし |
| Anthropic | ClaudeBot | モデルの学習に役立ちうる内容の収集 | 従うと説明 |
| Anthropic | Claude-SearchBot | 検索結果の質を上げるための収集 | 従うと説明 |
| Anthropic | Claude-User | 利用者の質問に応じて、ページを取得する | 無効にできると説明 |
| Perplexity | PerplexityBot | 検索結果にサイトを表示・リンクするための収集 | robots.txt のタグで管理できる |
| Perplexity | Perplexity-User | 利用者の質問に応じて、ページを取得する | 一般に無視すると説明 |
| Apple | Applebot | Apple の検索機能のための収集 | 従うと説明 |
| Microsoft | bingbot | Bing 検索のための収集 | robots.txt で管理できる |
| Googlebot | Google 検索のための収集(比較用) | 従うと説明 |
OAI-AdsBot は、ChatGPT に広告を出した事業者のページに来るクローラーです。広告を出していないサイトには、通常は関係しません。
bingbot は AI専用のクローラーではありません。Microsoft の公式資料には、Copilot Chat が回答を根拠づけるために Bing 検索を使うと書かれています。
そのため、Copilot 経由の露出を考えるなら、bingbot の訪問状況も合わせて見る価値があります。
Googlebot も AI専用ではありません。比較の基準として一覧に加えました。
役割は大きく3種類
役割で分けると、学習用、検索用、利用者の操作による取得の3つです。
| 種類 | 該当する名前 | ログから分かること |
|---|---|---|
| 学習用 | GPTBot、ClaudeBot | 学習に使われうる内容が、収集の対象になっている |
| 検索用 | OAI-SearchBot、Claude-SearchBot、PerplexityBot | AI の検索機能に載せる準備として、読まれている |
| 利用者の操作による取得 | ChatGPT-User、Claude-User、Perplexity-User | 利用者の質問をきっかけに、ページが読まれた |
AI検索への露出で特に注目したいのは、後ろの2つです。名前が -User で終わるアクセスがあれば、誰かの質問をきっかけにそのページが読まれたことになります。
ただし、読まれたことが回答への引用を意味するわけではありません。
ログに出ない2つの名前
Google の公式資料には、Google-Extended は独自のユーザーエージェント文字列を持たず、クロールは既存の Google の文字列で行われると書かれています。Google-Extended は、robots.txt で Gemini の学習などへの利用を指定するための、制御用の名前です。
Apple も同じです。Applebot-Extended はページをクロールせず、Applebot が集めたデータの使い道を決めるための名前だと説明されています。
| 名前 | ログに出るか | 実際にログに残る名前 |
|---|---|---|
| Google-Extended | 出ない | Googlebot など、既存の Google の文字列 |
| Applebot-Extended | 出ない | Applebot |
ログを「Google-Extended」で検索して何も見つからないのは、正常な状態です。Gemini 向けのアクセスだけをログで区別することはできません。
名乗る文字列は変わるので、名前の部分で探す
OpenAI の公式資料は、文字列の例を示したうえで、バージョン番号は変わることがあると書いています。Apple も、名乗るブラウザのバージョンを更新することがあると説明しています。
Google と Bing の資料では、Chrome のバージョン部分が「W.X.Y.Z」という置き換えの表記になっています。バージョンを含めて探すと、見落とします。
この記事のコマンドは、すべて「GPTBot」「Applebot」のような名前の部分だけで探す方式です。
アクセスログを手に入れる
まず、ログの1行を読めるようにする
多くのWebサーバーは、「combined」という形式でアクセスログを記録します。Apache の公式資料にも、Nginx の公式資料にも、この形式の定義が載っています。
説明用に作った、架空のログ1行を見てみます。
203.0.113.5 - - [10/Oct/2026:13:55:36 +0900] "GET /blog/sample/ HTTP/1.1" 200 5123 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)"
この1行を、項目ごとに分けると次のとおりです。
| 順番 | 項目 | この例の値 | Apache の指定 | Nginx の変数 |
|---|---|---|---|---|
| 1 | アクセス元のIP | 203.0.113.5 | %h | $remote_addr |
| 2 | 識別子(通常は使われない) | – | %l | (ハイフンで固定) |
| 3 | ユーザー名 | – | %u | $remote_user |
| 4 | 日時 | [10/Oct/2026:13:55:36 +0900] | %t | $time_local |
| 5 | リクエスト(方法とURL) | “GET /blog/sample/ HTTP/1.1” | %r | $request |
| 6 | ステータスコード | 200 | %>s | $status |
| 7 | 送ったバイト数 | 5123 | %b | $body_bytes_sent |
| 8 | 参照元 | “-“ | %{Referer}i | $http_referer |
| 9 | ユーザーエージェント | “Mozilla/5.0 …” | %{User-agent}i | $http_user_agent |
AIクローラーを調べるときに使うのは、IP、日時、リクエスト、ステータスコード、ユーザーエージェントの5つです。末尾のユーザーエージェントに、PerplexityBot という名前が入っています。
Apache の場合
Apache の公式資料では、combined 形式は次のように定義されています。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog "log/access_log" combined
ログの保存場所は、環境によって違います。設定ファイルの CustomLog の行に書かれたファイル名を見るのが確実です。
Nginx の場合
Nginx には、combined 形式があらかじめ定義されています。公式資料によると、access_log で形式を指定しなければ、この形式が使われます。
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
保存場所は、設定ファイルの access_log の行で確かめます。
独自の log_format を使っている場合は、$http_user_agent が含まれているかを必ず確認してください。含まれていなければ、AIクローラーを見分けられません。
JSON 形式で記録している場合は、この記事の awk の番号がそのままでは合いません。公式資料には escape=json という指定があり、JSON 形式の記録も可能です。
レンタルサーバーやサイト作成サービスの場合
共用のレンタルサーバーでは、サーバーの設定を触れないことが多くあります。管理画面からログをダウンロードできるサービスもありますが、提供の有無や形式はサービスによって違います。
ダウンロードする前に、次の3点を確認してください。
- ログの記録が有効になっているか
- 保存期間が何日か(短い場合は、定期的に手元へ保存する)
- 各行の最後に、ユーザーエージェントの文字列があるか
ダウンロードしたファイルは、Mac のターミナルで、そのまま調べられます。Windows の場合は、Linux を動かす機能(WSL)を使います。
サイト作成サービスによっては、生のログを取得できないことがあります。その場合は、次に説明する CDN 側の集計や、サービスが提供する別の手段を探します。
過去のログは、回転と圧縮に注意する
ログは、1つのファイルが大きくなりすぎないよう、日ごとや週ごとに分けて保存されるのが一般的です。Apache の公式資料には、rotatelogs や logrotate でログを回転させる方法が載っています。
古いログは、圧縮されて .gz という拡張子になることがあります。Nginx の公式資料には、gzip の指定で圧縮して書き出し、zcat で読めるという説明があります。
後の節で、圧縮されたログも一度に読むコマンドを紹介します。
環境ごとの、ログの調べ方
| 環境 | ログの場所の調べ方 | 注意すること |
|---|---|---|
| Apache を自分で管理している | 設定ファイルの CustomLog の行 | 形式が combined か、独自の LogFormat かを確認する |
| Nginx を自分で管理している | 設定ファイルの access_log の行 | 独自の log_format に $http_user_agent があるか確認する |
| レンタルサーバー | 管理画面のログのダウンロード | 保存期間が短いことがあるので、定期的に保存する |
| CDN を経由している | 自社サーバーのログと、CDN 側の集計 | 次の節の「ずれ」を理解してから読む |
| サイト作成サービス | サービスの案内を確認する | 生のログを取得できないことがある |
CDNを使っている場合のずれ
CDN(コンテンツ配信網)を経由していると、自社サーバーのログに2つのずれが生じます。この節は、Cloudflare の公式資料に基づいて説明します。
キャッシュから返した分は、ログに残らない
Cloudflare の公式資料では、キャッシュ応答の状態を HIT と MISS で区別しています。HIT は Cloudflare のキャッシュにあったもの、MISS はキャッシュになく、自社サーバー(オリジン)から返したものです。
ここから、キャッシュで返された分は、自社サーバーのログに出ないと考えられます。これは公式資料の説明からの推測です。
AIクローラーが来ていても、ログの件数は実際の訪問より少なく見えます。件数が少ないときは、CDN のキャッシュを疑ってください。
アクセス元のIPが、CDN のIPになる
Cloudflare の公式資料によると、CDN を経由すると、自社サーバーのログには Cloudflare のIPアドレスが記録されます。元の訪問者のIPは、CF-Connecting-IP というヘッダーに入っています。
そのままだと、ログの先頭のIPがすべて CDN のものになり、後で説明するIPの照合ができません。サーバー側で、元のIPを記録する設定が必要です。
Nginx の場合は、公式資料の案内どおり ngx_http_realip_module を使います。
set_real_ip_from 192.0.2.1;
real_ip_header CF-Connecting-IP;
Apache の場合は、mod_remoteip を使います。ログの形式でも、IPの部分を %h から %a に変えます。
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 192.0.2.1
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-agent}i\"" combined
192.0.2.1 は説明用のアドレスです。実際には、Cloudflare が公開しているIP範囲の一覧を、すべて指定します。
範囲は更新されるため、定期的に見直してください。
設定を変えるときは、サーバーの担当者に依頼するのが安全です。Cloudflare の資料でも、Apache の設定を変えたあとは、構文の確認をしてから再起動する手順が示されています。
CDN 側の集計画面も併用する
Cloudflare には、AI Crawl Control という画面があります。公式資料によると、AIクローラーのリクエスト数、ステータスコードの分布、よく読まれたパスを見られます。
集計は CSV でダウンロードでき、GraphQL API で取り出すこともできます。
画面の説明には、参照数の項目が有料プランのみと書かれたものもあります。使える範囲は、契約中のプランの画面で確認してください。
自社サーバーのログと CDN 側の集計は、どちらか一方で足りるとは限りません。両方を並べて、差が大きければキャッシュを疑う、という使い方が現実的です。
ずれと対処のまとめ
| ずれ | 起きること | 対処 |
|---|---|---|
| キャッシュで返した分が、ログに残らない | ログの件数が、実際より少なく見える | CDN 側の集計画面を併せて見る |
| アクセス元のIPが、CDN のIPになる | IPの照合ができない | CF-Connecting-IP を使って、元のIPを記録する |
| CDN 側の集計の範囲が、プランで違う場合がある | 見られる項目や期間が限られる | 画面で確認し、足りなければ自社のログと組み合わせる |
集計コマンドの準備
作業用のフォルダに、ログをコピーする
本番のログを直接開いて作業すると、誤って書き換える恐れがあります。ログのコピーを作業用のフォルダに置き、ターミナルでそのフォルダに移動してから、以下のコマンドを実行してください。
ファイル名は access.log として説明します。実際のファイル名に読み替えてください。
探す名前を、変数にまとめる
最初に、探す名前を変数にまとめます。名前を「|」でつなぐと、どれか1つに合う行を探せます。
BOTS='GPTBot|OAI-SearchBot|OAI-AdsBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User|Applebot|bingbot|Googlebot'
bingbot は、公式資料の文字列でも小文字で書かれているため、小文字で指定しています。新しい名前が出てきたら、このリストに足します。
変数は、ターミナルを閉じると消えます。新しいタブを開いたときは、もう一度入力してください。
中身は echo “$BOTS” で確かめられます。
ログの1行を、awk で分ける
awk は、1行を区切り文字で分けて扱えるコマンドです。combined 形式は、ダブルクォーテーション(”)で区切ると扱いやすくなります。
awk で -F'”‘ と指定すると、1行が次のように分かれます。
| 番号 | 入っている内容 | 例 |
|---|---|---|
| $1 | IP、識別子、ユーザー名、日時 | 203.0.113.5 – – [10/Oct/2026:13:55:36 +0900] |
| $2 | リクエスト(方法とURL) | GET /blog/sample/ HTTP/1.1 |
| $3 | ステータスコードとバイト数 | 200 5123 |
| $4 | 参照元 | – |
| $6 | ユーザーエージェント | Mozilla/5.0 … PerplexityBot/1.0 … |
$5 は、参照元とユーザーエージェントの間の空白です。ユーザーエージェントが $6 になる点が、このあとのコマンドの前提になります。
抜き出し用の短いプログラムを保存する
次のコマンドで、抜き出し用のプログラムを ai_extract.awk という名前で保存します。複数行をまとめてコピーして、そのまま実行してください。
cat > ai_extract.awk <<'EOF'
BEGIN {
split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", names, " ")
for (i = 1; i <= 12; i++) month[names[i]] = sprintf("%02d", i)
}
match($6, re) {
bot = substr($6, RSTART, RLENGTH)
split($1, head, " ")
split($2, req, " ")
split($3, res, " ")
path = req[2]
sub(/\?.*/, "", path)
day = substr(head[4], 2, 11)
date = substr(day, 8, 4) "-" month[substr(day, 4, 3)] "-" substr(day, 1, 2)
print date "\t" bot "\t" res[1] "\t" path "\t" head[1]
}
EOF
中身は、見た目より単純です。部品ごとの役割を、表にまとめます。
| 部分 | 役割 |
|---|---|
| match($6, re) | ユーザーエージェントの中に、探す名前がある行だけを処理する |
| RSTART と RLENGTH | 見つかった名前の位置と長さ。substr で名前だけを取り出す |
| split($1, head, ” “) | 先頭の部分を、IPと日時に分ける |
| sub(/\?.*/, “”, path) | URLの「?」以降を捨てて、ページごとに数えやすくする |
| month[…] | Oct を 10 に変えて、日付を 2026-10-10 の形にそろえる |
日付を年月日の順にそろえるのは、月をまたぐ期間でも、並べ替えが正しく働くようにするためです。
抜き出しを実行する
次のコマンドで、探す名前を含む行だけを取り出し、ai_hits.tsv というファイルに保存します。
awk -F'"' -v re="$BOTS" -f ai_extract.awk access.log > ai_hits.tsv
保存できたら、先頭の3行を見て確認します。
head -n 3 ai_hits.tsv
ai_hits.tsv は、タブ区切りの5列のファイルです。
| 列 | 内容 | 例 |
|---|---|---|
| 1 | 日付 | 2026-10-01 |
| 2 | クローラーの名前 | GPTBot |
| 3 | ステータスコード | 200 |
| 4 | ページのパス | /service/ |
| 5 | アクセス元のIP | 203.0.113.6 |
日付は、ログに記録された時刻の日付です。サーバーの時刻設定が日本時間でなければ、日付の境目がずれます。
圧縮された過去のログも、まとめて読む
ログが日ごとや週ごとに分かれ、古いものが .gz で圧縮されている場合は、次のようにします。
gzip -dcf access.log* | awk -F'"' -v re="$BOTS" -f ai_extract.awk > ai_hits.tsv
gzip の -d は展開、-c は画面への出力、-f は圧縮されていないファイルをそのまま通す指定です。圧縮の有無が混在していても、1つの流れで読めます。
集計コマンドで数える
ここからのコマンドは、すべて ai_hits.tsv を読みます。元のログは読み直さないので、結果がすぐに出ます。
ボット別の件数
cut -f2 ai_hits.tsv | sort | uniq -c | sort -rn
2列目の名前を取り出し、並べ替えて、同じ名前の数を数え、多い順に並べます。結果は次のような形で出ます(架空のデータです)。
| 件数 | 名前 |
|---|---|
| 2 | GPTBot |
| 1 | bingbot |
| 1 | PerplexityBot |
| 1 | ClaudeBot |
日別・ボット別の件数
cut -f1,2 ai_hits.tsv | sort | uniq -c
「2026-10-01 GPTBot」のような組み合わせごとに、件数が出ます。日付が年月日の順なので、月をまたいでも順番が崩れません。
ページ別の件数
cut -f4 ai_hits.tsv | sort | uniq -c | sort -rn | head -n 20
AIクローラー全体で、よく読まれているページの上位20件です。特定のクローラーだけを見たい場合は、次のように名前で絞ります。
awk -F'\t' '$2=="ChatGPT-User" {print $4}' ai_hits.tsv | sort | uniq -c | sort -rn | head -n 20
ステータスコード別の件数
cut -f2,3 ai_hits.tsv | sort | uniq -c
「GPTBot 200」「ClaudeBot 403」のように、クローラーごとにサーバーが何を返したかが分かります。エラーだけを見たいときは、次のコマンドを使います。
awk -F'\t' '$3 >= 400 {print $2, $3, $4}' ai_hits.tsv | sort | uniq -c | sort -rn
400以上のステータスコードを持つ行だけを取り出し、どのクローラーに、どのページで、どのエラーを返したかを数えます。
robots.txt を読みに来ているか
awk -F'\t' '$4=="/robots.txt" {print $1, $2, $3}' ai_hits.tsv | sort | uniq -c
クローラーは、ページを取りに来る前に robots.txt を確認するのが一般的です。このコマンドで、robots.txt を取りに来た日、クローラーの名前、サーバーの返事が分かります。
OpenAI の公式資料には、robots.txt を取得するときに、文字列へ「robots.txt」という目印を足すことがあると書かれています。ログにパスが出ない形式のときに、見分ける手がかりになります。
コマンドの早見表
| 知りたいこと | 使うコマンドの要点 |
|---|---|
| どのクローラーが来たか | cut -f2 のあと、sort と uniq -c |
| いつ来たか | cut -f1,2 のあと、sort と uniq -c |
| どのページが読まれたか | cut -f4 のあと、sort と uniq -c |
| 成功したか、エラーだったか | cut -f2,3 のあと、sort と uniq -c |
| エラーの内訳 | awk で3列目が400以上の行を取り出す |
| robots.txt を確認しているか | awk で4列目が /robots.txt の行を取り出す |
| 特定のクローラーのIP | awk で2列目が名前と一致する行の5列目を取り出す |
名簿にない名前を見つける
探す名前のリストは、今ある名前だけが対象です。新しいクローラーが現れても、リストに無ければ数えられません。
そこで、リストにない「bot」「crawl」「spider」を含む名前を、ユーザーエージェントから拾い出します。
awk -F'"' -v re="$BOTS" '$6 !~ re && match($6, /[A-Za-z0-9_.-]*(bot|Bot|BOT|crawl|Crawl|spider|Spider)[A-Za-z0-9_.-]*/) { print substr($6, RSTART, RLENGTH) }' access.log | sort | uniq -c | sort -rn | head -n 30
リストにある名前を除き、残りの中から、名前らしい部分を取り出して数えます。架空のログで実行すると、「SomeNewBot」のような名前が出ます。
見慣れない名前が出たら、その運営元の公式資料を探して、役割を確かめます。公式資料が見つからない名前は、正体が分かりません。
役割が分かったら、許可するか拒否するかを決めます。判断の進め方は、次の記事にまとめています。
集計結果の読み方
1. そもそも来ているか
最初に、ボット別の件数で、どのクローラーが来ているかを見ます。1か月分のログで、探した名前がまったく出てこなければ、確認すべき点が3つあります。
- ログの形式や保存期間が、調べる条件に合っているか
- CDN が間に入り、キャッシュで返していないか
- robots.txt の書き方や、サーバー・CDN のボット対策で止めていないか
robots.txt で許可しているのに来ない場合は、robots.txt の書き方と、ボット対策の設定を点検します。書き方は、次の記事で説明しています。
2. エラーを返していないか
次に、ステータスコード別の集計を見ます。許可しているつもりのクローラーに、エラーを返していないかが焦点です。
| ステータスコード | 意味 | 見るべきこと |
|---|---|---|
| 200 | 正常に返せた | 読める状態。ここが多いのが理想 |
| 301・302 | 別のURLへの転送 | 古いURLが、内部リンクやサイトマップに残っていないか |
| 403 | アクセス拒否 | セキュリティ機能が、意図せず止めていないか |
| 404 | ページが見つからない | 削除や移動したページへのリンクが、残っていないか |
| 429 | リクエストが多すぎる | アクセス制限の設定が、厳しすぎないか |
| 5xx | サーバーのエラー | サーバーの負荷や不具合がないか |
特に注意したいのは、403 です。セキュリティ系のプラグインや、CDN のボット対策の機能が、AIクローラーをまとめて止めていることがあります。
Perplexity の公式資料には、WAF(Webアプリケーションを守る仕組み)を使っている場合、自社のボットを許可する設定が必要になることがあると書かれています。許可の条件には、ユーザーエージェントとIPの組み合わせが推奨されています。
429 や 5xx が多い場合は、クローラーの負荷でサーバーが重くなっている可能性があります。その場合は、止めずに負荷だけを下げる方法があります。
3. どのページが読まれているか
ページ別の集計で、読まれているページと、読まれていないページを比べます。
- 重要なサービス紹介ページが読まれていなければ、内部リンクやサイトマップから辿りにくい可能性があります。
- パラメーター付きのURLなど、不要なページばかり読まれていれば、robots.txt での整理を検討します。
- 404 を返しているページが多ければ、リンク切れを直します。
ページ別の集計では、「?」以降を捨てているので、パラメーター違いのページは1つにまとまります。パラメーター付きのURLを個別に見たいときは、抜き出しのプログラムの sub の行を外します。
4. 利用者の操作による取得(-User 系)の動き
-User 系のクローラーは、AI の利用者の質問をきっかけにページを取りに来ます。どのページが読まれたかを見ると、AI経由でどんな話題に関心が持たれているかの手がかりになります。
件数が少ないうちは、偶然の要素が大きくなります。数か月単位で傾向を見てください。
robots.txt の変更や、記事の公開の前後で、日別の件数を比べる方法も有効です。変更が読まれるまでに時間がかかることもあるため、1回の比較で結論を出さないでください。
5. 件数の読み方の限界
ログの件数は、AI検索での扱いをそのまま表すものではありません。次の3つの理由があります。
| 理由 | 内容 |
|---|---|
| 1回の取得が、複数の用途に使われうる | OpenAI は、GPTBot と OAI-SearchBot の両方を許可している場合、1回のクロールの結果を両方に使うことがあると説明している |
| キャッシュで返した分が、数えられない | CDN を経由していると、実際の訪問より少なく見える |
| 取得と引用は別 | 読まれたページが、回答で引用されるとは限らない |
訪問の多さと、引用のされやすさの関係について、各社は公式な基準を公開していません。件数の多さを目標にせず、「来ているか」「エラーなく読めているか」の確認に使ってください。
なりすましに注意する
ユーザーエージェントは、誰でも名乗れる
ユーザーエージェントは、アクセスする側が自由に決められる文字列です。「GPTBot」と名乗っていても、本物の OpenAI のクローラーとは限りません。
Bing の公式資料には、文字列は簡単に偽装できるため、IPの確認が必要だと書かれています。Google の確認方法のページも、Google を名乗る不審なアクセスを確かめる方法として書かれています。
大まかな件数を知る段階では、文字列だけで足ります。ブロックや許可リストへの追加を決める段階では、IPの確認が必要です。
各社の確認手段
各社が公開している確認の手段を、表にまとめます(2026年10月時点)。
| 運営 | 確認の手段 |
|---|---|
| OpenAI | GPTBot・OAI-SearchBot・ChatGPT-User・OAI-AdsBot それぞれのIP範囲を、JSON 形式で公開 |
| Anthropic | クローラーのIP範囲の一覧を公開。取得した版は、種類別の区分がない1つの一覧だった |
| Perplexity | PerplexityBot と Perplexity-User のIP範囲を、JSON 形式で公開 |
| Apple | 逆引きDNSで applebot.apple.com に属するかを確認。IP範囲の JSON も公開 |
| Microsoft | Bing Webmaster Tools の Verify Bingbot で、IPを確認できる |
| 逆引きDNSと、IP範囲の JSON ファイルで確認できる |
Anthropic の資料には、IPアドレスでのブロックは、robots.txt を読む妨げになるため、オプトアウトの手段として確実ではないと書かれています。止めたいときは、robots.txt で指定するのが公式の案内です。
照合の手順は、別の記事で
ログから、あるクローラーを名乗るIPの一覧を取り出す方法は、次のコマンドです。
awk -F'\t' '$2=="GPTBot" {print $5}' ai_hits.tsv | sort | uniq -c | sort -rn | head -n 20
出てきたIPを、公式の一覧と照合します。照合のスクリプトや、逆引きDNSでの確認の手順は、次の記事で詳しく説明しています。
CDN を使っている場合は、元のIPが記録される設定になっているかを、先に確かめてください。
うまくいかないときと、よくある失敗
症状別の対処
| 症状 | 考えられる原因 | 対処 |
|---|---|---|
| 何も出力されない | ログが combined 形式でない。変数 BOTS が空。該当する行がない | head -n 3 access.log で先頭行を見る。echo “$BOTS” で変数を確かめる |
| 名前の列に、ユーザーエージェントの全文が出る | 区切りの番号が合っていない | ログの形式を確認し、$6 を実際の番号に変える |
| IPがすべて CDN のものになる | 元のIPを記録する設定がない | CF-Connecting-IP を使う設定を入れる |
| 件数が、体感より明らかに少ない | CDN のキャッシュ。ログの保存期間 | CDN 側の集計と見比べる。保存期間を確認する |
| 日付が1日ずれる | サーバーの時刻設定が、日本時間でない | ログの時刻の末尾にある時差の表記を確かめる |
| 過去のログが読めない | 圧縮されている | gzip -dcf を使って読む |
| 一部の行だけ、項目がずれる | リクエストの中に引用符が含まれる | 数が少なければ無視する。気になる行は、別に取り出して確認する |
Nginx の既定の記録では、引用符は \x22 という形に置き換えられると、公式資料に書かれています。そのため、Nginx のログで項目がずれる行は、まれです。
アクセス解析ツールだけで判断する
GA4 などの数字に出ないことを理由に、「AIクローラーは来ていない」と判断するのは誤りです。GA4 は、既知のボットを自動で除外します。
ログで「Google-Extended」を探す
ログには出ない名前です。Google のクロールは、Googlebot など既存の文字列で記録されます。
文字列を完全一致で探す
バージョンが変わると見落とします。名前の部分だけで探してください。
行全体を grep して件数にする
URL の中に同じ文字を含むページがあると、通常のアクセスまで数えてしまいます。たとえば、/blog/gptbot-guide/ というページへの通常のアクセスが、GPTBot の訪問として混ざります。
また、bingbot のように、名前が文字列の中に2回出るものは、2件と数えられます。この記事のコマンドは、ユーザーエージェントの部分だけを調べ、最初に見つかった名前を1回だけ数えます。
CDN 経由なのに、自社サーバーのログだけで判断する
キャッシュで返した分が抜け、IPも CDN のものになります。CDN 側の集計と併せて読んでください。
文字列だけを根拠に、ブロックや許可を決める
なりすましの可能性があります。決める前に、IPの照合を挟みます。
記録の残し方と、確認の頻度
月ごとの記録表を作る
一度きりの集計では、変化に気づけません。同じ項目を、毎月同じ形で記録しておくと、robots.txt の変更や記事の公開の効果を後から比べられます。
| 記録する項目 | 内容 | 使うコマンド |
|---|---|---|
| 対象の期間 | 集計したログの最初と最後の日付 | head と tail で、ログの両端を確認 |
| クローラー別の件数 | 上位の3〜5つの名前と件数 | cut -f2 のあと、sort と uniq -c |
| 200以外の件数と内訳 | 403・404・5xx が、どの名前に何件出たか | awk で3列目が400以上の行を取り出す |
| よく読まれたページ | 上位5件のパス | cut -f4 のあと、sort と uniq -c |
| robots.txt の確認 | 確認に来たクローラーの名前 | awk で4列目が /robots.txt の行を取り出す |
| 気づいた点と次の手 | 変化の理由の推測と、直す予定 | (手書きでメモ) |
確認の頻度
筆者の目安として、まずは月に1回の集計から始めるのが現実的です。公式な頻度の決まりはありません。
robots.txt を変えた直後や、サイトのリニューアルの直後は、1週間ほど続けて確認すると、問題に早く気づけます。
表計算ソフトで見る
ai_hits.tsv は、タブ区切りのファイルです。Excel や Google スプレッドシートで開き、ピボットテーブルを使うと、日別やクローラー別の集計がグラフになります。
社内への共有にも使えます。コマンドを使えない人にも、同じ数字を見てもらえます。
確認作業のチェックリスト
- アクセスログの保存場所、またはダウンロードの方法を確認した
- ログの各行に、ユーザーエージェントが記録されていることを確認した
- CDN を使っている場合、元のIPが記録される設定になっている
- CDN 側の集計機能も確認した
- ボット別・日別・ページ別・ステータス別に集計した
- 許可しているクローラーに、403・404・5xx を返していないか確認した
- robots.txt を取りに来ているかを確認した
- 名簿にない名前を拾い出し、見慣れない名前の運営元を調べた
- 気になるアクセスのIPを、公式の一覧と照合した
- 集計の結果を、月ごとの記録表に残した
よくある質問
Q1. ChatGPT-User や Perplexity-User を、robots.txt で止められますか?
OpenAI は、ChatGPT-User は利用者の操作による取得のため、robots.txt のルールが適用されない場合があると説明しています。Perplexity も、Perplexity-User は一般に robots.txt を無視すると説明しています。
一方、Anthropic は、Claude-User を無効にできると案内しています。扱いは各社で異なります(いずれも2026年10月時点の公式説明)。
Q2. Gemini 向けのクロールを、ログで見分けられますか?
見分けられません。Google-Extended は独自のユーザーエージェントを持たず、Google の既存のクローラーで取得された内容の使い道を、robots.txt で指定するための名前です。
ログで見られるのは、Googlebot の訪問です。通常の検索対策と同じ方法で、確認してください。
Q3. ログに GPTBot や OAI-SearchBot が出れば、ChatGPT に表示されますか?
訪問と表示は別です。OpenAI の公式資料は、表示のために OAI-SearchBot を許可するよう案内していますが、訪問すれば表示されるとは書いていません。
訪問の記録は、サイトが読める状態にあることの確認に使ってください。
Q4. ログを自分で見られないときは、どうすればよいですか?
サーバーの管理会社や、レンタルサーバーの会社に、アクセスログの提供を依頼します。依頼の際は、「ユーザーエージェントが含まれる形式で、直近1か月分を提供してほしい」と伝えてください。
CDN を使っている場合は、CDN 側の集計画面だけでも、ある程度は確認できます。
Q5. 集計に使うコマンドは、Windows でも動きますか?
Windows では、Linux を動かす機能(WSL)を使えば、同じコマンドが使えます。
筆者は Mac の標準の環境で動作を確かめました。WSL では実行していません。
Q6. 新しいクローラーが出たときは、どうすればよいですか?
名簿にない名前を拾うコマンドで、見慣れない名前が出てきます。運営元の公式資料で役割を確かめ、探す名前のリストに足してください。
クローラーの名前や仕様は、今後も変わる可能性があります。この記事の一覧も、2026年10月時点のものです。
まとめ
AIクローラーの訪問は、サーバーのアクセスログで確認します。GA4 は既知のボットを自動で除外するため、GA4 の数字に出ないことは、来ていない証拠になりません。
ログの中のユーザーエージェントから、次のような名前を探します。
- GPTBot、OAI-SearchBot、ChatGPT-User
- ClaudeBot、Claude-SearchBot、Claude-User
- PerplexityBot、Perplexity-User
- Applebot、bingbot
Google-Extended と Applebot-Extended は、ログに出ない制御用の名前です。
手順は、次の3つです。
- 探す名前に合う行を抜き出し、1つのファイルにまとめる
- 日別・ボット別・ページ別・ステータス別に数える
- 「来ているか」「エラーを返していないか」「どのページが読まれているか」を読む
CDN を使っているなら、キャッシュとIPの扱いに注意し、CDN 側の集計も併せて見てください。ブロックや許可を決めるときは、文字列だけでなく、公式のIP一覧で本物かを確かめます。
名前や仕様は変わります。月に1回、同じ手順で集計し、結果を記録に残してください。
この記事に書いたことを、そのまま御社のページに
生成AIに引用されるページを、お話しいただくだけでお作りします。お時間をいただくのは初回15分のヒアリングだけです。まず1ページ、無料でお作りします。
OKが出るまで、何度でも直します。事実が違う、言い回しが硬い、この話は入れないでほしい。どれも遠慮なくおっしゃってください。何度お直ししても、追加の料金はいただきません。
これまでに127社にご利用いただきました。毎月ご依頼いただいている方の6割以上が、月10ページを選ばれています。料金はページに掲載しています。
ページを増やしても問い合わせが来ないなら、原因はページの外にあります。その場合は、下の入口からご相談ください。
自社のマーケティング課題を根本から解決しませんか?
ウェブサイトから要素を引き算し、訪れた人が迷わず次の一歩に進む形へ組み直す。初回60分のオンラインで御社のサイトを一緒に読み、どこから直すべきかをお伝えします。手順をまとめた無料の診断と解説動画もご用意しています。
初回は無料・60分・オンライン完結・その場で契約のお願いはいたしません


