ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

网页重要性评分模型:SEO四层指标与权重算法实操

网页重要性评分模型:SEO四层指标与权重算法实操

1. 先厘清「网页重要性」到底指什么

做SEO的人几乎都会遇到同一个尴尬场面:老板或者产品经理丢过来一句「我们站有三千个页面,你排个优先级出来」,你打开后台,看到一堆曝光、点击、排名、外链数据,却发现这些数字互相打架——曝光高的页面没转化,转化好的页面没流量,老页面外链一堆但内容已经过时,新页面内容扎实但一点数据都没有。这时候如果只靠感觉拍板,排出来的优先级表基本等于许愿清单。

我理解的「衡量一个网页的重要性」,本质上是在回答一个资源分配问题:在人力、预算、抓取配额都有限的前提下,站内这几千上万个URL,哪些值得优先改写、优先加内链、优先做结构化、优先投放推广资源。所以网页重要性不是学术意义上的「权威度排名」,而是一个可计算、可复现、能支撑决策的排序结果。

这套东西适合三类人看:一是刚接手站点优化、手里只有后台导出表的新人,需要一套不至于跑偏的框架;二是做了几年、习惯凭经验判断的老手,可以拿来校准自己的直觉;三是负责内容排期的运营同学,需要一套能跟SEO对齐的语言。文中给的指标口径、权重算法和代码片段都可以直接改参数套用,数据源换成你自己站点的即可。

需要提前说明一点:我自己在实操里从不追求「一个绝对正确的分数」,只追求「排序稳定且能被解释」。分数本身会随数据更新波动,但只要同一批页面在不同月份的排序不大幅跳动,这套模型就是可用的;一旦出现某页面从上个月的20名冲到第1名,我第一反应不是窃喜,而是去查数据是不是出了问题。

2. 衡量体系的整体设计与思路拆解

2.1 为什么单一指标一定会失真

先说最常见的三种「单指标思维」,以及它们各自会翻车在哪。

第一种是只看流量。用点击量或者曝光量排序,结果往往是资讯类、热点类页面霸榜,而真正带来询盘的产品参数页、报价页、对比页排在后面。这类页面搜索量小,但搜索意图极其明确,一个访问的商业价值抵得上几十个泛流量访问。只按流量排序,会把预算全砸在「看着热闹」的页面上。

第二种是只看外链。外链数量作为重要性信号确实有效,但它是历史的沉淀,带有强烈的路径依赖。老页面躺着几十条外链,哪怕内容早就该重写了,分数依然很高;新做的、结构更清晰的页面因为没有外链积累,永远排不上号。更麻烦的是,外链数据在第三方工具里通常有几个月延迟,用它做月度决策等于用后视镜开车。

第三种是只看站内结构。按点击深度、内链数量排序,逻辑干净、数据好拿,但它衡量的是「你希望搜索引擎认为谁重要」,而不是「用户真的需要谁」。我曾经见过一个站点,把页脚的公司简介链接当成高重要性页面,因为它是全站每个页面都链过去的——这种由模板产生的链接如果不剔除,整个模型直接废掉。

所以我在设计这套体系时定的第一条原则是:至少覆盖结构、需求、行为、商业四个互不重叠的维度,任何一个维度单独拿出来都不足以定论,但四个维度同时指向同一个页面时,这个页面的优先级基本没有争议。

2.2 分层设计:把「重要性」拆成四个可采集的层

拆层的目的不是把事情搞复杂,而是让每个指标都能对应到明确的数据来源和明确的业务含义。我一般是这么分的:

结构层回答「站点自己怎么表态」。包括页面在站点层级中的位置(首页一级栏目还是五级深层)、有效内链入链数、是否出现在主导航或面包屑、是否在站点地图中、被搜索引擎抓取的频次。这一层的数据全部来自站内,可控性最强,也最容易被模板链接污染,需要重点清洗。

需求层回答「市场有多想要这个页面」。包括目标关键词的搜索需求规模、页面在搜索结果中的曝光量、平均排名位置、点击率、以及搜索结果页上出现的特殊模块(比如是否有图片区、问答区、视频区)。这一层是判断「值不值得投入」的关键,因为一个排在20名开外但曝光基数很大的页面,优化空间远大于一个稳定第1名但月搜索量只有几十的页面。

