5种方法查看AI爬虫是否抓取你的网站(附命令)

AI爬虫只拿HTML不跑JS,所以要在服务器和CDN层面才能看到它们。
文章指出AI爬虫不执行JavaScript,传统的浏览器分析工具完全看不到它们,必须在服务器或CDN层拦截请求。作者先区分了三类AI爬虫——训练爬虫、AI搜索爬虫、替人抓取,并强调第三类最接近“页面被用于回答”的真实信号。随后给出五种检测手段:服务器日志、CDN控制台、框架中间件、WordPress钩子、以及把原始日志变成可行动数据的第三方工具。文章还提醒user-agent可被伪造,需要用官方IP段验证真伪,并给出拿到数据后的行动清单:优化标题与首句、检查引用描述、修复爬虫撞到的404、把重要但未被读取的页面从首页和sitemap链接出去。
AI爬虫每天都在读取网站,但几乎没有一个站长能看见它们。原因很简单:分析工具依赖浏览器里运行的JavaScript来统计访客,而AI爬虫只下载HTML,不执行任何JavaScript。要看到它们,你必须盯住请求到达的地方——服务器或CDN。
以下是五种方法,从零成本开始。

先搞清楚:要盯哪些爬虫
AI爬虫分三类,含义完全不同:
| 类型 | 示例 | 请求意味着什么 |
|---|---|---|
| 训练爬虫 | GPTBot、ClaudeBot、CCBot | 页面被采集用于训练模型 |
| AI搜索爬虫 | OAI-SearchBot、Claude-SearchBot、PerplexityBot | 页面进入了助手检索的索引 |
| 替人抓取 | ChatGPT-User、Claude-User、Perplexity-User | 此刻有人向助手提问,它打开了你的页面 |
第三类最值得盯。它最接近"我的页面被用在了某个回答里"这个信号。
user-agent(简称UA) 是HTTP请求头中的一个字段,客户端用它自报身份,格式通常为 Mozilla/5.0 (compatible; GPTBot/1.0; +https://openai.com/gptbot) 这类字符串。本文所有识别手段——grep正则、中间件匹配、WordPress钩子——本质上都是在比对user-agent里的关键词。关键要理解两点:其一,user-agent完全可以被伪造,任何脚本都能宣称自己是GPTBot,所以它只能用于“分类统计”,不能作为“身份认证”;其二,各大AI厂商会在官方文档中声明自家爬虫的user-agent名称与IP段,正规做法是把user-agent匹配与来源IP校验结合起来。此外,部分爬虫会使用多个号(如ChatGPT-User 与 OAI-SearchBot 同属OpenAI),做统计时按公司归并往往比按单一UA更有意义。
方法一:服务器访问日志(免费)
Nginx和Apache本身就会把每个请求写进日志。先统计每个AI爬虫的请求量:
grep -oE "GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User" /var/log/nginx/access.log \
| sort | uniq -c | sort -rn
再看某个爬虫具体要了哪些页面(默认日志格式中路径是第7个字段):
grep "ChatGPT-User" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
还有那些返回404的请求——爬虫以为那里有页面,结果没找到(状态码是第9个字段):
grep -E "GPTBot|ClaudeBot|PerplexityBot" /var/log/nginx/access.log | awk '$9 == 404 {print $7}' | sort | uniq -c | sort -rn | head
适用场景: 在VPS上做一次性排查。局限: 日志几天到几周就会轮转,服务器前面的CDN缓存会隐藏请求,而且你得到的是一个数字,不是趋势。
文中的命令依赖Nginx/Apache的 “combined”日志格式,其字段顺序为:$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"。按空格切分后,第1个字段是客户端IP,第7个字段是请求路径(含query string),第9个字段是HTTP状态码,最后一个字段是user-agent。这也是为什么脚本里用 $7 取路径、$9 判断404——它们对应“按空格分割后的第几个”。如果你在Nginx中自定义了 log_format(例如把referer去掉,或使用JSON格式),字段编号会变化,需要先 head -1 access.log 看一下实际结构再调整。Apache同理,标准combined格式与Nginx一致,但若启用了 %D 等自定义字段就会错位。理解这一点,才能把这几条grep/awk命令迁移到自己的环境中。
方法二:CDN控制台(免费)
CDN比服务器更早看到每个请求,包括它自己用缓存直接回应的那些。Cloudflare控制台里有AI爬虫专区,列出正在请求你站点的AI爬虫,并允许你逐个放行或拦截。其他CDN和托管商(Vercel、Netlify、Fastly)会在日志里显示请求,可以按user agent过滤。
适用场景: 快速回答"哪些AI公司在爬我、爬了多少"。局限: 通常看不到按页面维度的时间趋势,也看不到后续发生了什么(有没有人来访问、有没有成交)。
方法三:几行中间件(适用于Next.js等框架)
如果你的框架支持在每个请求上运行代码,就在那里记录爬虫。以Next.js为例:
// middleware.ts (Next.js 16 中为 proxy.ts)
import { NextResponse, type NextRequest } from 'next/server'
const AI = /GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Perplexity-User/i
export function middleware(req: NextRequest) {
const bot = req.headers.get('user-agent')?.match(AI)?.[0]
if (bot) console.log(JSON.stringify({ bot, path: req.nextUrl.pathname }))
return NextResponse.next()
}
export const config = { matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'] }
这些日志会进入托管商的函数日志。同样的思路适用于Express、Cloudflare Worker或任何服务端框架。
局限: 你仍然需要自己存储、统计和绘图,而且中间件在页面之前运行,拿不到响应状态码。
中间件(middleware) 是一种在请求到达具体页面处理器之前运行的函数,它能读取请求头、URL、cookie,并决定放行、重写或直接返回响应。Next.js从12版起支持在项目根目录放 middleware.ts,对匹配的路径统一执行这段代码——这使得“在每个请求上记录爬虫”变得非常轻量。需要注意三个特性:其一,中间件运行在Edge Runtime,不能用Node.js的 fs、console.log 也只会写入托管平台的函数日志(如Vercel的Logs面板);其二,config.matcher 用正则排除静态资源,避免日志被 _next/static 淹没;其三,中间件在页面渲染之前执行,所以只能拿到请求信息,拿不到响应状态码——这解释了原文提到的“局限”。若要记录404,需要改在页面或API层拦截。
方法四:WordPress
WordPress在每个未缓存的请求上都会跑PHP,所以写一小段代码放进插件或子主题就能记录AI爬虫:
add_action('template_redirect', function () {
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
if (preg_match('/GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-User|PerplexityBot|Perplexity-User/i', $ua, $m)) {
error_log('AI bot ' . $m[0] . ' ' . ($_SERVER['REQUEST_URI'] ?? '/'));
}
});
坑点: 页面缓存(WP Rocket、LiteSpeed、CDN)会直接返回缓存页面而不执行PHP,所以被缓存的页面不会被统计到。要么把爬虫的user agent排除出缓存,要么改在CDN层面统计。
方法五:从服务器端读取爬虫的自动分析工具
前四种方法给你的都是原始请求。要把它们变成能行动的东西,你需要存储、按页面和公司分组,再和用户后续行为关联起来。我把这套逻辑做进了PageLens:服务器上一小段代码上报爬虫请求,仪表盘展示AI爬虫读过哪些页面、助手为了回答问题打开过哪些页面、它们撞到的404,以及来自AI助手的访问和收入。
验证爬虫是不是真的
任何人都能发一个自称GPTBot的请求。OpenAI、Anthropic和Perplexity都公开了自家爬虫使用的IP段,所以一个带着爬虫名字却来自其他地址的请求就是冒牌货。有研究检查了740个头部网站,发现9%的站点会拒绝携带AI爬虫名字的请求,尽管它们的robots.txt其实是允许这些爬虫的。
IP段校验 的具体做法是:先按user-agent筛出“自称GPTBot”的请求,再取出其来源IP($remote_addr 或CDN返回的 CF-Connecting-IP 头),检查它是否落在OpenAI官方公布的IP列表内。OpenAI、Anthropic、Perplexity都会在文档里给出CIDR格式的网段,或提供一个可定期拉取的JSON(如OpenAI的 https://openai.com/gptbot.json)。工程上通常写一个脚本,定时拉取这些网段缓存到本地,请求时做一次 ip-in-CIDR 判断。反过来也有价值:如果你发现大量来自云厂商(AWS、Hetzner)而非官方网段的“GPTBot”请求,那多半是伪装爬虫,应当直接拦截。原文提到的“9%站点误拒真爬虫”正是因为没有做这一步校验,仅凭UA匹配或者凭直觉封禁,结果把合法爬虫也挡在了门外。
拿到数据之后怎么用
- 读得多,却从未被打开回答问题: AI知道这个页面存在,但觉得它对回答没用。把问题写进标题,把答案放进前两句话。
- 被打开回答问题了,却没有访问: 你被当成了来源却没被点击。检查页面怎么描述你,以及有没有给出点击的理由。
- 重要页面从未被读取: 从首页和sitemap链接到它,检查robots.txt和CDN配置。
- 爬虫在撞404: 它们预期那里有页面,通常是
/pricing、/docs或/llms.txt。创建它或者做重定向。
命令里的字段编号对应Nginx和Apache默认的"combined"日志格式。如果你的格式不同,需要相应调整。
相关推荐

WorkBuddy保姆级教程:半小时跑通自动化工作流
WorkBuddy 自动化工作流保姆级拆解:为什么大多数人只把它用成聊天软件,27 个支点课程与 12 个模板如何帮助新手半小时跑通落地实操,附使用边界提醒。

Codex云端模式详解:环境配置与适用场景
本文详细解析Codex云端模式的工作原理、环境配置步骤及适用场景,包括如何创建环境、连接GitHub仓库、设置定时任务,并对比云端与本地模式的差异,帮助开发者高效利用Codex。

Claude Code免费使用真相:三条路与一个骗局
Claude Code 免费使用是否可行?本文拆解 Pro、Max 的真实成本(含汇率与税费)、社区免费方案的技术原理与隐私代价,以及假安装包、钓鱼页面等安全陷阱,并给出访客通行证、开源贡献者计划和本地模型三条合法免费路径。