[控场AI]
· 9 分钟阅读· 4,941 字

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

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爬虫抓取网站

先搞清楚:要盯哪些爬虫

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"日志格式。如果你的格式不同,需要相应调整。

#AI爬虫#GPTBot#ClaudeBot#PerplexityBot#服务器日志#网站分析#AI流量
分享:

相关推荐