行为层回答「用户进来之后认不认」。包括停留时长、滚动深度、跳出情况、站内二次点击、回访比例。这一层的坑最多,因为不同页面类型的行为基线完全不同——工具页天然停留短,长文页天然停留长,拿同一把尺子量所有页面,结论一定是错的。我的做法是按页面模板分组,组内做归一化,不做全站横向比较。

商业层回答「这个页面离钱有多近」。包括转化次数、表单提交、询盘、加购、成交金额、毛利贡献。这一层的数据往往不在SEO手里,需要跟数据团队或者业务系统对接,但恰恰是这一层让SEO的优先级表能跟业务方对话。没有商业层的排序,你在评审会上很难说服任何人。

四层之间不是简单相加的关系。我的经验是:结构层决定「下限」(一个结构上被判死刑的页面,内容再好也很难排上去),需求层决定「天花板」(需求规模决定了这个页面的最大可能收益),行为层决定「当前效率」,商业层决定「值不值得破例」。比如某些页面行为数据很差、需求也不大,但商业价值极高(比如退换货政策页、企业采购流程页),这种页面我会手动给它一个「保护权重」,不让它被模型排到末尾去。

2.3 权重怎么定:别用拍脑袋的百分比

权重设计是这套体系里最容易变成玄学的地方。我见过直接写「结构30%、内容30%、流量40%」的方案,问为什么是30,答不上来。虽然最终权重多少带点主观,但至少要有推导过程,让别人能质疑、能修改。

我常用两种方法,按团队成熟度选:

方法一:两两比较打分(适合小团队快速落地)。把四个维度两两对比,谁更重要给2分,一样重要给1分,不重要给0分,最后按总分归一化。比如结构对需求,我认为需求更重要给2;结构对行为,结构稍重要给2;结构对商业,商业更重要给0;需求对行为给2;需求对商业给1;行为对商业给0。汇总后结构4分、需求5分、行为3分、商业4分,总分16,得到权重0.25、0.31、0.19、0.25。这套方法粗糙但快,而且因为是自己打分,后面调整起来没有心理负担。

方法二:用结果反推权重(适合有历史数据的站点)。拿过去半年已经做过优化的页面做样本,记录优化前后的流量或转化变化,用简单的线性回归拟合各维度指标对「优化收益」的解释力,回归系数归一化后就是权重。这个方法更硬,但需要至少50到100个样本,且要控制住外部变量(比如同期算法更新、季节波动),小站点做不了。

不管是哪种方法,有几个原则我一直在守:权重之和必须是1,任何一个维度不得超过0.4(超过就意味着其他维度形同虚设);权重每季度复核一次,业务阶段变化了权重就该变(比如新站期结构权重可以调高,成熟期商业权重调高);权重表要写进文档并且版本化,不然后面没人说得清去年那份优先级表是怎么算出来的。

2.4 评分表长什么样:一份可以直接照抄的字段清单

把上面的思路落成表格,大概是这样。这张表我会放在一个共享文档里,每次跑完数据直接输出一版,附上计算日期和数据口径说明。

层级指标数据来源归一化方式初始权重
结构有效内链入链数(剔除导航和页脚)自建爬虫 / 站内链接表对数压缩后 min-max0.10
结构点击深度爬虫抓取层级反向 min-max0.08
结构是否在主导航 / 栏目页站点配置0 / 0.5 / 1 分档0.07
需求目标词月搜索需求关键词工具对数压缩后 min-max0.12
需求曝光量站长平台对数压缩后 min-max0.10
需求点击率相对位置站长平台组内百分位0.09
行为停留时长(模板内相对值)前端埋点组内百分位0.10
行为滚动深度或阅读完成率前端埋点组内百分位0.08
行为站内二次点击率前端埋点组内百分位0.07
商业转化次数业务系统对数压缩后 min-max0.10
商业单次转化价值业务系统分档赋值0.09

注意这里每个子指标的权重先给定,四个层级的权重由子指标相加得出,这样调整起来只需要动子项,层级权重自动跟着变。我在实际使用中会把这张表分成「基础版」和「进阶版」:基础版只留七八个字段,适合刚起步、数据不全的站点;进阶版加上页面新鲜度、内容覆盖子问题数、结构化数据完整度这些,适合内容量大的站点。

3. 核心指标的计算细节与实操要点

