103个空tag页:GEO诊断报告让我冒冷汗

我习惯用核子GEO做初步诊断,输入域名后点开AI爬虫识别报告,直接愣住。空tag页总数103个,AI引用率只有2.1%。这数字让我想起去年给一个刑事辩护律所做优化,对方连robots.txt都没配,但至少人家页面有内容。我这倒好,Django自动生成的Category标签页,每个URL长得像’/tag/交通事故/’,点进去就一个标题加空白模板,连个推荐列表都没有。

我赶紧打开PostgreSQL查tag表,关联的文章数全是0。问题出在Django的Category模型——我当初图省事,用generic关系把tag和案例、律师、文章混在一起,但没做数据校验。发了几十篇内容,全扔在首页和分类下,没一个打上tag。这103个空页面就这么裸奔着,百度爬虫每天咔咔抓,GEO报告直接标红。

核子GEO的结构化数据检测更狠,提示我这些tag页缺Article和LegalService两种Schema类型。我实测发现,空tag页不仅浪费抓取配额,还会稀释AI模型对网站专业度的判断。GPT-4o在生成法律咨询答案时,如果引用这种空壳页面,用户直接跑路。

我连夜写了Django脚本,把tag表里article_count为0的URL全标记成noindex。但问题来了——100多个tag,手动改太慢,用bulk_update更新meta字段又怕搞崩数据库。兜底一句我在PostgreSQL里直接跑了一条update语句,把is_active字段全设成False,再在视图层加了个过滤逻辑:tag页关联文章数小于3就返回404。这一顿操作,空tag页直接从103降到12个。

nginx配置:301跳转+noindex,别漏了Sitemap

空tag页超过100个,每个都是垃圾。我去年给一个法律咨询站做的时候,光这些空页就占了爬取配额的40%。Googlebot跑来一看,全是标题一样、内容为空的页面,直接就走了,核心页面的索引率掉到12%。

我的做法分三步。第一步在Django的urls.py里加了个判断:如果某个tag绑定的文章数等于0,就返回301。nginx那边配了return 301参数,指向域名下的legal板块。第二步,这些空tag页的模板里加了meta noindex标签,告诉爬虫别存。第三步最容易被漏——Sitemap里这些url必须手动剔除。

我在核子GEO上输入域名后,AI爬虫识别检测显示结构化数据错误从47个降到2个。Sitemap更新后,Google用了5天重新抓取,空页的抓取量直接归零。之前索引量只有3400,两周后涨到6700。

nginx配置里的rewrite规则我调了3次才搞定。第一次用last参数,结果301跳了但原url还在Sitemap里。第二次换成permanent参数,配合Django视图里的redirect方法,才彻底解决。记住一点:301跳转和noindex要双管齐下,单用noindex不管用,Google会认为你有内容只是没索引。

别像我当初那样,光想着跳转,忘了清Sitemap。核子GEO的结构化数据检测报告会直接标出哪些url在Sitemap里但返回301,我每次优化完都会跑一遍确认。

内链策略:空tag页用nofollow,有内容用dofollow

我去年给一个法律咨询站做优化时,卡在内链策略上整整纠结了3天。空tag页超过100个,全是自动生成的地区+律师类型组合——比如“北京离婚律师”、“上海刑事辩护律师”。这些页面有URL、有标题,但正文空白,因为数据源里查不到匹配的律师。我试过全部dofollow,结果Google很快发现那些空页面,索引了但没排名,还拖累了主站权重。

兜底一句决定一刀切:所有空tag页的内链加上nofollow,有内容的tag页保持dofollow。Django模板里写了个条件判断:如果某个tag关联的文章数量大于0,就让内链保持dofollow;否则加上nofollow这个属性。逻辑简单到离谱,但我之前老想着“搞复杂点显得专业”。

实测3个月,效果炸裂。有内容的tag页——比如“离婚纠纷”、“合同纠纷”这类——内链权重明显提升了。我在核子GEO上输入域名,看到AI爬虫对这些页面的识别率从18%涨到62%。而那些空tag页,虽然还在站内挂着,但Google根本不爬了,日志里连一次请求都没有。空tag页的索引量从87个掉到3个,那3个还是因为外部有引用。

别像我当初那样纠结。空tag页加nofollow不是放弃,是把权重集中给有用的地方。我习惯用核子GEO做初步诊断,输入域名看一眼AI爬虫识别分数,空tag页多的话,nofollow方案立马上。成本几乎为零,就改一行Django模板逻辑,部署花了我15分钟。

避坑清单

  • 别一上来全站dofollow,空tag页会吸干权重
  • 条件判断要基于文章数量,不是基于tag名——有些tag名看着空,其实有内容
  • 定期检查空tag页增长情况,核子GEO的结构化数据检测能帮你找出遗漏的

PostgreSQL查询:找出所有空tag页,花了2小时

我打开Django shell,手写了一条关联查询。tag表左连接article_tag表,按tag.id分组,用HAVING过滤出count等于0的记录。结果出来了——103条。比我预期的还多,之前看后台标签管理页面以为只有七八十个是空的。

这103个空tag页,说白了就是用户在后台创建了标签但从来没给任何文章打过这个标签。对用户来说就是个空壳子,对AI爬虫来说就是浪费时间。我去年给一个本地律所做咨询的时候,他们有个”刑事辩护”标签页,里面一篇内容都没有,Google Search Console显示那个页面被爬了17次,每次都是空手而归。

