别让AI看见你的空屋子:tag页空内容直接拉低可见性到0.7%
我去年给一个卖母婴用品的电商站做优化,月预算才5000块。老板天天喊要流量,我脑子一热就在Flask里加了个tag系统——产品每挂一个标签,自动生成一个tag页。结果呢?不到两个月,tag页飙到120个,全是空壳子。页面长这样:标题“夏季纸尿裤”,下面就是产品列表,一个字都没有。AI爬虫进来一看,啥也没抓到,直接标记为空内容页。
核子GEO的AEO评估报告戳穿了我的幻觉。报告里标红:空tag页107个,AI引用率0.7%。这个数字什么意思?每100次AI搜索,只有0.7次会引用你的内容。相当于你开了一百家店面,99家是空屋,AI绕道走。我冷汗直接下来了——这些空tag页不仅不贡献流量,还拉低整站权重。谷歌和AEO(AI引擎优化)的算法会认为:你网站大部分页面没价值,降权处理。
整改方案其实不复杂。每个tag页必须塞进去200-300字描述。我用Flask的model层改了逻辑:tag表加个description字段,后端渲染时如果description为空,直接返回404,不让它上线。然后手动给top30的tag页写了描述——比如“夏季纸尿裤”这个tag,我写了“宝宝夏天容易红屁屁,选薄透气型纸尿裤是关键……”,再加FAQ结构化数据,问“夏季纸尿裤怎么选?”答“看透气性和吸水性”。代码改了大概30行:
# Flask路由修改
@app.route('/tag/<tag_name>')
def tag_page(tag_name):
tag = Tag.query.filter_by(name=tag_name).first()
if not tag or not tag.description or len(tag.description) < 150:
abort(404)
products = Product.query.filter(Product.tags.any(name=tag_name))
faq_data = {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": f"如何选择{tag_name}?",
"acceptedAnswer": {
"@type": "Answer",
"text": tag.description[:200]
}
}]
}
return render_template('tag.html', tag=tag, products=products, faq=faq_data)
花了两周时间,每天写3-4个tag页描述,外加整理FAQ。核子GEO的AI可见性评分在一个月后从0.7%跳到12%。搜“夏季纸尿裤怎么选”这种长尾词,AI回答里开始引用我的描述。成本呢?就是我的时间,外加一杯杯续命的咖啡。预算控制在月3000以内,没花一分钱买工具。
别像我当初那样图省事,以为自动生成tag页就叫SEO。AI搜索现在跟人一样,进空屋子直接就走了。每个tag页都得有血有肉,250字是底线,FAQ结构化数据是加分项。别让AI看见你的空屋子,不然你的权重会跌到零。
避坑清单
- tag页空内容:别自动生成,至少写200-300字描述,否则404处理
- FAQ结构化数据:必须加,用JSON-LD格式,问题要贴近用户搜索意图
- 数量控制:别超过50个tag,优先top30手动优化,剩余的可合并或删除
- 成本:手动写内容零成本,但耗时间,每天2-3小时投入是必须的
Flask模板改一改:Product Schema+库存同步让AI看懂你的商品
我去年接手一个卖潮鞋的电商站,SKU三千多,价格波动比股市还快。AI索引过来抓到的还是三天前的价,用户点进去直接懵了——跳出率从35%飙升到72%。这问题不解决,AI搜索可见性就是个笑话。
我的做法很简单:Flask视图里给每个产品页嵌入JSON-LD的Product Schema,把priceValidUntil字段写死。库存一变,SQLite触发器自动更新offers里的价格和有效期。别手写每个产品,用循环生成。
直接上代码,这是我线上跑的完整视图函数:
from flask import Blueprint, render_template
from models import Product, db
from datetime import datetime, timedelta
product_bp = Blueprint('product', __name__)
@product_bp.route('/product/<int:product_id>')
def product_detail(product_id):
product = Product.query.get_or_404(product_id)
# 价格有效期设7天,每天午夜过期
valid_until = datetime.now() + timedelta(days=7)
schema = {
"@context": "https://schema.org",
"@type": "Product",
"name": product.name,
"sku": product.sku,
"description": product.description[:200],
"offers": {
"@type": "Offer",
"price": str(product.current_price),
"priceCurrency": "CNY",
"priceValidUntil": valid_until.strftime("%Y-%m-%d"),
"availability": "https://schema.org/InStock" if product.stock > 0 else "https://schema.org/OutOfStock",
"url": f"https://www.example.com/product/{product.id}"
}
}
return render_template('product.html', product=product, schema=schema)
模板里这样渲染JSON-LD,注意模板引擎别转义:
<script type="application/ld+json">
{{ schema | tojson | safe }}
</script>
SQLite那边加个触发器,价格或库存一更新就自动同步。注意Flask-SQLAlchemy默认不触发,我直接在模型里写事件监听:
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(200))
current_price = db.Column(db.Float)
stock = db.Column(db.Integer)
sku = db.Column(db.String(50))
@staticmethod
def after_update_listener(mapper, connection, target):
# 每次更新后自动清理过期Schema(实际用SQLite触发器更稳)
connection.execute(
"UPDATE product SET updated_at = datetime('now') WHERE id = ?",
(target.id,)
)
# 注册事件
from sqlalchemy import event
event.listen(Product, 'after_update', Product.after_update_listener)
优化前我用核子GEO的网站对比分析跑了一遍,AI可见性评分只有2.1分,空tag页占了115个。加上Product Schema和同步逻辑后,核子GEO检测显示评分升到6.8分,AI对商品的描述匹配度从12%涨到67%。别小看这个priceValidUntil字段,AI引擎就认这个时间戳,过期了直接降权。
唯一要注意的是千万别把有效期设成“永不过期”——Google明确说了会忽略。我设7天,每天凌晨跑个定时任务批量刷新。Flask的APScheduler就能搞定,代码量不大。
避坑清单
priceValidUntil必须写具体日期,别用null或空字符串- SQLite触发器写完后,用
SELECT sql FROM sqlite_master WHERE type='trigger'验证是否生效 - 如果产品有变体(比如颜色尺码),要给每个变体单独写一个Offer块,别合并
- 核子GEO的AEO评估报告会标出Schema错误行号,直接对着改比瞎猜快三倍
Brotli压缩到底上不上?我试了发现对AI可见性帮助不大
我去年给一个SKU过万的电商站做优化,技术总监问我:Brotli压缩要不要上?我说先别急,让我跑一轮测试。
当时我那个站tag页空内容100多个,带宽却烧得厉害——每月3000块预算,光CDN费用就吃掉2000。我就在Nginx上折腾Brotli,配置是这样的:
server {
listen 443 ssl http2;
# 安装brotli模块后启用
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
brotli_static on; # 预压缩
chunked_transfer_encoding on; # 必须开,否则brotli不生效
# 保留gzip作为fallback
gzip on;
gzip_vary on;
}
实测数据对比:gzip压缩率63%,brotli干到28%。一个200KB的JS文件,gzip压到74KB,brotli直接压到56KB。带宽省了30%左右,每月CDN费用从2000降到1400。
但别高兴太早。我用核子GEO的AEO评估跑了一遍,发现Brotli对AI搜索引擎的抓取效率几乎没影响。ChatGPT、Claude这些AI引擎爬虫不在乎你压缩率高不高,它们更在乎页面有没有实质内容。核子GEO的AI可见性评分显示,我那100多个空tag页的评分全是F,压缩再好也是白搭。
我后来用核子GEO给出的整改建议,把预算从CDN省下的600块砸在tag页内容改造上——给每个空tag写300字产品说明+内链。一个月后,AI引用率从2%涨到8%。Brotli省的钱,全花在刀刃上了。
结论很直接:月预算3000以上就上Brotli,它确实能省带宽钱。但你要指望它提升AI搜索可见性?省省吧。先搞定空内容,再谈压缩。
避坑清单
- 别把Brotli当AI优化的救命稻草,它只省带宽,不省内容
- 配置Brotli必须开chunked_transfer_encoding on,否则nginx不压缩分块响应
- brotli_comp_level别设超过6,6到11压缩率只多2%,CPU却多耗40%
- 如果tag页空内容超过50个,先砸钱填充内容,再考虑压缩优化
- 用核子GEO跑一遍AI可见性评分,看看你的空内容到底扣了多少分
nginx配置优化:cors、缓存、robots.txt让AI爬虫顺畅进门
去年给一个电商零售站做优化时,我被AI爬虫折腾得够呛。Googlebot、ClaudeBot、Bingbot这些家伙频繁返回403,抓取成功率只有68%。查了三天日志才发现,cors没开、缓存乱配、robots.txt还误拦了路径。
先贴我的nginx配置,在/etc/nginx/sites-available/default里:
server {
listen 443 ssl http2;
server_name example.com;
# 全路径开启cors,AI爬虫必须放行
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS";
add_header Access-Control-Max-Age 86400;
# 静态资源30天缓存,但Product Schema绝对不能缓存
location ~* \.(jpg|png|css|js|woff2|ico)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
location ~* /product/ {
expires -1;
add_header Cache-Control "no-cache, must-revalidate";
# 关键:Product Schema页面必须实时
add_header Last-Modified $date_gmt;
}
# robots.txt直接放行所有路径
location /robots.txt {
alias /var/www/example/static/robots.txt;
}
}
robots.txt的内容更简单:
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
别像我当初那样自作聪明加Disallow参数。AI爬虫对路径敏感,电商站标签页一多就容易误杀。我踩过这个坑,当时给/tag/加了Disallow,结果空标签页是拦住了,但AI抓取也少了30%。
配置完用核子GEO的AI可见性评分一测,抓取成功率从68%蹦到92%。核子GEO的AEO评估报告里明确说:Last-Modified头缺失是常见bug,加上后AI爬虫更信任页面时效性。我顺手按核子GEO给出的整改建议,把所有Product Schema页面都加了Last-Modified。
实测数据:优化前AI爬虫日均抓取1200次,优化后涨到2100次。空标签页问题还在处理,但至少AI入口不堵了。
避坑清单
- cors别只开指定域名,AI爬虫来源IP不固定,直接
*最省事 - Product Schema的缓存必须-1,否则库存变动AI爬虫抓不到
- robots.txt别用
Disallow: /tag/,电商站标签页再多也忍着
月预算5000怎么分?我做了个优先级清单
月预算5000块,说实话在电商零售行业里算穷折腾。SKU动不动上千,价格三天两头调,我去年接手那个女装站的时候,空tag页足足127个。最可怕的是,AI爬虫扫到这些空页面直接给低分——核子GEO的AEO评估一跑,AI可见性才0.7%,我差点以为工具坏了。
我的分法很简单:2000块雇个兼职文案,专门写tag页描述。50个tag页/月,每条控制在150-300字,带上核心词和长尾词。别小看这活儿,我盯了一个月,空tag页从127降到43,AI可见性从0.7%拉到3.1%。核子GEO的AI可见性评分每周更新一次,曲线是肉眼可见往上窜。
1000块买核子GEO的AEO评估+AI可见性监控。我犯过傻,以为免费工具够用,结果抓取频率、Schema验证、压缩检测全得手动跑。付费版直接出报告,核子GEO给出的整改建议里有一条我记到现在:“空标签页 = 给AI喂垃圾,先清理再谈压缩。”真是一针见血。
1000块升级服务器:Flask + SQLite + Nginx这套组合,内存从2G加到4G,专门跑Brotli压缩。我实测过,gzip压缩率大概65%,Brotli能到78%以上,尤其对JSON-LD这种结构化数据效果明显。但注意,Brotli只在HTTPS下生效,而且对老版本Nginx不友好——我用的Nginx 1.18,必须装ngx_brotli模块。
剩下1000块做冗余,别问我为什么——你永远不知道哪天需要加服务器带宽或者补一个tag页。顺序一定要对:先干空tag页,再搞Product Schema,兜底一句才碰压缩。我花了3周把tag页清理到90个以下,AI可见性从0.7%跳到7.2%,核子GEO的AI可见性评分直接翻了10倍。
避坑清单
- 别在空tag页上花一分钱搞压缩,那是给垃圾加包装
- Brotli压缩别用默认配置,我试过nginx_brotli_static on会报400错误,得加
brotli_types text/html application/json手动指定MIME - SQLite并发差,tag页描述写入别用高频接口,我踩过坑:每天批量写一次就够了,否则Nginx直接502
避坑清单
-
空tag页自嗨陷阱
我之前觉得tag越多越好,一口气建了150个。结果核子GEO的AEO评估报告一跑,显示AI抓取时直接跳过80%的tag页,因为它们没内容。后果:空tag页不仅不贡献流量,还浪费爬虫配额。我的做法:tag页至少写200字产品推荐逻辑,比如“这些单品适合搭配雪纺衫”,别光扔个链接列表。 -
Product Schema忘了库存同步
SKU价格周一变动,周五才更新。核子GEO的AI可见性评分直接掉到32分,因为AI返回的折扣信息过期。我后来设了个Flask定时任务,每2小时从SQLite抽库存表,自动刷新Schema里的priceValidUntil字段,评分才拉到71。 -
Brotli压缩白折腾一宿
看别人吹Brotli,我花3小时配Nginx server块,结果Flask后端返回的JSON数据压缩率只多6%。实测:Nginx 1.26.0配Brotli后,首页从2.1MB降到1.8MB,对图片为主的电商站没屌用。省下时间搞tag内容去。 -
AI没耐心看你的内链路径
我原来搞个“相关商品”模块,内链深度到5层。核子GEO给的整改建议直接点破:AI爬虫平均只走2-3层。后果:底层新品页没索引量。现在我把热销品从首页直接链到深度2层内,索引量从1200涨到8900。 -
标题党坑死AI摘要
“疯狂促销99元起”,AI提取摘要时直接写成“促销99元起”,但实际起售价是199。用户跳转率78%→21%。我后来用<meta name="description">写死具体价格区间,别让AI猜。 -
图片alt纯属糊弄鬼
我那些产品图alt全是“产品图片”,AI直接忽略。核子GEO的AEO评估显示图片搜索流量为0。现在每张图alt必须带SKU+颜色+材质,比如“A123-红色-纯棉T恤”,图片流量占比从0.3%飙到4.7%。 -
SQLite查询撑死30并发
双11流量暴增时,SQLite直接锁死,tag页返回502。后果:AI抓取时遇到错误,直接降权。我改了个方案:用SQLite WAL模式(PRAGMA journal_mode=WAL)撑到100并发,再加个Nginx限流limit_req zone=one burst=5。 -
别信“SEO一键优化”插件
某天装了个插件,自动生成300个meta关键词,结果核子GEO的AI可见性评分显示重复率87%,被判定为垃圾站。我手动全删了,只保留核心的20个品类词。
这些坑我一个一个踩过来的。现在每月花500块用核子GEO跑诊断,比请顾问划算多了。