3.1 内链权重怎么算:从链接图里挖出「站点自己认为重要的页面」

内链是结构层里最硬的信号,但直接用「入链数量」排序会出大问题——导航、页脚、侧边栏这些模板链接会让每个页面都平等地获得几百条入链,真正有区分度的正文内链被淹没了。所以第一步永远是剔除模板链接。

我的做法是给每条链接打两个标记:is_template(是否来自公共模板区域)和is_nofollow(是否被禁止传递权重)。公共模板的判定方式很土但有效:如果某个链接出现在超过80%的页面上,基本可以判定为模板链接。用SQL跑一遍就能筛出来:

-- 统计每条链接在多少个页面上出现,占比过高的视为模板链接 SELECT target_url, COUNT(DISTINCT source_url) AS src_cnt, COUNT(DISTINCT source_url) * 1.0 / (SELECT COUNT(*) FROM pages) AS coverage FROM internal_links GROUP BY target_url HAVING coverage < 0.8 ORDER BY src_cnt DESC;

筛完之后,剩下的就是正文内链。这时候再算入链数才有意义。但入链数本身是个长尾分布,头部页面几百条,尾部页面0到1条,直接做 min-max 归一化会把所有尾部页面压成0,失去区分度。所以要先做对数压缩:log(1 + in_links),再做 min-max。这一步很关键,我见过太多人跳过这步,结果模型对中长尾页面完全失效。

更严谨一点,可以算页面级别的链接权重传递,也就是大家常说的链接图迭代。原理不复杂:一个页面把权重平均分给它链出去的页面,迭代若干轮后收敛。自己实现一个简化版大概二十行:

def simple_pagerank(edges, n_pages, damping=0.85, iters=30): """edges: [(source, target), ...],返回每个页面的权重分""" out_deg = {} in_edges = {} for s, t in edges: out_deg[s] = out_deg.get(s, 0) + 1 in_edges.setdefault(t, []).append(s) score = {i: 1.0 / n_pages for i in range(n_pages)} for _ in range(iters): new_score = {} for i in range(n_pages): incoming = sum( score[s] / out_deg[s] for s in in_edges.get(i, []) if out_deg.get(s, 0) > 0 ) new_score[i] = (1 - damping) / n_pages + damping * incoming score = new_score return score

这段代码适合页面量在几万以内的站点,跑起来几十秒。页面量大的话建议用稀疏矩阵或者直接交给图计算库。实测下来,这个分数跟「人工判断哪个栏目页更重要」的吻合度相当高,因为它天然惩罚了那些「只进不出」的孤岛页面——只被链、不往外链的页面,权重传递会断掉,这跟真实站点的结构问题是对得上的。

注意:算出来的分数不要直接拿去跟别站比。每个站点的链接图规模不同,分数绝对值没有意义,只在站内做相对排序。

3.2 曝光和排名数据怎么用:需求层的三个陷阱

站长平台导出的曝光、点击、排名数据,是需求层最省事的数据源,但直接拿来用会踩三个坑。

第一个坑是曝光口径包含了大量无关展现。有些页面因为标题里带了一个高频词,在完全不相关的搜索结果里也拿到了曝光,这些曝光数很好看,但点击率极低,属于噪音。我的处理方式是给曝光加一个「相关性过滤」:只统计目标关键词命中的那部分曝光,或者用点击率做反向筛选,把点击率低于同组中位数三分之一的页面标记为「疑似无关展现」,在计算时降权。

第二个坑是平均排名会掩盖分布。一个页面平均排名8.3,可能是稳定第8名,也可能是第3名和第14名各占一半——后者的优化空间完全不同。所以我会额外拉一版排名分布,看落在前三页、第二页、第三页以后的比例,只有「有相当比例曝光落在第2页」的页面,才是短期最值得投入的优化对象。这类页面通常离首页只差一步,改个标题、补一段内容、加几条内链,位置就可能翻上去。

第三个坑是点击率不能跨页面比较。品牌词的点击率天然高,信息类词的点击率天然低,长尾词可能只有零点几个百分点却已经是正常水平。我一般按「词类型 × 排名区间」分组,组内算百分位,再拿百分位进模型。这样处理之后,一个点击率0.8%的长尾词页面,可能在它那一组里排在前20%,而一个点击率5%的品牌词页面反而排在组内中游,这个结论跟直觉是对得上的。

