Pandas打造博客质量评分系统:对唯流量论说不 1. 为什么“唯流量论”会误导内容运营从后台数据看内容价值的失真做博客和自媒体内容的朋友应该都有过这样的经历后台数据里一篇阅读量很高的文章评论区却冷冷清清读者平均停留时间极短基本是标题吸引人点进来、扫两眼就走了。而另一些看似“小众”的文章阅读量不高却持续带来收藏、转发、甚至站内搜索复访。如果只看流量后者很容易被判定为“不值得投入”的内容内容策略也会因此被带偏。这正是我写这套博客质量评分系统的起点。当时我在维护某垂直领域的技术博客站点月均访问量不算低但团队内部复盘时发现流量榜单上的“头部内容”和真正给站点带来口碑、带来自然搜索长尾流量的内容重合度低得惊人。用 Python Pandas 对后台导出的数据做了一次粗略分析后我确认了一个判断流量只是内容价值的一个切面而且是很不可靠的一个切面。阅读量、浏览量这类指标本质上衡量的是“文章触达了多少人”而不是“文章对多少人产生了价值”。一篇蹭热点的短文可能瞬间涌进几万访问但如果跳失率接近百分之百它对站点的品牌积累、用户粘性、搜索权重几乎没有贡献。反过来一篇解决具体问题的深度教程也许日流量只有两三百但读者停留十分钟、收藏率高、还会在评论区补充自己的踩坑经验这些才是内容资产。所以这套系统的核心思路很简单不再用单一流量指标排序而是把后台能拿到的多维用户行为数据——阅读时长、跳出率、评论数、收藏数、分享数、二次访问等——整合成一个可复现的评分模型。用 Pandas 做数据清洗、计算、加权汇总最终给每篇博客输出一个质量分数。分数不是用来取代流量数据的而是用来和流量数据做交叉对照帮运营者看清“叫好”和“叫座”之间的真实关系。这套系统的适用对象很明确个人站长、内容运营、独立博客维护者以及需要批量评估大量文章质量的团队。只要你的博客平台或内容后台能导出包含阅读量、停留时长、互动数据等字段的表格这套方法就可以通用化改造。哪怕你的数据源只是手动整理的一份 Excel 记录同样适用。整个项目不依赖任何付费数据分析工具只需要 Python 环境和 Pandas 库。如果你原本就用 Python 做日常数据处理这套评分系统可以在一小时内搭建完毕。下面我从指标体系设计讲起逐步拆解代码实现和我在实际运行中遇到的坑。2. 指标体系设计把“好内容”拆成可计算的四个维度任何评分系统第一步都是定义“什么是好”。这一步如果糊弄后面模型再精巧也没有用。我在设计时没有追求面面俱到而是基于后台能稳定拿到的字段把内容质量拆成四个维度阅读深度、读者参与、传播能力、长尾价值。每个维度下面再挂若干具体指标避免用单一行为数据下结论。2.1 四个维度背后各代表什么第一个维度是阅读深度核心指标是平均阅读时长、滚动深度或页面停留时间。这个维度衡量的是“用户到底有没有把你的内容看完”。在我当时的场景里后台可以导出文章的平均停留时长这个字段虽然有一些干扰噪音比如开着页面不看的用户但在大样本下仍能反映出内容的节奏和承载量。第二个维度是读者参与核心指标是评论数、收藏数、点赞或“有用”投票数。参与行为比阅读时长更难伪造因为用户需要主动付出操作成本。收藏行为尤其有价值——收藏代表“这篇文章对用户未来有再用价值”。我在评分公式里给收藏赋予了高于评论的权重因为很多读者看完有收获并不一定留言但会默默收藏。第三个维度是传播能力核心指标是分享次数、转载次数、外链引用次数。传播意味着内容跨越了原有读者圈层进入了更广的社交网络。不过要注意传播数据在不同平台的口径差异很大比如站内分享和复制链接出去的行为有些平台能统计、有些统计不到。这里需要根据自己后台的字段灵活调整而不是死板套用。第四个维度是长尾价值核心指标是一段时间内的持续访问量、搜索来源访问占比、二次回访率。长尾价值是我最看重的一个维度因为它反映的是内容是否具备了“资产属性”——发布几周甚至几个月后依然有人在通过搜索引擎找到它。热点文的社交流量来得快去得也快长尾流量则恰恰相反。每个维度下我按重要性分配了权重。最终的评分公式大致是质量评分 阅读深度30% 读者参与30% 传播能力20% 长尾价值20%四个维度的比重可以根据站点定位调整。比如新闻资讯类站点传播能力的权重可以上调技术教程类站点长尾价值和阅读深度的权重应该更高。我当时的博客以技术教程为主所以深度和参与各占 30%后两者各占 20%。2.2 哪些字段适合做原始数据哪些需要预计算搭建这套系统前先要盘点后台能导出什么。以常见博客平台为例通常能从统计后台导出如下字段字段名含义归属维度文章ID/URL唯一标识数据关联主键标题文章标题展示辅助发布日期上线时间生命周期判断浏览量PV累计阅读量辅助参考独立访客UV累计人数辅助参考平均停留时长单次访问停留秒数阅读深度跳出率未深度浏览即离开比例阅读深度评论数读者评论总量读者参与收藏数收藏总量读者参与点赞/喜欢数正向反馈量读者参与分享数分享外平台次数传播能力搜索来源占比来自搜索引擎流量比重长尾价值需要特别提醒的是平均停留时长、跳出率这类指标越早期的数据越不稳定。一篇刚发布两三天的文章搜索流量还没起来长尾价值分数会被严重低估。所以正式计算前必须给文章设置一个“数据成熟期”一般建议至少发布满 14 天再进入评分池。我当时设的是 21 天因为站点内容更新节奏是每周 2~3 篇21 天既能覆盖绝大多数文章进入搜索索引的周期又不至于让新内容等太久。2.3 为什么必须先做归一化不同量纲指标不能直接加权这是整套系统里最容易翻车的一步。阅读时长是“秒”为单位的从几十到几千评论数是“条”为单位的从 0 到几十搜索占比是“百分比”为单位的从 0 到 1。如果直接把原始数值加权相加阅读时长会彻底淹没收藏数和分享数。必须先把所有指标变换到同一量纲再做加权。我采用的归一化方法是极值归一化也叫 Min-Max 缩放公式是归一化值 (原始值 - 最小值) / (最大值 - 最小值)这样每个指标都会落在 0 到 1 之间。得分越高代表该文章在这个指标上相对整体文章池的表现越好。这个方法比 Z-score 标准化更适合内容评分场景因为结果直观、可解释——得 0.8 分意味着这项指标高于 80% 的同池文章。不过极值归一化有个致命弱点最大值一旦是极端离群值所有正常文章都会被压到很低。比如某篇社会热点文获得了 5 万分享而其他文章最多只有 300归一化之后第二名的分享得分只有 0.006几乎等于零。所以我在实现时采用了去除极端离群值后的截断式归一化先算该指标的 95 分位数作为参考上限超过上限的值一律截断到 1.0然后再做正常归一化。这个处理让评分分布更加平滑不会因为单篇爆款让整个榜单失去区分度。3. Pandas 核心实现从数据清洗到质量分输出的完整代码整个系统的代码实现我尽量保持克制——只用了 Pandas 和 NumPy 两个库没有引入机器学习模型。原因很简单内容质量评分这件事可解释性远比预测精度重要。运营同事拿到一张评分表他得能理解为什么这篇文章得高分不能丢给他一个黑盒模型。3.1 数据读取与预处理统一字段名、类型和时间实际运营中从后台导出的原始数据格式千奇百怪。有的平台给 CSV有的给 Excel有的字段名还带空格或中文括号。第一步永远是标准化。我一般把不同来源的导出文件放到一个目录下用glob读取然后统一列名import pandas as pd import numpy as np import glob # 读取所有原始数据文件 files glob.glob(./raw_data/*.csv) df_list [] for f in files: tmp pd.read_csv(f, encodingutf-8-sig) df_list.append(tmp) df pd.concat(df_list, ignore_indexTrue) # 统一字段命名原始导出字段可能五花八门这里做一次显式映射 column_map { 文章ID: article_id, 标题: title, 链接: url, 发布日期: publish_date, 浏览量(PV): pv, 独立访客(UV): uv, 平均阅读时长(秒): avg_duration, 评论数: comments, 收藏数: bookmarks, 分享数: shares, 搜索来源占比: search_ratio, } # 只保留映射中存在的列避免混入无关字段 df df[[c for c in column_map.keys() if c in df.columns]].rename(columnscolumn_map)应该保留encodingutf-8-sig因为很多后台导出的 CSV 是带 BOM 的 UTF-8直接用 Pandas 读会出现中文列名首字乱码的情况。这是我最初踩过的坑后面会细讲。接下来处理日期。publish_date在不同平台可能是字符串、时间戳、甚至带时区的 ISO 格式。统一转成datetime64类型才方便后续做发布时长过滤df[publish_date] pd.to_datetime(df[publish_date], errorscoerce) # 过滤掉发布时间异常的行 df df.dropna(subset[publish_date]) # 计算截至当前日期每篇文章的发布天数 df[days_since_publish] (pd.Timestamp.now() - df[publish_date]).dt.days # 只保留数据成熟期21天的文章 df df[df[days_since_publish] 21].copy()注意这里用.copy()防止切片视图引发SettingWithCopyWarning。开始用 Pandas 做数据清洗的新手经常会被这个警告折磨它不影响计算结果但容易让人忽略潜在的赋值错位问题。3.2 指标异常值处理截断式归一化的函数化封装我写了一个统一的归一化函数既可以处理一般指标也可以处理方向相反的指标——比如跳出率是越小越好其他指标是越大越好。这就是“正向指标”和“负向指标”的区别def winsorize_norm(series, lower_quantile0.05, upper_quantile0.95, reverseFalse): 对序列做截断式极值归一化 1. 先计算指定分位数将超出范围的值截断到边界 2. 再做 Min-Max 缩放映射到 [0, 1] 3. 如果 reverseTrue意味着指标是越小越好如跳出率 s pd.to_numeric(series, errorscoerce).dropna() if s.empty: return series * 0 # 全为空时返回 0 分 lo s.quantile(lower_quantile) hi s.quantile(upper_quantile) # 截断处理 clipped series.clip(lowerlo, upperhi) # 防止分母为0 denominator hi - lo if denominator 0: norm pd.Series(1.0, indexseries.index) else: norm (clipped - lo) / denominator if reverse: norm 1 - norm return norm这个函数的妙处在于它的鲁棒性。如果某一天后台导出的数据里某个字段全是空值或者某个月所有文章在某个指标上没有区分度函数也能平稳返回结果不会让整个评分流程崩溃。我用跳出率作为反向指标演示一下。跳出率高意味着用户进页面就走了说明内容与标题预期可能有落差。因此在阅读深度维度里跳出率归一化后要用1 - 处理值让高跳出率对应低得分# 正向指标阅读时长越长越好 df[norm_duration] winsorize_norm(df[avg_duration]) # 反向指标跳出率越低越好 df[norm_bounce] winsorize_norm(df[bounce_rate], reverseTrue) # 阅读深度维度得分取两个指标的平均 df[dim_depth] df[[norm_duration, norm_bounce]].mean(axis1)注意这里为了演示把bounce_rate字段也加进来了实际使用时要确保后台导出的字段中存在这个指标。如果没有跳出率可以直接用平均阅读时长做阅读深度维度得分或者把“阅读时长超过 60 秒的访问占比”作为替代。3.3 加权汇总把维度分合成最终质量分参与、传播、长尾三个维度的计算逻辑大同小异区别在于选择的字段不同# 读者参与维度评论、收藏、点赞各占一部分 df[norm_comments] winsorize_norm(df[comments]) df[norm_bookmarks] winsorize_norm(df[bookmarks]) df[norm_likes] winsorize_norm(df[likes]) df[dim_participation] ( df[norm_comments] * 0.3 df[norm_bookmarks] * 0.4 df[norm_likes] * 0.3 ) # 传播能力维度分享数、转载数如果没有转载字段只取分享数 df[norm_shares] winsorize_norm(df[shares]) df[dim_spread] df[norm_shares] # 长尾价值维度搜索来源占比可以有效反映长尾流量 df[norm_search_ratio] winsorize_norm(df[search_ratio]) df[dim_longtail] df[norm_search_ratio]最终加权# 四个维度加权合成质量分 WEIGHTS { dim_depth: 0.30, dim_participation: 0.30, dim_spread: 0.20, dim_longtail: 0.20, } df[quality_score] ( df[dim_depth] * WEIGHTS[dim_depth] df[dim_participation] * WEIGHTS[dim_participation] df[dim_spread] * WEIGHTS[dim_spread] df[dim_longtail] * WEIGHTS[dim_longtail] ) # 将分数映射到百分制方便团队沟通 df[quality_score_100] (df[quality_score] * 100).round(2)百分制不是为了数学上的必要而是为了运营沟通方便。“这篇 78 分那篇 42 分”比“这篇 0.78那篇 0.42”更直观。得到每个维度的得分后还可以顺便输出一张维度对比表用于诊断单篇文章的质量短板summary_cols [ title, publish_date, dim_depth, dim_participation, dim_spread, dim_longtail, quality_score_100, pv, uv ] summary df[summary_cols].sort_values(quality_score_100, ascendingFalse) summary.to_csv(./output/quality_score_rank.csv, indexFalse, encodingutf-8-sig) print(评分完成共处理 {} 篇文章.format(len(summary)))这套代码跑完输出表格拿到手里就能直接用。发布前我习惯先打印前 15 行用眼睛扫一遍看看有没有明显不合理的地方而不是直接丢给运营同事。4. 在真实运营数据里跑了三个月我看到了什么代码能跑通只是第一步。这个系统真正让我觉得有意义的是在真实数据上跑了三个多月后发现了一些过去完全被流量思维掩盖的规律。这些规律直接影响了后续的内容选题和资源分配也是我认为所有内容运营者都应该参考的视角。4.1 流量榜单和质量榜单的前十名重合度不到三分之一我第一次跑完整评分、按质量分排序后把结果和后台流量榜对比最大的直观感受是“两个榜单像是两个站点的文章列表”。流量前十里面只有三篇同时进入了质量前十剩余的七篇流量冠军质量分大多处于中游。深入看数据发现一个规律性的现象流量榜前列往往被两类内容占据——一类是标题带有强烈情绪感的列表型文章比如“10 个你绝对不知道的技巧”另一类是紧跟热点的时效性内容。这两类内容在发布后 48 小时内会获得大量点击但平均停留时长在 30 秒以下跳出率超过 70%收藏和评论更是寥寥。质量榜前列则是完全不同的画像。文章标题往往不刻意制造悬念更像是明确的“问题解答式标题”内容长度普遍在 2000 字以上平均停留时长排在站内前 40% 区间收藏率收藏数/UV是流量榜头部文章的数倍。这里有个反直觉的结论如果按收藏率来排名一些日 PV 只有一两百的小众教程能排到最前面。这说明该站点的核心用户群实际上更需要这些深度内容只是深度内容的触达效率远低于热点内容。4.2 流量与质量交叉矩阵四类文章的差异化运营动作为了让这套评分结果更容易指导行动我做了一张流量-质量交叉矩阵横轴是流量得分PV 归一化后的百分位纵轴是质量分百分位然后把所有文章划分到四个象限象限特征运营动作高流量-高质量站内中流砥柱重点维护定期更新考虑做成系列专题高流量-低质量流量泡沫分析标题与内容的落差优化内文或调整标题低流量-高质量沉睡宝藏加大推广、内链推荐、重发到合适渠道低流量-低质量一般内容不投入资源作为常规内容保持站点更新频率运营动作如果放在矩阵里讨论就比单纯盯流量榜清晰得多。“低流量-高质量”这一类尤其值得重视——它们是最典型的被唯流量论埋没的内容。我处理过的一篇关于老旧系统迁移的文章日 PV 不到 100质量分却排名靠前全部来自搜索长尾。后来把它加入站内首页推荐位并做了几个站内锚文本外链当月搜索访问量翻了一倍。而“高流量-低质量”这一象限更是重灾区。有一篇标题带“速查表”的文章流量颇高但跳出率极高、收藏极少质量分偏低。当我点进原文后发现内容只有两个简单段落加一张过时截图读者是被标题吸引进来发现内容名不副实后立刻离开。这类文章不仅不产生内容资产还会消耗站点的用户信任度。4.3 评分系统帮我们发现内容生产的“帕累托优化”空间持续跟踪三个月后我对这个站点的内容策略调整做了几个很具体的决定。第一明确减少面向流量的巧合型选题把选题权重倾斜到用户搜索意图明确的中长尾关键词。第二对于库存中已有的高流量低质量文章投入时间进行内容扩容补足深度直接节省流量抢夺成本。第三建立“更新触发机制”——当一篇文章质量分降低且搜索流量占比下降时自动进入待更新队列。由于有了质量分的量化依据这些决定不再依赖个人感觉而是可以直接在周会上拿出表格和负责人对齐。这也是评价一个数据系统的真正标准它是否改变了团队的决策行为。对我而言这套系统确实做到了。5. 完整源码配套与改造指南结构、解读和绕过坑完整源码打包放在我的项目目录下包含数据处理脚本、评分函数、以及一个可视化报表生成脚本。读者可以直接复制后在本地环境运行代码依赖只有pandas、numpy和matplotlib用pip install pandas numpy matplotlib一行命令就能装齐。下面详细解释一下几个关键设计点以及在实际使用中必须注意的细节。5.1 源码结构说明与核心函数解读项目的目录结构比较简单blog_quality/ ├── raw_data/ # 存放原始导出数据 │ └── example_export.csv # 示例数据请替换为真实数据 ├── output/ # 结果输出目录 │ ├── quality_score_rank.csv # 质量分排序表 │ └── quality_vs_pv_scatter.png # 流量与质量散点图 ├── quality_score.py # 主脚本 └── config.yaml # 可选权重配置不用YAML也内置默认quality_score.py里的核心流程可以拆成五个步骤读取原始数据文件并统一映射字段名。做日期清洗与成熟期过滤。对每个参与打分的指标做截断式归一化。按四个维度加权合成质量分。输出排序表格和散点图。其中最需要关注的是步骤 3 的归一化参数。我默认用0.05和0.95分位数截断这是比较通用的设置但如果你管理的站点文章数量很少比如总文章数不足 20 篇分位数截断可能过于激进——因为 95 分位数会直接落在数据内部很多文章的指标会被截断到边界值区分度反而下降。这种情况下可以考虑只做max缩放或改用 Z-score 标准化。另一个让我反复强调的细节是字段映射这一步不要直接用中文列名当默认字段名操作。有些后台导出的列明会随系统升级而变化比如“浏览量(PV)”可能变为“浏览量(pv)”。我在实际项目中就遇到过这类问题——升级后脚本读不出数据报KeyError。解决办法是保留统一的英文内部字段名并在读取后用一个字典集中映射升级只要改这个字典。5.2 在本地复盘你的博客平台时需要自检的三个数据坑第一去重规则不能只看文章 ID。有的平台同一篇文章会在 PC 端和移动端各生成一个 ID导出后出现两条记录。如果直接用文章 ID 去重会漏掉这类情况导致同一篇文章的流量被拆成两份评分偏低。我的处理方式是额外加一个基于 URL 规范化的去重规则移除 URL 中的追踪参数如utm_source、fromsinglemessage只保留路径主键再做drop_duplicates。第二时区问题比想象中多。后台导出数据用的是服务器时区而“当前时间”用的又是本机时区。差 8 小时就足以让一篇“刚发布 20 天”的文章被误判为 21 天进入评分池。最稳妥的方式是在读取日期字段时明确指定时区例如pd.to_datetime(..., utcTrue)再统一转换到本地时区。第三评论数和收藏数在极少数文章上会出现明显刷量异常。比如某篇文章突然被挂到第三方推广渠道半小时内评论数从 10 跳到 800。这种异常数据会污染 95 分位数的计算。我用了一个简单粗糙的过滤规则超过该指标 99 分位数的值不参与分位数计算同时给参与评分的原始值设一个硬上限。这种方法有争议但在没有反作弊系统的前提下比不设限制更安全。5.3 把评分系统推广到多个站点的通用化思路这套系统之所以叫“通用博客质量评分系统”是因为它不依赖某个特定平台。不同博客平台导出的字段名不同但核心行为数据无外乎阅读、互动、传播、长尾这四类。通用化的改造思路是把每个平台看成数据源适配器写一个简单的字段映射配置就能接入新平台。例如有些用 WordPress 的站点后台没有“收藏数”字段只有评论和点赞。这种情况下读者参与维度只能退化为“评论数 × 0.6 点赞数 × 0.4”。而另一些使用第三方统计系统的站点有“页面滚动百分比”这类精细数据可以替换掉粗糙的平均停留时长。我的建议是与其设计一套大而全的固定模型不如提供一套通用的评分骨架让每个站点根据自己的数据条件填维度权重。架构上可以做接口设计——每个数据源写一个load_data()和normalize_columns()方法评分主流程只面向标准化后的数据操作。这样切换平台时只有薄薄的适配层需要改动评分逻辑完全复用。5.4 进一步扩展自动化报表和内容预警基础评分跑通后我逐步加了两个小功能极大提高了日常使用效率。第一个是每周自动报表。用schedule库定时跑一次评分脚本计算出本周新增的内容质量分变化。如果某篇上周评分 70 的文章本周掉到 55系统会把它标记为“质量下滑”方便编辑检查是否有修改导致内容变化或者在文首插入了大面积广告影响阅读体验。第二个是月度内容复盘视图。用matplotlib绘制一张散点图横轴是 PV 的百分位纵轴是质量分的百分位每篇文章是一个点。这张图比任何数据表都直观——管理者一眼就能看到有多少文章落在“低流量-高质量”象限那是下一阶段的推广机会池。具体绘图代码并不复杂import matplotlib.pyplot as plt plt.figure(figsize(10, 8)) scatter plt.scatter( df[pv_percentile], df[quality_score_100], cdf[quality_score_100], cmapviridis, alpha0.6, ) plt.colorbar(scatter, label质量分) plt.xlabel(流量百分位) plt.ylabel(质量分百分制) plt.axhline(df[quality_score_100].mean(), colorgrey, linestyle--, linewidth0.8) plt.axvline(50, colorgrey, linestyle--, linewidth0.8) # 给高分低流量文章标注标题 low_flow_high_score df[ (df[pv_percentile] 50) (df[quality_score_100] 70) ].head(5) for _, row in low_flow_high_score.iterrows(): plt.annotate(row[title][:10], (row[pv_percentile], row[quality_score_100])) plt.savefig(./output/quality_vs_pv_scatter.png, dpi150, bbox_inchestight)这张散点图发布在团队周报 PPT 里比单纯贴一张数据表更能引起讨论。因为图像直观展示了“叫好”和“叫座”之间的分离很多编辑第一次意识到自己辛苦写的深度教程虽然流量不爆但在质量坐标体系里一直是站点的中坚资产。6. 这套“反流量”评分系统的局限和我个人的实操经验任何数据系统都有边界。如果以为用一个 Pandas 脚本就能彻底解决内容质量问题那就从一个极端走到另一个极端了。我在实际使用半年后对这个系统的局限性感受很深也在此分享给想直接落地这套方案的朋友。第一个明显的局限是质量分高并不等于读者真的觉得内容“好”。收藏、分享、阅读时长都是行为指标行为可以被诱导、被误读。比如有些读者收藏只是“mark 一下以后再删”并不代表认可内容。第二个局限是数据质量天然参差不齐。搜索来源占比这个字段在站点规模较小时噪音很大——一天只有 30 个独立访客搜索引擎带来 2 个就是 7%但实际上根本说明不了长尾价值。所以我在实际使用中没有把搜索占比作为长尾维度的唯一指标而是和“发布 30 天后的日均 UV”联合使用。第三个局限是这套系统无法衡量内容的“新颖性”和“正确性”。一篇高分文章可能是旧知识换新包装也可能是完全错误的教程尤其技术领域。内容质量除了用户行为数据还需要编辑经验和领域专业知识来兜底。系统评分只能作为排序一维不能也无法替代人的判断。根据自己的使用体验如果让我给一个最小可行方案我会这样说先不要追求复杂指标从阅读时长、收藏数、评论数、搜索占比这四个字段开始。不要照搬任何模板权重先跑通全站数据观察一个月看哪些文章的高分符合你的直觉哪些不符合然后反过来调整权重。评分结果一定不能只出现在报表里要变成运营动作。如果连续两期周报都把同一篇“低流量-高质量”文章捞出来但没有任何推广动作这个系统就是白做了。最后分享一个技术上的小技巧Pandas 处理大数据量时能向量化就向量化不要用for循环逐行算分。我最初版本用的是row循环算归一化全站 3000 篇文章跑了 20 秒改成transform和apply的向量化写法后直接降到 1 秒以内。评分系统要成为日常运营流程的一部分性能瓶颈越小越容易被坚持使用。如果你平时也在维护内容站点手上正好有导出的后台数据建议先去跑一遍这份代码然后把结果和流量榜放在一起对比。可能你会和我一样发现自己的内容库里躺着不少被流量逻辑埋没的好文章。