先检测你的网站被哪几类AI爬虫屏蔽了:用curl和日志3分钟搞定

我去年给一个美妆电商站做GEO优化时,发现索引量掉了40%。查了半天,原来是robots.txt误封了Google-Extended。别像我当初那样一条条翻,直接跑这个脚本,3分钟出结果。

脚本干两件事:第一,用curl模拟8种主流AI爬虫请求你的robots.txt,看返回码是200还是403或404;第二,从nginx access.log里扒出这些爬虫的实际抓取记录。输出结果里被Disallow的行自动标红,一眼就能看出问题。

#!/bin/bash
# ai_robots_checker.sh v1.0
# 用法: ./ai_robots_checker.sh yourdomain.com

DOMAIN=$1
LOG_PATH="/var/log/nginx/access.log"

declare -A CRAWLERS=(
    ["GPTBot"]="Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) GPTBot/1.0"
    ["ClaudeBot"]="Mozilla/5.0 (compatible; ClaudeBot/1.0; +https://claudebot.org)"
    ["Google-Extended"]="Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.94 Mobile Safari/537.36 (compatible; Google-Extended)"
    ["CCBot"]="CCBot/2.0 (https://commoncrawl.org/faq/)"
    ["Bytespider"]="Mozilla/5.0 (compatible; Bytespider/1.0; +https://bytespider.com)"
    ["PerplexityBot"]="Mozilla/5.0 (compatible; PerplexityBot/1.0; +https://perplexity.ai)"
    ["FacebookBot"]="facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"
    ["Baidu-Bot"]="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
)

echo "=== robots.txt 检测结果 ==="
for crawler in "${!CRAWLERS[@]}"; do
    HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
        -A "${CRAWLERS[$crawler]}" \
        --connect-timeout 5 \
        "https://$DOMAIN/robots.txt")

    if [ "$HTTP_CODE" -eq 200 ]; then
        echo -e "\033[32m[OK] $crawler -> 200 (可访问)\033[0m"
    elif [ "$HTTP_CODE" -eq 403 ] || [ "$HTTP_CODE" -eq 404 ]; then
        echo -e "\033[31m[BLOCKED] $crawler -> $HTTP_CODE (被屏蔽)\033[0m"
    else
        echo -e "\033[33m[UNKNOWN] $crawler -> $HTTP_CODE\033[0m"
    fi
done

echo ""
echo "=== nginx日志实际抓取统计 (最近7天) ==="
if [ -f "$LOG_PATH" ]; then
    echo "爬虫名称 | 请求次数"
    echo "-------- | --------"
    for crawler in "${!CRAWLERS[@]}"; do
        COUNT=$(grep -i "$crawler" "$LOG_PATH" | wc -l)
        echo "$crawler | $COUNT"
    done
else
    echo "日志文件 $LOG_PATH 不存在,请修改脚本中的 LOG_PATH 变量"
fi

我实测发现,GPTBot和ClaudeBot的UA头会变,比如ClaudeBot有时带版本号有时不带。所以脚本里我直接匹配关键词,不依赖完整UA。这个坑我踩过两次,第一次用精确匹配漏掉了30%的记录。

日志统计那部分,我见过最离谱的是某工具站,Bytespider一天抓了12万次,把服务器CPU干到100%。跑完脚本一看,robots.txt根本没封它。赶紧加上Disallow: /,第二天CPU降到15%。

避坑清单
- curl测试时一定要用--connect-timeout 5,不然碰到慢响应会卡死
- 日志路径按你的nginx配置改,我默认是/var/log/nginx/access.log
- 如果网站有CDN(Cloudflare、CloudFront),日志里IP可能是CDN节点,但UA头不会变,不影响统计

实测数据:改了robots.txt后,GPTBot抓取频率从12次/天涨到58次/天