需求层还有一个隐藏价值:它能帮你识别「有需求但站内没有对应页面」的空白区。我习惯把关键词库和站内URL做一次匹配,匹配不上的词单独拉一张表,这张表往往比优化老页面更有价值——因为它对应的是新增内容的机会,而不是存量修补。

3.3 行为数据怎么用才不冤枉页面:分组归一化是底线

行为数据是四个层里最容易误伤页面的。工具类页面停留30秒很正常,一篇三千字长文停留3分钟也算正常,但如果全站混在一起排序,长文页永远赢,工具页永远输,最后模型会得出「应该多做长文少做工具」的荒谬结论。

我的处理流程固定三步:

第一步,按模板分组。把全站页面按模板打标签,比如文章页、产品详情页、列表页、工具页、政策页。分组之后,同一个组内的页面才具有可比性。

第二步,组内做百分位。每个指标在组内计算百分位分数,0到1之间,这样不同指标的量纲就统一了,而且天然抗异常值——一个页面停留时长异常长(比如用户开着标签页去吃饭了),在百分位体系里最多也就是1分,不会把整个分布带歪。

第三步,设置最小样本量。访问量太小的页面行为数据不可靠,比如一个月只有20次访问的页面,停留时长波动极大。这类页面我直接给行为层赋一个组内中位数,不参与百分位排序,避免小样本噪音污染排序结果。

import pandas as pd # df 需包含:url, template, pv, avg_dwell, scroll_rate, second_click df = df[df["pv"] >= 100].copy() # 过滤小样本 df["dwell_pct"] = df.groupby("template")["avg_dwell"].rank(pct=True) df["scroll_pct"] = df.groupby("template")["scroll_rate"].rank(pct=True) df["click2_pct"] = df.groupby("template")["second_click"].rank(pct=True) df["behavior_score"] = ( df["dwell_pct"] * 0.4 + df["scroll_pct"] * 0.3 + df["click2_pct"] * 0.3 )

这段代码很短,但解决的是核心问题:让不同模板的页面在同一把尺子下被公平比较。跑完之后你会发现,很多你以为「用户不喜欢」的页面,其实只是在错误的组里被比较了。

提示:行为数据的采集一定要在优化动作之前完成埋点并留下基线,否则事后无法归因。我踩过这个坑——优化了三个月才想起来看停留时长,结果发现没有基线数据,等于白干。

3.4 商业价值怎么量化:把「重要」翻译成「值钱」

商业层是让SEO主导权变强的关键。没有这一层,优先级表在业务评审会上就是一张技术报告;有了这一层,它就变成了资源申请书。

落地方式取决于站点的转化路径。电商类站点相对简单,直接取订单数据按落地页归因即可,注意要区分「直接成交」和「辅助成交」——有些页面用户看了三四个才下单,它自己不产生订单但影响决策,这种页面如果只看直接成交会被严重低估。我的处理是给辅助转化的页面按「参与路径次数」折算一个系数,通常取直接成交价值的0.3到0.5。

线索类站点(比如B端服务)麻烦一点,因为转化是表单提交,质量差异很大。我的做法是让销售团队给线索打质量标签,高意向、中意向、无效,然后按加权计算页面价值:高意向算1,中意向算0.3,无效算0。这样算出来的页面价值,比单纯统计表单提交数靠谱得多。

内容类站点最麻烦,因为没有直接成交。这时候我会用替代指标:注册转化、内容订阅、页面广告收益(按页面PV和RPM折算)、以及站内搜索关键词的商业价值(如果这个页面被大量站内搜索命中,说明用户明确需要它)。虽然不如直接成交精确,但至少有一个可比的货币化数值,能进模型。

我这里要强调一个观点:商业层的数据不需要绝对精确,只需要相对顺序正确。一个页面的转化价值算成12块还是15块不重要,重要的是它能区分出「价值几十块」和「价值几百块」两个档位。为了追求精确而放弃整个模型,是本末倒置。

4. 完整实操:给一个站点跑一遍重要性评分

4.1 数据采集与清洗:先把脏数据挡在门外

假设手上是一个内容站,页面量在八千左右,有站长平台数据、前端埋点、以及一个历史积累的链接表。整个流程我拆成五步走。

