サーバーログでAIクローラーを確認する方法

公開日

結論

アクセスログのユーザーエージェント欄から、GPTBot、OAI-SearchBot、ClaudeBot、Claude-SearchBot、PerplexityBotなどのトークンを探し、返したステータスコードを確認します。ユーザーエージェントだけでは何も証明できないため、送信元IPをベンダーが公開しているIPリストと照合するか、GoogleとAppleについては逆引きと正引きのDNSで確認してください。

robots.txtは、クローラーに何をしてほしいかを伝えるものです。アクセスログには、実際に何が起きたかが残っています。どのAIクローラーが来て、どのページをリクエストし、サーバーが何を返したかがわかります。これは最も直接的な証拠で、ログファイルとターミナルがあれば確認できます。以下の例では、nginxとApacheがデフォルトで使うcombinedログ形式を前提にしています。

このページの内容
  1. アクセスログでAIクローラーの訪問はどう見える?
  2. AIクローラーの訪問数を数えるには?
  3. 各クローラーは実際に何を受け取ったのか
  4. OpenAI、Anthropic、Perplexityからの訪問だと確認するには?
  5. Googlebot、Applebot、CCBotを検証するには?
  6. 偽のAIクローラーはどんな見た目?
  7. ログからはわからないこと

アクセスログでAIクローラーの訪問はどう見える?

combined形式では、各行にクライアントのIP、時刻、リクエスト行、ステータスコード、レスポンスサイズ、リファラー、ユーザーエージェントが入っています。nginxでは$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"と定義されており、Apacheのcombined形式も同じフィールドを持ちます。OpenAIの学習用クローラーの訪問は、次のように記録されます。

20.171.206.5 - - [12/Nov/2026:10:00:01 +0000] "GET /pricing HTTP/1.1" 200 5120 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot"

探すべきトークンは、ベンダーが文書化しているものです。GPTBot、OAI-SearchBot、ChatGPT-User(OpenAI)、ClaudeBot、Claude-SearchBot、Claude-User(Anthropic)、PerplexityBot、Perplexity-User(Perplexity)、そしてGooglebot、Applebot、meta-externalagent、meta-webindexer、CCBotです。Google-ExtendedとApplebot-Extendedがログに現れることはありません。GoogleはGoogle-Extendedに独立したユーザーエージェント文字列はないと述べ、AppleはApplebot-Extendedはクロールしないと述べています。どちらもrobots.txtのトークンにすぎません。

AIクローラーの訪問数を数えるには?

各行をダブルクォートで分割すると、ユーザーエージェントはフィールド6に入ります。そのフィールドだけを照合すれば、たまたまボットの名前を含むURLによる誤検出を避けられます。次のコマンドは、現在のログと、ローテーションされ圧縮されたログ全体で、クローラーごとの訪問数を数えます。

zcat -f /var/log/nginx/access.log* \
  | awk -F'"' '{print $6}' \
  | grep -Eo 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User|Googlebot|bingbot|Applebot|meta-externalagent|meta-webindexer|CCBot' \
  | sort | uniq -c | sort -rn

Apacheの場合はパスを調整してください。多くは/var/log/apache2/access.log*か/var/log/httpd/access_log*です。zcat -fは、通常のファイルとgzip圧縮されたファイルの両方を読み取ります。想定したクローラーが見当たらなくても、それだけでブロックの証拠にはなりません。ログの対象期間に訪問していないだけかもしれません。

各クローラーは実際に何を受け取ったのか

訪問数よりも、返した応答のほうが重要です。すべてのリクエストで403を受け取ったクローラーは、訪問しても何も読んでいません。次のコマンドは、ステータスコード、最もリクエストされたパス、クローラーがrobots.txtを取得したかどうかを示します。

# Status codes returned to PerplexityBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /PerplexityBot/ {split($3, s, " "); print s[1]}' | sort | uniq -c

# Most requested paths for OAI-SearchBot
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /OAI-SearchBot/ {split($2, r, " "); print r[2]}' | sort | uniq -c | sort -rn | head -20

# Did ClaudeBot fetch robots.txt, and what did it get?
zcat -f /var/log/nginx/access.log* | awk -F'"' '$6 ~ /ClaudeBot/ && $2 ~ /robots\.txt/ {split($3, s, " "); print s[1]}' | sort | uniq -c

望ましいのは、ほとんどが200であることです。403や429が多い場合は、ファイアウォールのルールかレート制限が疑われます。robots.txtに対する5xxの応答は深刻です。RFC 9309では、robots.txtでサーバーエラーを受け取ったクローラーは、サイト全体が禁止されているものとみなす必要があります。

サイトがCDNの背後にある場合は、2点が変わります。CDNがブロックしたリクエストはオリジンに届かないため、オリジンのログにはまったく現れません。代わりに、CDN側のセキュリティイベントを確認してください。また、訪問者のIPを復元しない限り、オリジンにはCDNのアドレスが記録されます。たとえばCloudflareは、元のIPをCF-Connecting-IPヘッダーで送り、デフォルトではCloudflareのIPがログに残ります。

OpenAI、Anthropic、Perplexityからの訪問だと確認するには?