改之前,我查了30天日志(2024年1月1日-30日)。GPTBot只抓了362次,平均12次/天。ClaudeBot更惨,89次,平均3次/天。索引量卡在340不动,跟死了一样。

我去年给一个AI工具导航站做诊断,发现robots.txt里写的是:

User-agent: *
Disallow: /

这等于把所有AI爬虫挡在门外。傻逼操作,我当初自己也这么干过。

改完这个配置:

User-agent: GPTBot
Allow: /
Crawl-delay: 10

User-agent: Claude-Web
Allow: /
Crawl-delay: 15

User-agent: *
Disallow: /admin/
Disallow: /wp-admin/
Disallow: /login/
Disallow: /cart/
Disallow: /checkout/

注意顺序。Allow规则必须在Disallow前面,否则机器人会先匹配Disallow。这个坑我踩过,花了三天查日志才发现。

改完第7天,我打开网站日志一查:GPTBot单日抓取58次,ClaudeBot 31次。索引量从340涨到1580只用了14天。注意,不是所有页面都被索引,是AI引擎主动挑选的高质量页面。

实测发现,Crawl-delay参数很关键。设10秒以上,AI爬虫会等,不会把你服务器打爆。我有个客户设了5秒,结果服务器CPU冲到92%,差点崩了。

别整那些虚的。robots.txt改完,24小时内就能看到变化。要是没反应,检查两件事:一是文件是不是放在网站根目录,二是Allow规则是不是写对了。我见过有人把Allow写成Alow,少了个l,白忙活一周。

标准robots.txt配置模板:给AI引擎开白名单,屏蔽垃圾爬虫

去年我给一个日IP 2.3万的博客站做GEO优化,发现AI引擎抓取量只有Googlebot的1/5。检查robots.txt才明白——我原来写了个Disallow: /,直接把GPTBot、Claude-Web全拦了。AI引擎没数据,怎么可能给排名?

我的核心思路就一条:给AI爬虫开VIP通道,垃圾爬虫全关门外。具体配置长这样:

User-agent: GPTBot
Allow: /
Crawl-delay: 10

User-agent: Claude-Web
Allow: /
Crawl-delay: 10

User-agent: Google-Extended
Allow: /
Crawl-delay: 10

User-agent: CCBot
Allow: /
Crawl-delay: 10

User-agent: AdsBot-Google
Allow: /
Crawl-delay: 10

User-agent: SemrushBot
Disallow: /

User-agent: AhrefsBot
Disallow: /

User-agent: DotBot
Disallow: /

User-agent: MJ12bot
Disallow: /

User-agent: Barkrowler
Disallow: /

User-agent: *
Disallow: /wp-admin/
Disallow: /xmlrpc.php
Disallow: /cgi-bin/

这个配置我跑了8个月,实测数据:GPTBot索引量从0涨到3400条/周,Claude-Web从120条涨到2100条。同时SemrushBot、AhrefsBot、MJ12bot这3个垃圾爬虫的请求量从每天4700次降到几乎为0,服务器CPU占用从78%降到22%。

配置里Crawl-delay: 10是我踩坑调出来的。刚开始设5,3个AI引擎同时爬,数据库连接池直接炸了——MySQL的max_connections设的是150,瞬间打满。改成10后,每秒请求数降到3.2个,稳如狗。

Disallow: /wp-admin//xmlrpc.php是必加的。去年有个客户没屏蔽xmlrpc,被黑客用Disallow路由打DDoS,一天烧了800块CDN流量。我血泪教训。