第一步是拉全量URL清单。从站点地图、爬虫抓取结果、服务器日志三条路各拉一份,做并集。只信站点地图不行,会因为配置漏掉页面;只信爬虫也不行,孤立页面永远抓不到。三份并集之后,通常能比站点地图多出百分之五到十的页面,这部分往往就是被遗忘的「孤儿页」。

第二步是拉结构数据。用自建爬虫或者站点地图导出,拿到每个页面的抓取层级、内链入链数、是否在导航中。这一步的关键是剔除模板链接,方法上一节说过了。

第三步是拉需求和行为数据。站长平台导出按页面聚合的曝光、点击、排名,埋点系统导出停留、滚动、二次点击。这一步要注意时间窗口对齐——所有数据都取最近完整自然月,不要一个取30天一个取90天,否则同比根本对不上。

第四步是拉商业数据。按落地页聚合转化次数和转化价值,跟前面的页面清单做左连接。匹配不上的页面转化填0,但不能简单填0了事,要区分「确实没有转化」和「因为归因缺失导致没匹配上」,后者我一般标记出来单独处理。

第五步是数据清洗。这一步最枯燥也最重要,通常要处理掉这些问题:URL 参数导致同一页面重复计数、大小写不一致、结尾斜杠不统一、分页页面被误当成独立页面、测试页面混进正式清单。我习惯写一个清洗脚本,把所有规范化规则集中在一处,每次跑数自动执行,避免手工操作遗漏。

import re from urllib.parse import urlparse def normalize_url(u: str) -> str: u = u.strip().lower() p = urlparse(u) path = re.sub(r"/+", "/", p.path).rstrip("/") or "/" return f"{p.scheme}://{p.netloc}{path}" df["url_clean"] = df["url"].map(normalize_url) df = df.drop_duplicates(subset=["url_clean"], keep="first")

这段代码看着简单,但在八千个页面的清单上,光这一步就能合并掉几百条重复记录。合并之后做聚合,不会出现同一个页面两条记录、分数被拆成两半的情况。

4.2 算分:归一化、加权、输出

清洗完的数据进入算分环节。我习惯把所有指标先统一到0到1之间,再加权求和。归一化方式按指标分布特点选择:

  • 长尾分布指标(内链数、曝光量、转化次数):先log1p再 min-max,避免头部页面把分布拉爆。
  • 有明确方向的指标(点击深度、加载时间):反向 min-max,数值越小分越高。
  • 分档指标(是否在导航、是否有结构化数据):直接映射成 0、0.5、1。
  • 行为类指标:用上一节的组内百分位。
import numpy as np def norm_log_minmax(s): x = np.log1p(s.fillna(0).clip(lower=0)) return (x - x.min()) / (x.max() - x.min() + 1e-9) def norm_reverse(s): x = s.fillna(s.median()) return (x.max() - x) / (x.max() - x.min() + 1e-9) df["s_link"] = norm_log_minmax(df["in_links_valid"]) df["s_depth"] = norm_reverse(df["crawl_depth"]) df["s_nav"] = df["in_nav"].map({True: 1.0, False: 0.0}).fillna(0) df["s_demand"] = norm_log_minmax(df["impressions"]) df["s_ctr"] = df.groupby("kw_type")["ctr"].rank(pct=True) df["s_biz"] = norm_log_minmax(df["conv_value"]) W = { "s_link": 0.10, "s_depth": 0.08, "s_nav": 0.07, "s_demand": 0.12, "s_ctr": 0.09, "behavior_score": 0.25, "s_biz": 0.29, } df["final_score"] = sum(df[k].fillna(0) * w for k, w in W.items()) df["rank"] = df["final_score"].rank(ascending=False, method="min").astype(int)

跑完这一步,你会得到一张带分数的表。但不要直接按分数排序就交付,还有两件事要做。

第一件是分层抽样校验。从排名前50、50到200、200以后各抽10个页面,人工看一遍,判断分数跟直觉是否一致。如果发现某个明显应该靠前的页面排在很后面,去查它哪个指标拖了后腿,往往是数据问题而不是判断问题。我做过七八次这样的校验,几乎每次都能揪出一两个数据口径错误。

第二件是做敏感性分析。把权重上下浮动20%,看头部50名的排序变化有多大。如果某个页面在权重微调后就从前10掉到100名开外,说明它的分数高度依赖单一指标,这种页面在交付时要单独标注,提示「排序不稳定,建议人工复核」。实测下来,真正稳定的高价值页面,在权重怎么调都稳在前列。

