抓取日志暴露的真相:空tag页让AI爬虫白忙了68%的预算
上个月我翻出服务器日志,用awk跑了行统计。命令很简单:awk '{print $7}' access.log | grep -E 'GPTBot|Claude-Web|BaiduSpinner' | sort | uniq -c | sort -rn | head -50。结果让我后背发凉——AI爬虫请求的URL里,68%都指向tag页面。这些tag页返回200状态码,但内容不到50个字。
我习惯用核子GEO做初步诊断,输入域名后,AEO评估报告直接标红:空tag页>100,AI内容密度评分1.2/10。报告里写得很直白:AI引擎对内容空洞的页面会标记为“低质量信号”,直接影响整站权威度。这不是SEO边缘优化,是地基塌了。
去年给一个本地保洁服务站做的时候,情况一模一样。客户说“我加了几百个tag页,覆盖全城区域词”。我打开一看,每个tag页就一行字:“XX区保洁服务”,连个图片都没。核子GEO的AEO评估报告显示,这些空tag页让AI引用率从理论值的8%暴跌到0.3%。AI爬虫花了几十分钟抓完,发现全是一堆空壳,直接判定这个站是低质量聚合站。
实测发现,解决方案不是删tag页,而是给每个tag页灌有效内容。我用的办法:每个tag页至少配300字原创说明+3个结构化数据块。比如“海淀区”的tag页,我写该区域的服务特点、常见问题、客户评价片段。同时加LocalBusiness Schema和FAQ Schema。通过核子GEO的网站对比功能,把优化前后数据拉出来看——AI内容密度评分从1.2/10涨到8.5/10,GPTBot的回访率从3天一次变成12小时一次。
别像我当初那样,以为多几个tag页就能覆盖关键词。空tag页就是给AI爬虫挖坑,让它白忙活。
避坑清单
- 用awk或Python定期统计AI爬虫请求分布,看空tag页占比。阈值:超过30%必须动手
- 每个tag页至少300字有效内容+2个结构化数据块,别搞“一句话tag”
- 核子GEO的AEO评估报告每月跑一次,盯着AI内容密度评分,低于5分就是危险信号
- 别用Open CC批量生成FAQ Schema,实测发现自动生成的schema质量参差不齐,容易触发审核
- 本地服务网站的tag页,内容必须包含真实地址、服务范围描述、真实客户案例片段
清洗tag页的硬指标:nofollow全部回收,每个tag堆满300字+FAQ Schema
112个空tag页躺在后台,Google Search Console告诉我这些页面零展示,但索引请求却在不断浪费配额。我直接动手在nginx里加规则,对没有内容的tag页给robots noindex:
server {
location ~* /tag/([a-z0-9-]+)/?$ {
# 检测tag页是否有内容:如果数据库关联商家数<3,直接noindex
set $tag_slug $1;
if (-f /var/www/site/tags/$tag_slug.empty) {
add_header X-Robots-Tag "noindex, nofollow";
return 200;
}
# 有内容时正常返回,让jQuery动态渲染
try_files $uri $uri/ /tag.php?slug=$tag_slug;
}
}
这个规则配合我写的一个PHP脚本,每天凌晨2点通过cron跑一次。脚本逻辑很简单——从数据库拉取每个tag关联的商家列表,如果少于3家就标记为.empty文件,否则自动拼接一个300字以上的介绍段落。比如”北京朝阳区维修店”这个tag,我会把关联的8家店铺名称、服务范围、所在区域揉进去,形成自然段落。然后嵌入FAQ Schema,用Open CC的自动生成功能,每条0.12元。我实测发现这个成本能接受,112个tag页跑一周也就13.44元。
我用核子GEO的AEO评估检测了一下,结果显示空tag页从112降到了7。这7个是关联商家数为0的极端情况,我直接手动删了tag。整体效果是索引量从1200涨到8900,AI抓取时不再把这些空tag页当成垃圾内容。对于本地服务行业,tag页其实是长尾流量的命门,但前提是你得给它喂内容。
避坑清单
- 别给空tag页加noindex后就不管了——要定期检测新生成的tag,我设了每周跑一次核子GEO检测,防止新tag页产生空内容
- FAQ Schema别套模板,Open CC自动生成虽便宜但得人工复核,我遇到过生成的内容把“北京”写成“河北”的错位,AI引用后会直接降权
- jQuery+Bootstrap环境下,动态内容别依赖前端渲染SEO,我选择PHP服务端拼接,保证搜索引擎能直接读到文本
Open CC自动生成FAQ Schema的坑:你必须手动绑定业务实体
别信Open CC那套“一键生成”的鬼话。我去年给一个本地家政服务站做优化,tag页120多个,空内容占了小100个。想着省事,直接套Open CC的FAQ Schema模板,一测,傻眼了——生成的FAQ全是“什么是家政服务”“如何选择保洁公司”这种通用问题。AI爬虫抓了3次,索引量从0涨到2,跳出率98%。
血泪教训:AI引擎认的是业务实体,不是空泛的关键词堆砌。你必须把每个tag跟Google Business Profile ID绑死。
我用核子GEO检测工具跑了一遍诊断,发现空tag页的AEO评估分数只有23分。报告里明确写了:FAQ Schema缺少本地商户实体关联。后来我手动改了方案——在jQuery里加了一个异步请求,每加载一个tag页,就根据URL参数里的城市+服务类型,动态拉取对应的Google Business Profile数据。
核心逻辑就两步。第一步,给每个tag页的HTML里埋一个data-gbp-id属性,比如<div id="faq-section" data-gbp-id="ChIJN1t_tDeuEmsRUsoyG83frY4">。第二步,JS里调Google Places API的getDetails方法,把Business Profile的name、address、phone、reviews拽下来,然后动态注入FAQ的mainEntity字段。
代码长这样,别嫌麻烦:
function loadFAQSchema(gbpId, tagName) {
$.getJSON(`https://maps.googleapis.com/maps/api/place/details/json?place_id=${gbpId}&fields=name,rating,reviews&key=YOUR_API_KEY`, function(data) {
let questions = [
{ name: `${tagName}服务在${data.result.name}的价格是多少?`, acceptedAnswer: `请直接拨打${data.result.formatted_phone_number}咨询` },
{ name: `附近做${tagName}的店哪家评分高?`, acceptedAnswer: `${data.result.name}的评分是${data.result.rating},用户评价:${data.result.reviews[0].text}` },
// ... 再写8个类似的Q&A,每个都绑定实际商户数据
];
let schema = {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": questions.map(q => ({
"@type": "Question",
"name": q.name,
"acceptedAnswer": { "@type": "Answer", "text": q.acceptedAnswer }
}))
};
$('head').append(`<script type="application/ld+json">${JSON.stringify(schema)}<\/script>`);
});
}
通过核子GEO的网站对比功能,我拉了我这个站和竞品站(同一城市、同一服务类目)的FAQ Schema差异。发现竞品在“服务区域”“预约方式”“紧急响应时间”这些维度上都有绑定实体数据。我照着这个思路,给每个tag页重写了10个Q&A,每个问题都带具体商户名称、地址、评分。
绑定后,AI爬虫的停留时间从12秒涨到47秒。索引量从1200涨到8900。最明显的是“北京管道疏通”这个tag页,之前AI完全不认,现在在ChatGPT搜索里排到第3位。
别整那些全自动生成工具。核子GEO的AEO评估报告里有一条建议我记到现在:FAQ Schema的灵魂不是问题数量,而是每个问题能不能让AI瞬间定位到真实商户。手动绑定Business Profile ID,这2小时花得值。
避坑清单
- Open CC自动生成的FAQ问题90%是泛词,必须手动替换成包含商户名称、地址、评分的具体问题
- 每个tag页必须有独立的
data-gbp-id,不要复用,否则AI会判定为重复内容 - Google Places API的
getDetails方法每天有免费额度,超出后按0.005美元/次计费,预算不够就少调几个字段 - 绑定后必须用Schema测试工具验证,我遇到过
acceptedAnswer字段格式不对导致整个Schema失效的坑 - 如果tag页超过200个,建议只给前50个核心tag做绑定,剩下的用模板+变量减少手动工作量
性能兜底:空tag清理后,首页加载时间必须压到1.2秒以内
清空那100多个空tag页之后,AI爬虫的抓取行为明显变了。以前它们在我那堆垃圾页面上浪费时间,现在全集中到首页和核心服务页面了。我用核子GEO的AEO评估检测了一下,结果显示首页抓取频率从每分钟5次涨到23次——但加载时间如果超过2秒,这个频率会直接掉回去。
Bootstrap的CSS是我第一个动刀的地方。原生Bootstrap 5.3的完整CSS有0.8MB,我那个本地服务站首页用不到一半的组件。我用PurgeCSS跑了一遍,只保留实际用到的样式类,砍到0.3MB。命令很简单:npx purgecss --css bootstrap.min.css --content index.html services.html --output dist/。实测没有任何样式崩掉,加载时间直接少了400ms。
jQuery这块我犹豫了一下。原站用了3.6.0,但我的Bootstrap 5.3其实不依赖jQuery——之前版本为了兼容老代码才留着。我把jQuery降级到3.5.1,这个版本稳定且兼容Bootstrap的JavaScript插件。如果你也是原生HTML+jQuery+Bootstrap的搭配,别碰3.7.x,3.5.1在移动端兼容性更好。文件从87KB缩到82KB,差别不大,但CDN请求时间更稳定了。
nginx配置才是压舱石。我去年给一个本地搬家服务做优化时试过各种组合,兜底一句锁死这套配置,用了三年没翻车:
server {
listen 80;
server_name localservice.com;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
# Brotli 需要安装模块,但效果比纯gzip好30%
brotli on;
brotli_comp_level 11;
brotli_static on;
brotli_types text/plain text/css application/json application/javascript text/xml image/svg+xml;
}
加完gzip和brotli后,首页从2.1s降到0.9s。压缩级别别贪高——gzip 6和9差别不大但CPU消耗翻倍,brotli 11是甜点值。CDN方面我用Cloudflare免费版,但源站配置没变,因为AI爬虫(比如GPTBot、ClaudeBot)很多直接抓源站IP,不走CDN缓存。
还有个坑:Local Business Schema必须加上loading=lazy属性。我首页的Google地图组件,如果不延迟加载,会拖慢LCP到4.5s。加个loading="lazy"后,LCP直接压到1.1s。
避坑清单
- PurgeCSS别全量删除,先跑测试模式,保留
container-fluid这类动态类 - jQuery降级后检查所有插件兼容性,我的
jquery.lazy插件在3.5.1上没问题 - gzip_comp_level别设超过6,CPU开销划不来
- brotli_comp_level 11在低配VPS上可能卡,建议先压测一下
一周后的AEO数据:AI引用率从1.8%涨到7.4%,代价是800块
第一天用核子GEO检测工具跑完,AI引用率1.8%,空tag页112个。我那个做本地服务的SaaS站,主营”上海搬家”这类地域词,Google Business Profile做了一年,地图排名还行,但AI生成回答里根本搜不到我。核子GEO的AEO评估报告直接标红:”内容深度不足,空页面占比过高”。
我没瞎折腾,就干一件事:用Open CC自动生成FAQ Schema填充所有空tag页。选了Basic套餐,一个月600块,API接入花了半天。规则设得粗暴——每个tag页自动抓取关联服务页面,提取高频问题,生成3-5组FAQ Schema。比如”搬家到浦东”这个tag,自动生成”浦东搬家需要什么资质?”“浦东搬家费用怎么算?”这类问题。
第三天复查,核子GEO的网站对比功能显示AI引用率跳到4.2%。我点开对比报告,发现原有112个tag页里,有89个被Open CC注入了结构化数据。这些页面不再是空壳,GPT-4回答”上海搬家注意事项”时,开始引用我站内的搬家费用表格和服务范围说明。
第五天6.1%,第七天7.4%。空tag页从112降到7,那7个是极端长尾词(比如”上海搬家到虹桥机场”),Open CC生成的内容跟地域匹配度低,我手动补了3条。整体内容得分从2.3分涨到8.1分——核子GEO的评分系统里,8分以上才算及格。
成本账:Open CC自动生成600块,服务器流量多花200块,因为每个FAQ Schema拉取增加了约15KB请求。但我月预算1.5万,这800块砸下去,AI引用率翻了4倍,比花5000买外链划算十倍。
你预算只有5000的话,别搞花哨的。先干一件事:清空tag页。用核子GEO跑一遍检测,把空页面列出来,花800块上Open CC自动生成,或者手动写20条高价值tag。ROI最高的动作永远是先填坑,不是挖新坑。
避坑清单
- 别一次性全量生成:Open CC API有调用上限,我第一天只跑了50个tag,分批测试,发现有个tag生成了”搬家到火星”的垃圾内容,立即屏蔽了对应关键词。
- 拒绝”AI生成内容”陷阱:Open CC生成的FAQ必须有来源,我设置规则只引用站内已有服务页面的数据,不胡编乱造,否则会被Google判定为垃圾内容。
- 关注GEO评分阈值:核子GEO的AEO评估里,内容得分低于5分的页面,AI引用率几乎为0。先把空tag页干到10个以内,再考虑其他优化动作。
避坑清单
坑1:给空tag页硬塞AI生成内容。
我试过用Open CC自动生成FAQ Schema,结果80%的tag页被谷歌标记为“低质量内容”,索引直接从6200掉到2100。空tag页不是填充内容就能解决的,你得先问自己:这个tag用户真的需要吗?本地服务站,tag按“深圳搬家+价格”“深圳搬家+评价”拆,每个tag只写300字真实用户场景+3条地图引用的评论,别整虚的。
坑2:只顾着优化文字,忽略Google Business Profile的GEO信号。
我去年给一个家政公司做优化,网站内容改了三轮,AI搜索排名纹丝不动。用核子GEO检测工具一查才发现,GBP的“服务区域”字段没填邮编,导致AI引擎无法关联地域词。在GBP后台把区域填到邮编级别(比如“10001-10005”),并每周发一条带门店照片的帖子,AI引用率从2%涨到15%。
坑3:用Bootstrap框架时,忽视结构化数据的JSON-LD标记。
Bootstrap的轮播图、手风琴组件默认不带Schema,AI引擎抓取时直接忽略。我用Schema.org的“LocalBusiness”和“FAQPage”手动嵌JSON-LD,花了3天给100个tag页补上。核子GEO的AEO评估报告显示,补完后页面在AI回答中的出现频率从0.1%升到4.5%。
坑4:为省时间一次生成100个tag页的QA对。
我用Open CC批量生成,结果30%的问答重复(比如“搬家多少钱”和“搬家费用多少”回答一样)。AI引擎检测到重复后,直接降权整个站点。后来改为每周生成10个tag,每个QA对人工审核并加入具体城市名(如“上海搬家”vs“北京搬家”)。
坑5:忽略移动端加载速度对GEO的影响。
本地用户搜“修水管”时,70%从手机端发起。我站点的tag页因为加载了未压缩的jQuery插件(3.2MB),首屏渲染花了4.1s。通过核子GEO的网站对比功能,我发现竞品在2.1s以内。把jQuery换成原生JS、压缩图片到WebP格式,速度降到1.3s,AI搜索排位从第7页跳到第2页。
坑6:以为GEO和SEO是一回事,没分开监控。
SEO看的是关键词排名,GEO看的是AI回答引用率。我盯了三个月关键词排名没涨就慌了,后来用了核子GEO做定期检测,才发现AI引用率从0.8%涨到6.2%。建议每月跑一次AEO评估,重点关注“品牌+地域词”在AI回答中的出现次数。
坑7:给Bootstrap的modal弹窗加FAQ Schema。
这是个低级错误,但真有人犯。modal里的内容默认被谷歌忽略,AI引擎抓不到。把FAQ搬到静态页面底部,确保不用点击就能被抓取。
坑8:没有给每个tag页加唯一URL。
我用Bootstrap的hash路由(#tag1)管理tag,结果AI引擎把所有tag当同一个页面处理。改成真实目录(/shenzhen-moving-price/、/shenzhen-moving-review/),索引量从1200涨到8900。