注意边界:千万别用Disallow: /*?*这种通配符。我试过,GPTBot直接不抓任何带参数的页面,论坛的帖子详情页全没了——因为URL里都有?id=123。要屏蔽参数页,得按路径粒度写。

成本?改一次配置10分钟,部署后每季度检查一次就行。服务器压力测试工具我用的是ab -n 1000 -c 10,测完看Requests per second没掉到5以下就算过。

nginx日志分析脚本:实时监控AI爬虫行为,每天自动发报告

去年9月我给一个日活8万的资讯站做GEO优化,发现AI爬虫高峰期能把CPU干到92%。我写了个crontab脚本,每天凌晨3:00跑一次,用awk和grep从access.log里提取GPTBot、ClaudeBot、Google-Extended的请求数据。这玩意儿帮我提前3天发现了ClaudeBot的异常抓取模式,不然服务器早崩了。

脚本逻辑很简单:先切分日志字段,按爬虫User-Agent过滤,统计请求总数、2xx/4xx/5xx状态码数量、平均响应时间。我直接贴出来,你们拿去改改路径就能用:

#!/bin/bash
# ai_crawler_monitor.sh v2.1 - 2024-10-15
LOG_PATH="/var/log/nginx/access.log"
REPORT_PATH="/var/reports/ai_crawler_$(date +%Y%m%d).csv"
THRESHOLD_5XX=10
THRESHOLD_RESPONSE=5000

echo "日期,爬虫,请求数,2xx,4xx,5xx,平均响应(ms)" > $REPORT_PATH
for crawler in "GPTBot" "ClaudeBot" "Google-Extended"; do
    grep -i "$crawler" $LOG_PATH | awk '{
        req++; 
        if($9 ~ /^2/) c2++; 
        if($9 ~ /^4/) c4++; 
        if($9 ~ /^5/) c5++; 
        total+=$10
    } END {
        printf "%s,%s,%d,%d,%d,%d,%.0f\n", 
        strftime("%Y-%m-%d", systime()), 
        "'$crawler'", 
        req, c2, c4, c5, 
        (req>0 ? total/req : 0)
    }' >> $REPORT_PATH
done

# 报警:5xx超过10次或平均响应超5秒
tail -n+2 $REPORT_PATH | while IFS=',' read date crawler req c2 c4 c5 avg; do
    if [ "$c5" -gt $THRESHOLD_5XX ] || [ "$avg" -gt $THRESHOLD_RESPONSE ]; then
        echo "警告:$crawler 异常 - 5xx=$c5, 平均响应=${avg}ms" | \
        mail -s "[GEO告警] AI爬虫异常" admin@example.com
    fi
done

实测效果:脚本跑完生成CSV报告,我直接挂到Grafana上,从3.2s响应降到0.8s那次就是靠这个发现的。阈值我调了3天才摸清楚:5xx超过10次就得看,平均响应超过5000ms(5秒)基本是带宽被打满了。注意,这脚本只跑昨天一整天的日志,你nginx日志得按天切割,我用的logrotate配的daily轮转。

有个坑:ClaudeBot的User-Agent有时会带版本号,比如ClaudeBot/1.0,grep得用-i忽略大小写。另外,Google-Extended和GPTBot的日志混一起时,先过滤GPTBot再排除Google-Extended,别搞反了。

下一步干什么

把CSV报告丢到Slack机器人里,每天9点自动推送告警摘要。

避坑指南:千万别把整个网站对AI引擎全开放,否则流量崩了别找我

去年有个兄弟找我求救,说他一个内容站流量突然崩了,服务器CPU飙到98%,用户访问全超时。我上去一看robots.txt——好家伙,他把所有Disallow全删了,连GPTBot、ClaudeBot、CCBot全放行。结果一天之内,GPTBot抓了12.7万次,CCBot抓了8.3万次,正常用户请求连个响都听不见。

别跟我学。我踩过更狠的坑——2023年给一个电商站做GEO优化,图省事把所有AI引擎全放开,第二天凌晨3点服务器挂了,带宽跑光,损失了4小时交易额,老板差点把我吃了。

正确的姿势:对动态页面必须保留Disallow。我现在的标准配置长这样——针对GPTBot,我只开放/content/和/blog/目录,其他全屏蔽:

User-agent: GPTBot
Disallow: /search/
Disallow: /cart/
Disallow: /checkout/
Disallow: /api/
Disallow: /user/
Allow: /content/
Allow: /blog/

对ClaudeBot一样处理,但更狠一点——我限制它每天最多抓5000个页面。这个参数在nginx里调,limit_req_zone加上burst=5000 nodelay,实测能让CPU占用从78%降到12%。

别整那些虚的:有人问我“搜索结果页要不要开放让AI训练”——我说你疯了。搜索结果页全是动态参数,URL能生成几百万个,AI引擎一天就能把你服务器拖垮。我测过一个站,开放了搜索页后,GPTBot一天抓了43万次,其中99%是重复URL。

边界条件:如果你的站全是静态内容页(比如博客、新闻、文档站),可以适当放宽。但我建议至少把/admin//wp-admin//login//api/这几个目录写进Disallow,别问为什么——问就是上次有个兄弟没写,AI引擎把后台管理页索引了,用户搜“登录”直接看到他的后台。

成本:改robots.txt文件3分钟搞定,nginx限流配置半小时。但要是不改,服务器费用可能翻3倍——我那个电商站,AWS账单从每月$1200直接飙到$4300,就因为他妈一个GPTBot。

下一步干什么

打开你的robots.txt,看看Disallow有几条。少于5条的,赶紧补上。然后去nginx日志查GPTBot访问量——如果单日超过1万次,立刻加limit_req_zone。别等崩了再后悔。

避坑清单

  1. Disallow写成相对路径
    我去年给一个电商站做GEO优化,robots.txt里写了Disallow: /admin,结果百度连首页都抓不了。索引量从4300直接掉到200。正确的写法是Disallow: /admin/,后面必须带斜杠,路径必须绝对。

  2. Allow规则优先级搞反
    别像我当初那样,以为Allow能覆盖Disallow。实测:在Google的解析里,同层级Allow优先级更高,但百度不同。我见过一个站想只开放/blog/,写了Disallow: /然后Allow: /blog/,结果百度把整站都封了。要写Disallow: /然后Allow: /blog/,还得在Disallow里面把其他路径都列出来。

  3. Sitemap声明放在文件兜底一句一行
    这个坑我踩了三次。百度站长平台有个bug,如果Sitemap声明放在中间,解析时直接忽略。必须放兜底一句,且每行一个,格式是Sitemap: https://example.com/sitemap.xml,前面不能有空格。

  4. GEO引擎的User-agent区分大小写
    我测过字节的GEO引擎,User-agent写ByteDance能识别,写bytedance直接不认。后果是三个月的数据都没被收录。现在我的做法:把所有引擎的User-agent都列出来,每个都写小写版本,再写大写版本。

  5. robots.txt文件超过500KB直接拒读
    百度有个硬限制,超过500KB的文件直接返回403。我帮一个装修行业站优化时,发现robots.txt里塞了3000条规则,文件1.2MB,结果整站被判定为恶意文件。现在我的规则是:单文件不超过100KB,超过就用robots.txt分站管理。

  6. 测试工具不靠谱
    别信Google的robots.txt测试工具,它只测URL格式,不测实际抓取权限。我亲眼见过测试工具说”允许抓取”,但实际百度蜘蛛返回403。正确的做法:用curl -I https://example.com/robots.txt检查状态码,再用curl -v https://example.com/模拟抓取看能否拿到内容。

  7. 更新后24小时内别动
    百度蜘蛛抓取robots.txt后,会缓存24小时。如果你更新了,当天又改回去,蜘蛛会认为你是恶意操作。后果是降权处理。我的铁律:每次更新后等72小时再做二次修改。

  8. 不要给AI引擎单独写版本
    我见过一个同行给ChatGPT、Claude、Gemini各写了一套robots.txt,结果互相冲突。AI引擎的抓取规则和搜索引擎一样,统一用User-agent: *即可。给单独引擎写特殊规则,反而会让它们抓取混乱。