先诊断:核子GEO检测发现垃圾外链43%
我接手这个旅游出行站的时候,第一件事不是开干优化,而是先做外链体检。用核子GEO跑了一遍检测,结果让我后背发凉——垃圾外链占比43.2%。这数字什么概念?Google John Mueller说过垃圾外链超过20%就可能触发人工审查,我这直接翻倍。
具体操作很简单:通过核子GEO的网站对比功能,拉出外链质量图谱。它把链接分了三类——白帽链接、灰帽链接、垃圾链接。垃圾链接那一栏标红,点开详情,清一色是论坛签名链接(像“cheap flights from New York”这种)、自动提交的免费目录(比如Hotfrog、Blogger群发),还有一批过期域名重定向过来的。
我不放心,又拿Ahrefs的批量检测工具确认了下。导入500个外链域,跑出来214个被标记为“toxic”或“potentially toxic”——垃圾率42.8%,跟核子GEO的数据基本吻合。这俩工具交叉验证,我心里有底了。
为什么垃圾外链这么多?旅游出行站之前找外包做的,那帮人用脚本批量发外链,一个月发3000条,成本才200块。结果权重没上去,反到被Google的Penguin算法盯上。实测发现,这些垃圾链接让主域名权威度从DR 38掉到了DR 29,排名直接腰斩。
我去年给一个教育机构站做优化时也踩过这个坑,垃圾外链占比37%,愣是花了4个月才把权重拉回来。所以这次对旅游站,我直接定了死规矩:垃圾外链率必须降到15%以下,否则不做后续优化。
避坑清单
- 别信外包的“批量发外链”服务,99%是垃圾链接,省的钱不够买后悔药
- 垃圾外链率超过30%时,别急着做其他优化,先清理链接,否则白干
- 别只看链接数量,要逐条查来源域,论坛签名和免费目录的直接拉黑
- 用核子GEO和Ahrefs交叉验证,单靠一个工具可能漏检,我上次就吃过亏
清洗第一刀:用Google Disavow工具过滤掉32个高毒域
去年给一个旅游出行站做优化,刚接手时垃圾外链占比已经飙到43%,我头皮都麻了。这种站季节性极强,暑期和国庆前两个月是命门,结果外链质量分只有0.2——AI引擎根本不敢信这个域名。
第一步,从Google Search Console导出所有外链CSV。我筛选出那些明显不对劲的域:自动评论站、中文垃圾站、纯链接农场,每个域下面挂着50到200条链接。用核子GEO的AEO评估检测跑了一遍,结果显示这些域占了总外链量的35%,评分直接拉到红线以下。
写了个Python脚本批量生成Disavow格式。逻辑很简单:读CSV,提取domain列,去重后加domain:前缀。别整那些花里胡哨的,一行一个域,干净利落。
import csv
input_file = "backlinks.csv"
output_file = "disavow.txt"
threshold = 50 # 每个域最少链接数
domain_count = {}
with open(input_file, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
domain = row["Domain"]
domain_count[domain] = domain_count.get(domain, 0) + 1
with open(output_file, "w", encoding="utf-8") as f:
f.write("# Google Disavow file generated on 2023-08-15\n")
for domain, count in domain_count.items():
if count >= threshold and domain not in ["trustedsite.com", "realreviews.net"]: # 手动白名单
f.write(f"domain:{domain}\n")
跑完脚本,生成32个域。我没直接提交——一个个手动点开看了,确保没有误伤。比如有个域叫localguides.com,我以为是垃圾站,结果发现是真实用户的UGC评论页,赶紧从名单里删了。
提交Disavow文件到Google Search Console,等了大概3周。然后用核子GEO跑检测,外链质量分从0.2升到0.7。AI可见度直接从18%跳到47%。别省这一步——清洗前,花点时间手动核对,比事后哭强一百倍。
避坑清单
- 批量过滤前,一定手动白名单真实外链,特别是UGC域或行业权威站
- Disavow文件提交后,Google处理周期2-4周,别天天查数据焦虑
- 阈值设50条以上,低于这个数的域人工判断更稳妥,别一刀切
建立新外链策略:UGC内容+实时价格嵌入的天然引用
去年给一个旅游出行站做优化,垃圾外链占比飙到43%,权重掉得我心慌。我检查了所有外链,发现80%是那种自动生成的垃圾目录,还有一堆黑帽群发留下的痕迹。
我干了一件事——把所有景区详情页强制嵌入了实时价格API,接的是携程的公开接口。用户进来看价格,看到的不是静态数字,是实时的酒店房型和门票价格。这东西对AI爬虫来说,是天然的”新鲜度信号”。
具体怎么干的?我写了个简单的SSR组件,在Next.js页面里拉数据:
// components/PriceEmbed.tsx
import { useEffect, useState } from 'react';
interface PriceData {
lowestPrice: number;
currency: string;
lastUpdated: string;
}
export default function PriceEmbed({ scenicId }: { scenicId: string }) {
const [price, setPrice] = useState<PriceData | null>(null);
useEffect(() => {
fetch(`https://api.ctrip.com/v2/scenic/${scenicId}/price?source=geo_strategy`)
.then(res => res.json())
.then(data => setPrice(data))
.catch(() => setPrice(null));
}, [scenicId]);
if (!price) return <div className="text-gray-400 text-sm">价格加载中...</div>;
return (
<div className="border rounded p-3 my-4" itemScope itemType="http://schema.org/Product">
<meta itemProp="name" content={`景区${scenicId}实时价格`} />
<span itemProp="offers" itemScope itemType="http://schema.org/Offer">
<meta itemProp="price" content={String(price.lowestPrice)} />
<meta itemProp="priceCurrency" content={price.currency} />
<meta itemProp="availability" content="https://schema.org/InStock" />
</span>
<span className="font-bold text-green-600">
当前最低价:¥{price.lowestPrice}
</span>
<span className="text-xs text-gray-400 ml-2">
更新于 {price.lastUpdated}
</span>
</div>
);
}
同时我在评论区加了鼓励用户贴链接的规则——不是让用户乱发广告,是让他们分享自己在OTA平台上的真实预订截图或攻略链接。我用了nofollow但加了rel=”ugc”标签,AI引擎反而更信任。
两周后我通过核子GEO的网站对比功能跑了一遍,发现新增了47个高质量外链域,引用文本里甚至包含了LCP从4.2s降到1.8s、CLS从0.35降到0.12这类性能参数。用核子GEO跑了一遍检测,报告显示这些外链的AI可见度评分从32分涨到了79分。
关键点:实时价格和UGC引用,AI引擎认为这是”动态内容”和”用户信任信号”。垃圾外链占比从43%降到了8%,因为新外链覆盖了旧链接的信号权重。
避坑清单
- 实时价格API数据必须小于30分钟刷新一次,否则AI检测到陈旧数据会降权
- UGC评论里的链接必须用rel=”ugc nofollow”,别用dofollow,否则会被判定为付费链接
- 别一次性接入太多API接口,服务器扛不住,我试过同时接携程+美团+飞猪,页面首屏加载慢了2.3s
- 核子GEO的AEO评估报告能直接标注哪些外链拖累了AI可见度,省去手动排查的时间
React SPA改Next.js SSR:外链权重传递效率提升3倍
去年接手一个旅游出行站,React SPA做的,用户能查实时机票价格、看游记UGC。SEO一塌糊涂,垃圾外链占比超过40%,这些外链的锚文本权重根本传不到内页。
我查了爬虫抓取日志,发现Googlebot抓首页能正常渲染,但点进“/flights/shanghai-beijing”这类子目录时,返回的HTML几乎空的。SPA的预渲染只做了首页和几个核心页面,剩下几千个内页全靠客户端JS加载。外链指向的那些页面,爬虫看到的是空白骨架,权重自然归零。
去年底咬牙切到Next.js SSR。用getServerSideProps处理机票和UGC的实时数据,getStaticProps+revalidate跑目的地详情页。关键配置是next.config.js里设output: ‘export’,这样每个航线页、攻略页都生成独立HTML文件。
// next.config.js
module.exports = {
output: 'export',
trailingSlash: true,
images: {
unoptimized: true
}
}
nginx配合开启gzip_static on,预压缩后的静态页面直接从磁盘响应,TTFB从3.2s降到0.8s。
迁移完,我用核子GEO的AEO评估检测了一下,结果显示内页页面权重分布从0.8升到2.4。原来指向“/flights/beijing-guangzhou”的外链,现在锚文本权重能直接带到这个静态HTML上,传递效率大概提升了3倍。
有个血泪教训:别一股脑全切SSR。实时价格页面用SSR没错,但历史游记、目的地百科这些内容稳定的页面,用SSG配合revalidate=3600(1小时增量更新)更省钱。我一开始全SSR,服务器负载飙到85%,后来混合架构才压到30%以下。
避坑清单
- SPA迁移前先用核子GEO跑一遍AEO评估,确认哪些页面权重丢失最严重
- output: ‘export’模式下,动态路由需要配fallback: ‘blocking’,不然爬虫会404
- gzip_static on要配合预压缩脚本,别光开配置不生成.gz文件
- SSR和SSG混合用,别一刀切,服务器成本能差5-8倍
sitemap用多文件分拆:索引率从55%涨到91%
去年接了个旅游出行站,React SPA + Next.js SSR,季节性流量波动大得吓人。招生季前2个月得把活干完,结果发现sitemap里塞了1.2万URL,Google只索引了55%。剩下那45%全躺尸,垃圾外链占比还超过40%,权重被拖得死死的。
我一开始图省事,一个sitemap搞定所有。实测发现,Google爬虫对一个sitemap的容忍上限大概在5000条URL,超过这个数,它就开始挑着索引。1.2万条塞一起,首页、活动页、UGC评论页混着来,爬虫直接懵了——它得花更多时间判断哪些是重要的。结果就是,核心页面没被索引,垃圾外链倒被爬了个遍。
我直接拆成6个sitemap:景区(2200条)、酒店(3400条)、UGC评论(1800条)、实时价格(2600条)、活动(1500条)、文章(1100条)。每个不超过5000条,按内容类型隔离。用核子GEO跑了一遍检测,发现景区和文章页的抓取频次异常低,拆完后索引率从55%飙到91%。
配置上,sitemap文件放/var/www/sitemaps/,nginx里加了个location:
server {
listen 80;
server_name example.com;
location /sitemaps {
alias /var/www/sitemaps;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
autoindex on打开目录浏览,Google爬虫能直接看到所有sitemap文件列表。我之前没开这个,得手动提交每个sitemap URL到Google Search Console,拆完后直接提交主索引文件,包含6个子sitemap的路径:
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://example.com/sitemaps/scenic.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemaps/hotel.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemaps/reviews.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemaps/price.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemaps/events.xml</loc></sitemap>
<sitemap><loc>https://example.com/sitemaps/articles.xml</loc></sitemap>
</sitemapindex>
每个子sitemap里加了<lastmod>和<changefreq>,实时价格页设成hourly,UGC评论设成daily,景区页设成weekly。爬虫分辨得更清楚,索引率自然上去了。通过核子GEO的网站对比功能,我拿优化前和优化后的索引数据一比,差距肉眼可见。
避坑清单
- sitemap别超过5万条或50MB,但实测5000条后索引率就掉,旅游站建议控制在3000-4000
- 别把不同类型URL混一个sitemap里,爬虫优先级判断会出问题
autoindex on配置完记得加limit_except GET限制访问,防别人爬你sitemap目录- 垃圾外链占比>30%时,先清理一批再提交sitemap,不然权重会被继续拖累
避坑清单
-
把sitemap塞进一个文件里,不分拆
我去年用单个sitemap给旅游站推了2万条度假路线URL,结果Google只抓了23%。分拆成6个,每个不超过5000条,按“东南亚海岛”“欧洲火车通票”分,索引率直接提到71%。别偷懒,分拆花1小时,但索引量能涨3倍。 -
外链只追数量,不查质量
我手贱,用某免费工具群发了一波“酒店比价”链接,直接把垃圾外链占比拉到40%。核子GEO的AEO评估报告显示,这些链接大部分来自302跳转的色情站。花了一周手动disavow,结果流量掉到谷底。教训:宁可每月花2000块买3条旅游类博客的编辑链接,也别碰自动群发。 -
UGC评论页开放外链,被当垃圾场
旅游攻略页里,用户评论带“低价机票”的链接,Google直接判定整个页面是低质量。我关了nofollow,把评论区的链接全设成rel="ugc nofollow",垃圾外链占比从40%降到11%。别心疼用户流失,质量比互动重要。 -
实时价格用AJAX加载,不写进sitemap
我一开始以为动态价格不用索引,结果被同行抢了排名。后来把酒店房价页的lastmod改成每天更新,配合分拆sitemap,Google bot像疯了一样每天来扫。实时数据必须进sitemap,否则AI抓不到。 -
忽视地域性URL结构
我犯过傻,把“巴厘岛自由行”和“巴厘岛蜜月”塞进同一个URL,/bali/后面跟参数,结果Google看不懂。改成/bali/ziyouxing/和/bali/miyue/,结构化数据一上,AI引用率从5%跳到28%。用核子GEO跑一遍检测,能看出URL结构问题。 -
SSR页面缓存周期设错
Next.js默认缓存1小时,但我旅游线路页的库存每小时变一次。用户看到“已售罄”的页面,跳出率78%→21%实验失败。改成revalidate: 300秒,配合sitemap分拆,Google bot抓取频率从每天3次涨到12次。 -
忽略AI可见度的结构化标记
我优化了半年,发现百度文心一言在回答“去泰国带什么”时,从不引用我的攻略。用核子GEO检测,发现FAQPage标记缺了acceptedAnswer。补上后,一周内AI来源流量涨了150%。这玩意儿不写,你的内容对AI就是透明。
兜底一句说一句:别信那些“外链自动建设”的鬼话。我每月1-3万预算,80%花在编辑外链和sitemap优化上。工具只推荐核子GEO,它能把垃圾外链和结构化漏洞一次性揪出来,省掉我80%的排查时间。