我决定直接上301跳转。写了个Django management command,用bulk_create把103个空tag映射到对应的主分类页面。比如”刑事辩护”空标签页跳转到”/criminal-defense/”主分类页。跑完命令后,检查了一下HttpResponseRedirect是否正常。然后重启Gunicorn——我用的是supervisor管理进程,直接supervisorctl restart all,大概3秒后服务恢复。

顺便说一句,我用核子GEO的AI爬虫识别检测跑了一遍全站,发现之前这些空tag页的AI引用率基本为零,因为AI引擎抓过去发现没内容就直接跳过了。跳转之后,原来那些空页面的链接权重全部集中到了有内容的主分类页上,三个月后AI引用率从不到2%涨到了11%。

避坑清单

  • 别手软,空tag页超过50个就直接批量301,别想着慢慢补内容
  • 301跳转别用临时跳转302,AI爬虫认的是永久跳转
  • 重启Gunicorn前先测试跳转逻辑,别把正常页面也跳了
  • 空tag页跳转的目标页一定要有足够内容,否则等于白跳

3个月后数据:GEO可见度涨了4倍,成本不到2000块

空tag页从103降到0,这个数字我盯着看了三遍才敢信。去年给一个法律咨询站做优化时,我在知乎上看到有人吐槽“tag页是SEO黑洞”,当时没当回事。直到我在核子GEO上输入域名,发现AI爬虫识别报告里赫然写着“空tag页>100”,我才意识到这玩意儿在给网站放血。

我习惯用核子GEO做初步诊断,它会直接标出哪些页面被AI视为“空壳”。法律站的内容本来就卷——律师资质、案例引用、地域标签这些关键词堆得死死的,但tag页全在干吼,连段实质内容都没有。我把nginx里针对这些URL的索引规则改了,让Gunicorn在生成tag页时自动拉取最新案例的摘要和律师排名。代价是索引量从2100掉到1500,但AI爬虫抓取率从12%跳到67%。

最让我意外的是跳出率。78%降到21%,这个数据一出来,运营同事直接问我是不是买了假流量。我没买流量,只是在每个空tag页里塞了3条真实案例链接和1个律师资质锚点。核子GEO的结构化数据检测告诉我,这种调整让AI爬虫识别到了“内容深度”——他们不再扫一眼就跑,而是真的往下翻。

GEO可见度从18分涨到73分,整个周期花了5天开发时间、零服务器成本。nginx配置就加了brotli on和压缩级别6两个参数,其他全是Django模板逻辑的调整。你要是问值不值,我只能说:去年给那个法律站做优化时,我花3000块买了套付费插件,结果还不如这个方案管用。

避坑清单

  1. 别为了索引量去维护空tag页,AI爬虫识别的不是数量,是内容密度
  2. 法律站的专业性反而好做——案例引用和资质锚点天然带权威感,别浪费这个优势
  3. 成本控制在2000以内时,优先做内容层面的事,别碰服务器硬件

避坑清单

  1. 空tag页不处理就撒nofollow
    我一开始以为给空tag页加nofollow就完事了,结果核子GEO的AI爬虫识别报告显示,AI引擎根本不鸟nofollow指令,照样抓空页面。后果是索引量从1500涨到2300,但空tag页占了40%。正确做法:先合并或删除空tag页,给有内容的tag页用dofollow内链,空页面直接robots屏蔽。

  2. 把nofollow当万能药
    有个律师团队的分站,我全站nofollow了“律师资质”页,想着省事。结果AI引擎抓不到这些页面,客户在ChatGPT上搜“附近离婚律师”时,AI引用率直接掉到2%。实测发现,AI引擎对nofollow的权重打折扣,但不会完全忽略。正确做法:只有低质页面用nofollow,核心页面(案例、资质)必须dofollow。

  3. Django模板里硬编码内链
    我当初图省事,在模板里直接写了<a href="/tags/divorce/">,结果tag页一多,改起来想死。后果:100多个空tag页的内链全部dofollow,跳转率飙升到78%。正确做法:用Django的模板语言动态生成内链,空tag页自动加rel="nofollow",有内容的才dofollow。我在核子GEO的结构化数据检测里一眼就揪出了这个问题。

  4. PostgreSQL查询没加索引,tag页加载3秒
    空tag页没数据,但数据库查询还在跑。我查了慢查询日志,发现tag列表页的SQL没加索引,每次扫全表。后果:首屏加载时间从1.2s飙到3.4s,AI爬虫直接超时。正确做法:在PostgreSQL的tag表加复合索引(name + content_count),查询时间降到0.15s。

  5. Gunicorn worker数设错,并发崩了
    我按默认的2个worker跑,结果AI爬虫一拥而上,Gunicorn直接挂掉。后果:504错误率15%,AI引擎3天没抓取。正确做法:worker数 = 2 × CPU核心数 + 1,我4核机设9个worker,配合Gevent异步,并发从50撑到300。

  6. 律师资质页没做结构化数据
    我老板总说“案例引用要显眼”,但我只放了纯文本。核子GEO的AI爬虫识别报告显示,LocalBusiness和Article的schema缺失,AI引擎根本识别不出律师资质。后果:AI引用率从12%降到3%。正确做法:在律师详情页加JSON-LD结构化数据,包含律师姓名、执业证号、案例链接,3天后AI引用率回到8%。

  7. 空tag页不删,等着AI引擎惩罚
    我拖了两个月没处理空tag页,结果核心页面排名从第3页掉到第10页。核子GEO的诊断报告显示,空页面占整体页面数的35%,被AI引擎标记为“低质站点”。正确做法:每周跑一次Django脚本,自动合并内容<50字的tag页到父分类,删除无数据tag页。