これらのベンダーは、エージェントが使うIPレンジを公開しています。OpenAIはopenai.com/gptbot.json、openai.com/searchbot.json、openai.com/chatgpt-user.json、Anthropicはclaude.com/crawling/bots.json、Perplexityはperplexity.ai/perplexitybot.jsonとperplexity.ai/perplexity-user.jsonです。Anthropicは、送信元IPがそのリストにあれば、クローラーがAnthropicから来ていることを示すと述べています。この3社のいずれも逆引きDNSによる検証を文書化していないため、リストを使ってください。

これらのファイルは、ipv4Prefixまたはipv6Prefixのエントリを持つprefixesのリストという同じ形をしているため、小さなスクリプト1つで、どれに対してもIPを照合できます。

python3 - 20.171.206.5 https://openai.com/gptbot.json <<'EOF'
import ipaddress, json, sys, urllib.request
ip = ipaddress.ip_address(sys.argv[1])
req = urllib.request.Request(sys.argv[2], headers={"User-Agent": "log-check"})
prefixes = json.load(urllib.request.urlopen(req))["prefixes"]
nets = [ipaddress.ip_network(p.get("ipv4Prefix") or p.get("ipv6Prefix")) for p in prefixes]
print(ip, "listed" if any(ip in n for n in nets) else "NOT listed")
EOF

特定のクローラーを名乗ったIPを一覧にするには、ログに対してawk -F'"' '$6 ~ /GPTBot/ {split($1, a, " "); print a[1]}'を実行し、結果をsort | uniq -c | sort -rnに渡します。それぞれを、対応するリストと照合してください。リストは変わるため、古いコピーを使い続けず、そのつど最新のものを取得してください。

Googlebot、Applebot、CCBotを検証するには?

Google、Apple、Common Crawlは、逆引きと正引きのDNSによる確認方法を文書化しています。IPのホスト名を調べてそのドメインを確認し、次にそのホスト名を調べて、同じIPに戻ることを確認します。

host 66.249.66.1
# 1.66.249.66.in-addr.arpa domain name pointer crawl-66-249-66-1.googlebot.com.
host crawl-66-249-66-1.googlebot.com
# crawl-66-249-66-1.googlebot.com has address 66.249.66.1

Googleの場合、ホスト名はクローラーに応じてgooglebot.com、google.com、googleusercontent.comのいずれかで終わる必要があります。GoogleはIPレンジも公開しており、Googlebotはcommon-crawlers.jsonにあります。Appleの場合はapplebot.apple.comに属している必要があり、レンジはapplebot.jsonにあります。Common Crawlの場合はcrawl.commoncrawl.orgの配下にある必要があり、Common Crawlは、ほかのクローラーがCCBotの名前を偽って使っていると警告しています。

偽のAIクローラーはどんな見た目?

スクレイパーは、フィルターを通過するために、有名なクローラーのユーザーエージェントを借りることがよくあります。典型的な兆候は次のとおりです。

逆の問題もあります。通常のブラウザのユーザーエージェントを使うクローラーは、ログの行からはまったく識別できません。2025年にCloudflareは、Perplexityが公開しているレンジ外のIPから、申告されていないブラウザ風のユーザーエージェントでクロールしていることを確認したと発表しました。Perplexityはこの説明に異議を唱え、トラフィックの一部はサードパーティのサービスによるものだと述べています。このようなケースはログだけでは決着がつきません。公開されているIPレンジによる検証が、どちらの方向でも重要になるのはそのためです。

ログからはわからないこと

ログに残るのは、サーバーに届いたものです。オリジンの手前でCDNが何をブロックしたか、200を返したページに本文が含まれていたのかスクリプトの殻だけだったのか、今日クローラーが来たら許可されるかどうかは、ログには表れません。また、対象は保存している期間だけで、アクセスの少ないサイトでは、AIクローラーが来る頻度自体が低いこともあります。

AISeeWhyのアカウントでは、combined形式のアクセスログ(通常または.gz、最大50 MB)をアップロードできます。ログは分析後に破棄され、AIクローラーごとのリクエストがステータスコードとともに集計され、ベンダーが公開しているIPレンジと照合されます。

よくある質問

ログにGoogle-Extendedが見当たらないのはなぜ?

Googleは、Google-Extendedに独立したユーザーエージェント文字列はないと述べています。クロールはGoogleの既存のクローラーが行い、このトークンはコンテンツの利用方法を制御するだけです。Appleがクロールしないと述べているApplebot-Extendedも同様です。

ログのユーザーエージェントは信用できる?

できません。誰でも任意のユーザーエージェントを送れます。申告として扱い、ベンダーが公開しているIPレンジで確認してください。Google、Apple、Common Crawlについては、逆引きと正引きのDNS検索で確認できます。

ログにAIクローラーの訪問がありません。ブロックされている?

そうとは限りません。クローラーがまだ訪問していない、CDNがオリジンの手前でブロックした、ログにCDNのIPアドレスしか記録されていない、といった可能性があります。CDNのセキュリティイベントを確認し、各クローラーのユーザーエージェントでページをテストしてください。

ChatGPT-Userのトラフィックはクローラー?

OpenAIは、ChatGPT-Userは特定のユーザーの操作に使われ、ウェブを自動的にクロールするためには使われないと述べています。訪問は、多くの場合、誰かがChatGPTにページについて尋ねたことを受けたものなので、数は少なくなります。

参考資料

ほかの記事