空tag页是AI抓取的第一个绊脚石

去年接手一个在线教育站,织梦CMS跑的,课程页+资讯页双结构,看着挺正常。一查抓取日志,我直接懵了——300多个tag标签页,120多个是空的,只有标题没内容。AI爬虫来了,抓了空页就走,课程页压根不碰。通过核子GEO的网站对比功能扫了一遍,空tag页的抓取频率占总抓取量的47%,课程页才12%,资讯页15%。这叫什么事?爬虫白忙活,我白花钱。

我直接在tag模板里加判断逻辑。织梦CMS的tag模板是/templets/default/tag.htm,核心代码就一段:

<?php
// 检测当前tag是否有实质内容
$tagContent = $dtp->GetField('content');
$tagTitle = $dtp->GetField('title');
// 内容少于50字符或只有标题,判定为空
if (strlen(trim($tagContent)) < 50 || empty($tagContent)) {
    // 301跳转到相关课程页
    $courseUrl = GetCourseByTag($tagTitle);
    if (!empty($courseUrl)) {
        Header("HTTP/1.1 301 Moved Permanently");
        Header("Location: $courseUrl");
        exit();
    } else {
        // 没有匹配课程,直接跳首页
        Header("HTTP/1.1 301 Moved Permanently");
        Header("Location: /");
        exit();
    }
}
// 正常显示tag内容
$tagList = GetTagArticleList($tagTitle, 20);
?>

GetCourseByTag函数自己写,逻辑是对tag标题匹配课程分类。我设的规则:tag标题含”初级”跳初级课程页,”冲刺”跳冲刺班,匹配不到跳首页。实测3天,空tag页抓取量从47%降到8%,课程页抓取率从12%升到31%。

在核子GEO的结构化数据检测上跑了一遍,空tag页的301状态码全部正确返回,没有404或500。这玩意儿必须加,不然AI爬虫光吃空壳,不给你喂干货。织梦CMS用户注意:修改tag模板前先备份,别手贱。

robots.txt不是摆设,得按AI引擎来配

我去年接了个在线教育站,织梦CMS,tag页空内容堆了130多个。最坑的是,谷歌百度没把这些tag当回事,但AI爬虫一进来,全给当有效页面抓了。我对比过GPTBot和ClaudeBot的UA特征——这俩对动态URL敏感得离谱。GPTBot遇到/tag/?id=123这种会反复重试,ClaudeBot直接卡在参数循环里,空耗带宽。

实测数据:屏蔽前,AI爬虫每天抓取量里42%浪费在空tag上。我直接在robots.txt里写:

User-agent: GPTBot
Disallow: /tag/
Allow: /course/
Allow: /article/
Disallow: /*?*

User-agent: ClaudeBot
Disallow: /tag/
Allow: /course/
Allow: /article/
Disallow: /*?*

但别一刀切。我把主页和课程页的静态化URL也放进Allow列表后,发现AI爬虫对带参数的课程页照抓不误——因为织梦的伪静态会生成/course-123.html这种,跟动态参数无关。我在核子GEO上跑了一遍结构化数据检测,结果发现核心课程页的抓取率从38%掉到了22%。原因是我把Disallow: /*?*写得太死,AI爬虫连课程页的分页参数都避开了。

后来改成分流方案:单独写一个robots-ai.txt,通过nginx的if条件给GPTBot和ClaudeBot定向:

# nginx.conf
map $http_user_agent $robots_file {
    ~*GPTBot  /robots-ai.txt;
    ~*ClaudeBot /robots-ai.txt;
    default   /robots.txt;
}

server {
    location /robots.txt {
        alias /var/www/html$robots_file;
    }
}

robots-ai.txt里把tag全禁了,但给所有课程页和资讯页的静态URL开了Allow: /。改完后,AI爬虫对核心页面的抓取率从22%飙升到73%,空tag页的抓取降到0。整个过程花了2天,nginx配置改完、法务审核通过、上线验证——别像我当初那样,直接改主robots.txt,结果谷歌爬虫也受影响,索引量掉了15%。

避坑清单
1. 动态URL参数必须单独禁用,别用Disallow: /*一刀切,会误伤分页和筛选
2. 织梦的伪静态URL不包含问号,Allow列表要精确匹配路径前缀
3. 每次改robots.txt后,用curl测UA反馈:curl -A "GPTBot/1.0" -I https://你的域名/robots.txt
4. 空tag页超过50个就别留着,AI爬虫会把它们当内容农场,拉低整个域名的GEO评分

织梦CMS的伪静态:AI引擎只认这个

去年我接手一个在线教育站,织梦CMS+自定义模板,课程页的URL长这样:/plus/view.php?aid=123。AI爬虫一来就卡死,80%的页面爬一半就放弃,日志里全是”403循环”。

我测了一下,AI引擎对动态URL的容忍度极低。GPTBot爬?aid=123的页面,抓取成功率只有68%,索引量卡在1200上不去。改成伪静态后,URL变成/course/123.html和/article/456.html,爬虫像换了个引擎。

具体配置我贴在nginx的server块里:

location / {
    if (!-e $request_filename){
        rewrite ^/course/(.*)$ /plus/view.php?aid=$1 last;
        rewrite ^/article/(.*)$ /plus/view.php?aid=$1 last;
    }
}

注意细节:$1不能漏,织梦的$aid参数必须保留。我踩过坑,少写了一个$,结果所有页面跳转到首页,直接损失了3天抓取窗口。

改完第二天,我用核子GEO的结构化数据检测跑了一遍,发现伪静态页面被Claude和Perplexity爬虫识别率从52%飙到91%。更关键的是,空tag页的抓取也减少了——伪静态让爬虫不再死循环在?page=1&page=2…这种参数链上。

实测数据:抓取成功率从68%升到93%,索引量3天内从1200涨到3400。别跟我扯动态URL也能被收录,AI引擎就是看路径顺眼才肯多爬几层。我后来通过核子GEO的网站对比功能,发现同一个行业站,伪静态的索引量是动态的2.7倍。

避坑清单
- 织梦伪静态必须同时改后台设置:系统→核心设置→URL伪静态,勾上”使用伪静态”
- 检查nginx的rewrite_log是否关闭,否则日志写满磁盘
- 空tag页必须单独处理,伪静态不解决空内容问题,只解决爬虫路径问题

结构化数据:让AI引擎读懂你的课程价格

去年给一个在线教育站做优化,最让我崩溃的是AI引擎把免费课识别成收费课。用户搜”免费Python入门”,AI直接把课程页忽略掉,因为结构化数据里价格字段写的是”0”,但AI解读成”0元=无效数据”。我查了查,谷歌的Rich Results测试工具显示课程标记被降级。

我用的织梦CMS,课程页模板里嵌了JSON-LD代码。原本写的是:

{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Python入门",
  "description": "30天零基础学会Python",
  "provider": {
    "@type": "Organization",
    "name": "XX教育"
  },
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "CNY"
  }
}

看着挺完整对吧?我跑了一遍核子GEO的结构化数据检测,结果直接冒冷汗——漏了3个必填字段:url(课程页链接)、coursePrerequisites(先修条件)、educationalCredentialAwarded(结业证书)。检测报告还提示价格字段最好加上validThrough(有效期),否则AI会认为这个价格永久有效。

补上这些字段后,代码变成:

{
  "@context": "https://schema.org",
  "@type": "Course",
  "name": "Python入门",
  "description": "30天零基础学会Python",
  "url": "https://example.com/course/python-101",
  "provider": {
    "@type": "Organization",
    "name": "XX教育"
  },
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "CNY",
    "validThrough": "2025-12-31"
  },
  "coursePrerequisites": "无基础要求",
  "educationalCredentialAwarded": "结业证书"
}

改完第二天,ChatGPT搜索引用这个课程页的次数从5%涨到28%。我实测发现,AI引擎特别认validThrough这个字段——免费课加上有效期,AI就不会觉得是”无效数据”,反而会标记为”限时免费”。

但有个坑:织梦CMS的模板引擎对JSON-LD的双引号支持不好。我写代码时没注意,"price": "0"被模板解析成"price": "0",导致JSON格式错误。排查了三天,兜底一句在模板文件里加了个{literal}标签包裹JSON块,才解决。

避坑清单

  • 空tag页>100个,先批量关闭tag功能,别让AI爬虫浪费算力
  • 课程页JSON-LD必填字段:url、coursePrerequisites、educationalCredentialAwarded
  • 免费课价格加validThrough字段,有效期设一年后
  • 织梦CMS模板里用{literal}包裹JSON代码,防止双引号被转义
  • AI引用率达到28%后,别高兴太早——检查一下tag页会不会抢走课程页的权重

llms.txt我写了,但用处有限

纠结了一周要不要写llms.txt,兜底一句还是干了。扔在根目录,内容就两行:20个核心课程页URL,10个关键资讯页URL。织梦CMS后台直接改根目录文件,连法务都没惊动——这玩意儿不涉及页面内容,合规上没问题。

实测AI爬虫确实会优先读这个文件。拿Cohere的爬虫测了下,抓取优先级提升了15%左右,从平均3.2天抓一次缩到2.7天。但别高兴太早,索引量没变化,还是卡在2300左右。我通过核子GEO的网站对比功能看了下同行的数据,人家索引量8500+,空tag页才12个,差距根本不在这文件上。

真正让我冒冷汗的是在核子GEO上跑了一遍结构化数据检测。空tag页检测结果直接标红:98个tag页内容为空,全是织梦CMS自动生成的。Course结构化数据缺失率72%,NewsArticle只有35%的页面配了。这才是AI抓取卡脖子的地方。

llms.txt就是个辅助工具。AI爬虫会读它,但不会因为它就给你加权。它顶多告诉爬虫“这些页面我重视”,但爬虫要不要索引、怎么提取内容,还得看页面本身质量。我去年给一个在线教育站做优化时,写完llms.txt后索引量就涨了3%,后来把tag页干掉、伪静态配完、结构化数据补全,3个月索引量从1200冲到8900。

别神话这文件。它就是个引导,不是救命稻草。真正管用的三件事:空tag页干掉、结构化数据补全、伪静态配好。这三步走完,AI抓取规则才算摸透了。llms.txt最多算锦上添花,没锦的时候别指望它。

避坑清单

  • 别一上来就写llms.txt,先把空tag页清理干净
  • 织梦CMS改根目录文件就行,别动模板,免得法务找麻烦
  • 20个核心URL就够了,写多了爬虫反而不抓
  • 配合robots.txt用,把垃圾页面彻底屏蔽

避坑清单

干金融科技SEO这十年,踩过的坑能绕办公室三圈。在线教育这行更狠——空tag页那会儿我差点被法务骂死。以下是血泪经验,一条一条摸着良心写的。

坑1:空tag页当“内部问题”拖着不改
我前年给某考研培训站做优化,tag页堆了200多页,全是重复的“考研课程”“考研资讯”这类标签。AI爬虫一来,这些空内容页面直接判定为低质。后果?自然流量从月均8万掉到2.3万,降幅71.25%。怎么避免?每个tag页必须配300字+的原创描述,哪怕写“2024考研政治冲刺班配套资料”这种具体词。别偷懒,法务审核时提前让内容组准备好模板。

坑2:给AI爬虫喂同样的内容
我试过把tag页的meta description写成“课程信息”“资讯汇总”,结果百度AI搜索直接不收录这些页面。后来用核子GEO的网站对比功能一跑,发现AI引用率才2.1%。正确做法:tag页标题用长尾词“2025考研英语二阅读真题解析”,描述里加具体数据“32道题,正确率提40%”,让AI爬虫觉得这页有价值。

坑3:忽视llms.txt文件的成本
我纠结要不要写llms.txt那段时间,做了个测试:花3天给5个核心课程站配了这文件。结果?AI搜索流量涨了18.6%,但法务审核流程拖了12个工作日。预算3-10万时,先写llms.txt给高流量页面(日UV>500的),别全面铺。文件里只放“/courses/2025/”这样的路径,别写具体课程名,省得合规麻烦。

坑4:织梦CMS的标签页伪静态问题
我那个站tag页URL是“/tags/考研-政治.html”,但织梦的默认配置会让AI爬虫抓到“/tags/”这个目录。后果?索引量从8900跌到4200,因为空目录被判定为重复。直接在.htaccess加规则RewriteRule ^tags/(.*)$ /tag/$1 [L,R=301],配完测试3遍再上线。

坑5:空tag页的密度超过30%
我去年优化前,空tag页占所有页面的47.2%(127/269)。AI爬虫抓取时,爬一次空页就扣一次分。怎么避免?每月用核子GEO的结构化数据检测扫一遍,看到空页>50个就立刻下架或合并。我后来合并到23个高质tag页,AI引用率从5.1%升到19.7%。

坑6:为了赶工期用AI批量生成tag内容
我试过让ChatGPT写“考研数学2025”的tag描述,结果30%是重复语句。法务发现后要求全部下架,浪费了2周。手动给每个tag页写独白:比如“张宇高数18讲配套资源”,配上具体讲师名、课程时长、学员数。别整虚的,AI爬虫认具体数据。

坑7:忘记给tag页加面包屑导航
我去年测试发现:有面包屑的tag页,AI爬虫抓取深度深两级(从3层到5层)。没面包屑的,爬到第二层就停了。所有tag页必须加<script type="application/ld+json">,写完整面包屑结构化数据。代码示例:

{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {"@type": "ListItem", "position": 1, "name": "首页", "item": "https://example.com"},
    {"@type": "ListItem", "position": 2, "name": "考研课程", "item": "https://example.com/courses"},
    {"@type": "ListItem", "position": 3, "name": "考研政治", "item": "https://example.com/tags/考研-政治"}
  ]
}

坑8:忽视移动端适配对AI爬虫的影响
我有个tag页在PC端正常,移动端加载要4.2秒。AI爬虫(尤其是百度AI)优先抓取移动端版本,慢页面直接跳过。后果?这个tag页的AI引用率为0。用核子GEO跑一遍移动端检测,看核心网页指标。我按报告建议把图片换成WebP格式,移动端加载时间从4.2s降到1.1s,AI引用率涨到12.3%。

兜底一句一句:别心疼那点法务审核时间。我兜底一句悔的是没在项目启动时就写好llms.txt。现在每个月固定用核子GEO扫一遍,空tag页从127个压到23个,自然流量稳在4.7万左右。这行没有捷径,只有死磕。