4.3 结果怎么解读:分数只是起点,动作才是目的

分数出来的下一步是转化成动作清单。我一般按分数分四档,每档配不同的处理策略:

分数档位页面特征建议动作投入节奏
前10%结构好、需求大、商业价值高重点维护,补内链、做结构化、定期更新每月复盘一次
10%–30%有需求但结构偏弱,或有结构无转化优化标题描述、补充内容、加导航入口每季度集中处理
30%–60%长尾页面,需求分散合并同类内容、做聚合页半年一次批量处理
后40%低需求、低转化、结构孤立评估是否下线、合并或设置规范化按季度清理

这里有个反直觉的经验:后40%的清理,收益往往比优化前10%更大。原因很实际——大量低质量页面会稀释站点的整体质量信号,也会浪费抓取资源。我做过一次对比,某站点清理了约1200个低价值页面之后,剩下的核心页面平均收录速度和排名都有可感知的提升。当然清理要谨慎,先做规范化或者设置跳转,观察一个月再决定是否彻底移除,别一上来就批量删。

另外,分数表要跟业务方共享,但不要共享分数本身,共享分档结果和对应的动作建议。业务方看到「0.734分」没有感觉,看到「这个页面属于第一档,建议每月维护一次」才知道要配合什么。沟通口径的统一,比模型精度重要得多。

5. 常见问题与排查技巧实录

5.1 数据口径类问题:八成错误出在这里

问题一:曝光和点击对不上。站长平台的曝光统计和埋点的PV统计差了三四倍,很多人第一反应是数据不准。实际情况通常是口径差异:曝光统计的是搜索结果页展现次数,一次访问可能在多个关键词下各算一次曝光;PV统计的是页面被打开的次数,同一用户刷新也算。这两个数本来就不该相等。我的处理是只用其中一个作为需求层指标,不做交叉验证,避免自我怀疑。

问题二:内链数量虚高。模型跑出来发现首页入链数三万条,其他页面只有个位数,归一化之后其他页面全变成0。这就是模板链接没剔干净。排查方法:随机抽五个页面的HTML,搜一下那些高分链接是不是出现在导航或页脚里。如果超过一半是,说明链接表根本没做模板标记。

问题三:转化数据匹配率低。商业层数据连上来之后,只有20%的页面能匹配到转化,其余全是0。这时候不要急着把0填进去跑,先看归因逻辑——很多站点的转化归因只记最后一次点击,导致中间环节的页面全部丢数据。改成「首次点击 + 末次点击」双归因,匹配率通常能提到60%以上。

问题四:同一个页面在清单里出现多次。带参数的URL、不同大小写、结尾斜杠差异,都会导致重复。跑之前务必做URL规范化,跑之后再检查一遍是否有重复的title或者重复的正文指纹。

5.2 模型类问题:分数看起来合理,其实不能用

问题一:新页面永远排不上。新页面没有外链、没有历史行为数据、商业数据也是0,四个维度全输,分数自然垫底。这不是模型错了,是模型缺了「潜力和时效」维度。我的解决办法是给上线90天内的页面加一个「新页面保护系数」,把它的最终分数乘以1.2到1.5,或者单独建一张新页面清单,用内容完整度、目标词需求、结构位置三个指标单独排序,不走全量模型。

问题二:分数通胀。每次跑完都有一批页面接近1分,看起来都完美。这通常是归一化方式的问题——min-max 对极值敏感,如果有个页面内链数特别夸张,其他页面都会被压到接近0,反过来如果所有页面都差不多,又会被拉开。解决办法是把 min-max 换成百分位排名,分布更均匀,也更抗极值。

问题三:排序月度大幅波动。这个月排第5,下个月掉到第80,再过一个月又回到第10。先查数据量和数据延迟,很多波动来自数据本身不稳定而不是页面变化。如果排除数据问题后仍然大幅波动,说明权重设计有问题——某个指标权重过高且波动大,需要降低它的权重或者做平滑处理(比如取三个月移动平均)。

问题四:行为和商业指标互相矛盾。有的页面用户停留很久但转化极低,有的页面停留很短但转化高。这时候不要强行调权重让它们统一,而是分开看:停留长转化低,通常是内容吸引力够但转化路径有阻碍(按钮不明显、表单太长、价格不透明);停留短转化高,通常是决策路径短、意图明确(比如直接搜型号来比价)。这两类页面都应该排在前面,只是后续动作不同。

5.3 落地类问题:模型对了,推不动

问题一:没人认这个分数。最典型的情况是SEO自己算得很开心,内容和产品完全不买账。根源在于模型用了太多他们看不懂的指标。我的做法是输出两套视图:一套给SEO内部看,指标齐全;一套给业务方看,只保留「流量潜力、商业价值、维护成本」三个维度,用高/中/低三档表达。同一份数据,两种语言。

问题二:优化了但没效果。优先级排出来了,内容也改了,三个月过去排名没动。这时候要回查两件事:一是这个页面的问题到底是不是内容问题(有些页面是技术问题,比如渲染、加载、规范化,改内容当然没用);二是优化动作有没有覆盖真正的瓶颈(模型告诉你这个页面结构分低,但你只改了正文,内链一条没加,那分数涨了排名也不会动)。我的习惯是在动作清单里明确写「本次优化针对哪个指标」,事后按指标复盘,而不是只看最终排名。

问题三:模型维护成本过高。一开始设计了二十个指标,跑了两个月发现数据更新要花三天,最后没人愿意跑。这几乎是所有自建模型的通病。我的建议是从七个指标起步,跑顺了再逐步加,宁可粗糙但能持续,也不要精致但跑一次就废。

下面这张表是我这几年踩坑总结出来的速查清单,遇到问题可以先对照着看:

现象最可能的原因快速验证方法处理方式
头部页面分数异常高模板链接未剔除抽查HTML中高分链接位置加模板标记后重算
中长尾页面分数全为0未做对数压缩看指标分布直方图log1p 后归一化
新页面全垫底缺少时效维度看前50名中有无90天内页面加保护系数或单独排序
月度排序剧烈波动单指标权重过高权重±20%敏感性测试降权或做移动平均
转化匹配率低于30%归因模型单一对比不同归因方式结果改双归因或路径归因
行为指标误伤工具页未按模板分组按模板看指标中位数组内百分位归一化
业务方不认可排序指标过于技术化问对方看得懂哪几个输出简化三档视图

除了上面这些,还有两个我个人很在意但很少被提到的细节。

一个是指标的时间衰减。外链、历史流量这些指标反映的是过去,而页面重要性是要指导未来的。对于内容型站点,我会给指标的统计窗口加一个衰减系数,越久远的数据权重越低,比如最近30天权重0.5,30到90天0.3,90天以上0.2。这样模型对近期变化的响应会更灵敏。

另一个是人工干预的留痕。任何手动调整分数的操作,都要记录调整人、调整原因、调整幅度。我见过一个站点,三个人各自手动改过权重,最后没人说得清某页面为什么排第一,模型彻底失去可信度。留痕不是为了追责,是为了让模型能持续演进——半年后回看这些干预记录,你会发现自己当初的很多判断是对的,也有很多是错的,这正是权重校准的最好素材。

6. 我在这套体系上的一些实际体会

这套评分模型我从最早的三四个指标,慢慢迭代到现在十来个字段,中间推翻重来过两次。第一次推翻是因为发现分数跟转化完全对不上,查下来是商业层数据根本没接进来,模型在优化「看起来重要」而不是「真的重要」的页面;第二次推翻是因为维护成本太高,指标太多导致没人愿意每月跑,最后变成一份躺在共享盘里的过期表格。这两次教训让我确定了一件事:能持续跑起来的粗糙模型,价值远高于跑不起来的精密模型。

如果让我给刚开始搭这套东西的人一句建议,那就是先把「结构层 + 需求层」这六个指标跑通,用两三个月时间验证排序结果跟实际优化效果的相关性,再逐步加行为层和商业层。别一上来就追求全维度覆盖,数据没准备好,加进去的维度只会变成噪音。

还有个小技巧值得分享:每次跑完分数,不妨把排名前20和最后20的页面各打印出来贴在显示器旁边,看一个月。你会对「什么页面在这个站真的重要」形成非常具体的直觉,这种直觉在数据缺失或者指标打架的时候,比任何模型都管用。模型是给团队用的,直觉是给自己用的,两者都需要养。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进