Skip to content
关键词研究与内容优化
概述
在搜索引擎的排名逻辑中,内容相关性不是一个可以直接测量的绝对值。它更接近“针对某个查询,这个页面说了多少相关的事”的综合判断。把这种判断落回到页面上的第一项实际工作,就是弄清楚目标人群到底在搜什么——也就是关键词研究。如果连页面要命中哪些查询都不清楚,后续的标题撰写、正文铺排、结构调整就都失去了校准依据。
这一步依赖的基本判断流程如下:
- 确定与业务或主题相关的种子关键词。
- 按照搜索意图把关键词分类,剔除虽然流量大但根本不适合当前页面类型的词。
- 扩展出足够长的词库,挖掘长尾词和具体表达方式。
- 对候选词做一轮初级竞争判断,确定哪些词在当前站点有能力争取。
后续章节会用 Node.js 把其中可量化的部分——密度、标题布局——自动化,但前半部分的概念理解是代码能跑对的前提。
关键词意图分类
Google 在搜索质量指南中将查询意图分为三类:信息型(information)、导航型(navigation)、交易型(transaction)。这三种意图对应着用户完全不同的期望——用一个信息型页面去承接交易意图的搜索,即使内容质量不差,也很难在搜索结果中站稳。
- 交易型:用户有明显的“下一步动作”倾向,可能是下单、注册、下载或询价。典型表达如
购买 Node.js 图书、SEO 工具免费试用、域名注册优惠。 - 信息型:用户想知道某件事的答案、了解概念或学习步骤。查询如
什么是关键词密度、nodejieba 分词原理、Google 排名因素 2024。 - 导航型:用户已经知道要去哪个网站,只是通过搜索框导航。如
Google Search Console、cheerio GitHub、yanyiwu/nodejieba。
分类过程不需要任何工具,凭经验和常识就能完成大部分工作。拿到一个候选词列表后,逐条判断:搜这个词的人想看什么?应该用一篇文章、一个产品页面还是一个专题聚合页来接住他?如果这个问题的答案和当前页面的性质明显冲突,就该删掉这个词。
构建关键词词库
从一个或几个种子词出发,长尾关键词的主要来源有四种:
- 搜索引擎自身的建议:在搜索框中输入种子词,下拉列表中的补全建议就是高频相关查询。手动收集这些内容几乎没有成本。
- 搜索结果页底部的“相关搜索”:Google 在结果底部给出的一组相近查询,往往能补充一些自己没想到的表达方式。
- 问答平台与社区:Stack Overflow、知乎、V2EX 这类位置暴露的是真实用户用自然语言提出的问题。这些长句本身就可以作为信息型长尾词的来源。
- 工具辅助:Google Ads 关键词规划师能输入种子词并返回大量关联词,同时给出搜索量和竞争程度数据;Google Search Console 性能报告会展示网站已获得曝光和点击的真实查询,这些第一手数据比任何预测工具都更贴近实际情况;Google Trends 则能发现一些季节性话题或新出现的表达。
这一阶段的目标不是产出精确的数据报表,而是拿到一份足够长的“可能查询清单”。即使用纯手工方式收集二三十个也管用——后续的 Node.js 分析会帮你衡量当前页面对这些查询的覆盖程度。
竞争度初判
构建出词库后,在真正动手优化页面之前,还需要对每个词的竞争态势有一个粗略判断。严格来说,准确的竞争度需要综合外链、域名权重、内容质量等多维信号,但可以从两个容易观察的维度入手。
搜索量:通过关键词规划师或 Google Trends 可以看到一个词的大致搜索热度。高搜索量通常意味着更多竞争,但不代表必须放弃。长尾词虽然搜索量低,但意图更明确,综合转化潜力往往更高。
结果页类型:直接在浏览器中搜索这个词,观察搜索结果页上的呈现。如果首页满是知名域名的深度文章,那么一个新站点想要挤进去的难度会很大;如果首页出现较多论坛帖、问答页面或者明显内容不完整的页面,则说明存在优化机会。另外还要看 Google 是否插入了精选摘要、知识面板或视频结果——这些 SERP 特性都会抢占传统自然排名的点击。
综合以上信息,可以把候选词分为三类:高潜力但高竞争的核心词、中等竞争的重点词、以及低竞争的长尾词。在实际内容优化中,最先被安排进页面结构的往往是那些中等竞争的重点词和长尾词——它们在合理的优化后更容易获得排名提升。
基本用法:抓取页面正文
在服务端解析 HTML,cheerio 是 Node.js 环境下最轻量的选择。它提供了类似 jQuery 的 API,可以直接选择 DOM 节点并提取文本。
javascript
const cheerio = require('cheerio');
// 模拟一个页面
const html = `<!DOCTYPE html>
<html>
<head><title>关键词密度分析教程</title></head>
<body>
<header><nav>导航菜单</nav></header>
<main>
<h1>如何计算关键词密度</h1>
<p>关键词密度是衡量页面内容相关性的基础指标之一。密度过高可能被视为堆砌。</p>
<p>在实际分析中,中文分词会影响密度计算的精确度。</p>
</main>
<footer>版权信息</footer>
</body>
</html>`;
const $ = cheerio.load(html);
// 提取 body 下所有文本,排除 script 和 style
let bodyText = '';
$('body').find('*').each((i, elem) => {
if (elem.type === 'tag' && elem.name !== 'script' && elem.name !== 'style') {
const text = $(elem).text().trim();
if (text && !bodyText.includes(text)) {
bodyText += text + ' ';
}
}
});
console.log('提取的正文:', bodyText.trim());这段脚本遍历 body 内所有标签节点,跳过 <script> 和 <style>,对每个元素取其直接文本。bodyText.includes(text) 这一行做了简单去重——当子节点的文本已经包含在父节点文本中时,不再重复添加。运行后的输出是一段连续的纯文本,后续分词的输入就是它。
基本用法:中文分词与词频统计
英文分词按空格拆分即可,中文则完全不同。nodejieba 是 Node.js 中常用的中文分词库,底层整合了基于维特比算法的 HMM 新词发现,能较好地处理未登录词和专业术语。
javascript
const nodejieba = require('nodejieba');
const text = '关键词密度是衡量页面内容相关性的基础指标之一。';
// 精确模式分词
const words = nodejieba.cut(text);
console.log(words);
// 输出:['关键词', '密度', '是', '衡量', '页面', '内容', '相关性', '的', '基础', '指标', '之一', '。']
// 计算词频
const freqMap = {};
words.forEach(word => {
if (word.length > 1) { // 过滤单字词
freqMap[word] = (freqMap[word] || 0) + 1;
}
});
console.log(freqMap);nodejieba.cut() 返回一个数组,每个元素是一个词。过滤掉长度为 1 的项可以去除标点和多数无意义单字,大幅减少噪音。在实际分析页面正文时,需要先拿到上一节提取的 bodyText,再调用 nodejieba.cut(bodyText) 得到词序列,最后统计每个词的出现次数。
命令:关键词密度计算
拿到词频表之后,关键词密度的计算是一个简单的比例:
密度 = (目标关键词出现次数 / 总词数) × 100%将前面几步串起来,可以写一个完整的密度分析函数:
javascript
const cheerio = require('cheerio');
const nodejieba = require('nodejieba');
function analyzeKeywordDensity(html, targetKeyword) {
const $ = cheerio.load(html);
let bodyText = '';
$('body').find('*').each((i, elem) => {
if (elem.type === 'tag' && elem.name !== 'script' && elem.name !== 'style') {
const text = $(elem).text().trim();
if (text && !bodyText.includes(text)) {
bodyText += text + ' ';
}
}
});
const words = nodejieba.cut(bodyText);
// 统计所有词频
const freq = {};
words.forEach(w => {
if (w.length > 1) freq[w] = (freq[w] || 0) + 1;
});
const totalWords = Object.values(freq).reduce((a, b) => a + b, 0);
const keywordCount = freq[targetKeyword] || 0;
return {
totalWords,
keywordCount,
density: ((keywordCount / totalWords) * 100).toFixed(2) + '%',
freqTable: freq
};
}
// 测试
const html = `...`; // 同上节 HTML
console.log(analyzeKeywordDensity(html, '密度'));运行结果会显示总词数、“密度”一词的出现次数以及密度百分比。返回的 freqTable 字段保留了完整的词频映射,方便后续排查某个词是否被分词器错误切分。
命令:标题结构审计
正文的密度数据只能说明“页面聊到了某个主题”,但搜索引擎会更重视标题标签中传递的信号。Google 明确建议 title 应精确描述页面内容,h1 等标题用于突出结构。因此,提取并检查这些标签中的关键词分布,可以快速发现标题和内容之间是否出现“各说各话”的情况。
javascript
function auditHeadings(html, keywords) {
const $ = cheerio.load(html);
const result = {
title: $('title').text(),
headings: {}
};
['h1', 'h2', 'h3'].forEach(tag => {
result.headings[tag] = [];
$(tag).each((i, el) => {
const text = $(el).text().trim();
const found = keywords.filter(kw => text.includes(kw));
if (found.length > 0) {
result.headings[tag].push({ text, matched: found });
} else {
result.headings[tag].push({ text, matched: [] });
}
});
});
return result;
}
const targetKeywords = ['关键词密度', '中文分词'];
console.log(auditHeadings(html, targetKeywords));这段脚本依次检查 title、h1、h2、h3 中是否出现了目标关键词。如果一个页面优化的是“关键词密度”,但 title 还在使用“SEO 基础概念”,h1 却变成了“如何分析页面内容”,信息就出现了明显的不一致。这种情况下搜索引擎很可能无法准确判断页面的主主题,排名表现自然会打折扣。
示例:内容优化动作
前面的分析和审计最终要转化为可执行的动作,否则数字就只是数字。基于密度和标题结果,需要执行以下调整:
- 标题改写:如果
title中完全没有出现目标关键词,或者只出现了一次但位置太靠后,将其前置。如果h1和title表达的是两套语义,统一为同一个主题的不同表达。避免堆砌,比如title="关键词密度,关键词密度计算,关键词密度工具"这种拼接式标题,既不符合 Google 的规范,也影响用户点击体验。 - 段落调整:根据词频分布,如果目标关键词只集中在页面某一两个段落,其他长段落完全没有覆盖,适当在相邻上下文中自然融入,或者将部分段落拆分,用关键词作为小标题。
- 语义补充:中文分词后经常会出现“关键词”和“密度”被单独切分的情况,但实际讨论的“关键词密度”是一个完整概念。单纯增加这个词的重复次数效果有限,反而应该引入相关表达(如“词频比例”、“分词后的关键词出现率”),让页面在语义上更丰富。
修改时需要时刻提醒自己:优化后的页面仍然是给人读的。如果插入关键词的位置导致句子生硬或阅读体验下降,宁可不加。
示例:弱相关页面优化
假设现有一个页面原始内容如下:
javascript
const originalHtml = `<!DOCTYPE html>
<html>
<head><title>我的技术博客</title></head>
<body>
<h1>最近的一些学习笔记</h1>
<p>最近看了很多关于搜索优化的文章,感觉特别有意思。</p>
<p>其中包括一些关于页面内容处理的工具和方法。</p>
<h2>什么是分词</h2>
<p>分词就是把一句话拆成词,英文用空格就行,中文需要专门工具。</p>
</body>
</html>`;目标关键词设定为“中文分词工具”。先用 analyzeKeywordDensity 和 auditHeadings 跑一遍:
javascript
const densityReport = analyzeKeywordDensity(originalHtml, '中文分词工具');
const headingReport = auditHeadings(originalHtml, ['中文分词工具']);
console.log('密度分析:', densityReport.density); // 可能是 0% 或极低值
console.log('标题审计:', headingReport);假设结果:title 为“我的技术博客”,h1 为“最近的一些学习笔记”,h2 只提到了“分词”,没有完整包含“中文分词工具”。正文中“中文分词”出现了,但“中文分词工具”一次都没有。密度几乎为 0。
优化动作包括:
- 将
title改为“中文分词工具的选择与使用 - 技术笔记”。 h1调整为“使用中文分词工具处理页面正文”。- 在首段补充:
在分析页面关键词密度时,一款可靠的中文分词工具是必备的。 h2“什么是分词”可以保留,但需要在后续段落中自然引入“nodejieba 是最常用的中文分词工具之一”。
修改后再次运行分析:
javascript
const optimizedHtml = `<!DOCTYPE html>
<html>
<head><title>中文分词工具的选择与使用 - 技术笔记</title></head>
<body>
<h1>使用中文分词工具处理页面正文</h1>
<p>在分析页面关键词密度时,一款可靠的中文分词工具是必备的。最近看了很多关于搜索优化的文章...</p>
<p>其中包括一些关于页面内容处理的工具和方法。</p>
<h2>什么是分词</h2>
<p>分词就是把一句话拆成词。nodejieba 是最常用的中文分词工具之一,支持多种分词模式。</p>
</body>
</html>`;
console.log(analyzeKeywordDensity(optimizedHtml, '中文分词工具'));
console.log(auditHeadings(optimizedHtml, ['中文分词工具']));此时密度会提升,title 和 h1 也都命中了目标关键词。这是一个刻意简化的场景,但现实中弱相关页面大多也是类似的问题:标题和内容偏离了真正需要覆盖的查询表达。
注意点
nodejieba 的分词结果不能视为绝对正确。中文分词的天然模糊性决定了它一定会把某些专业术语错误切分。比如“搜索质量指南”可能被切成“搜索”、“质量”、“指南”,而不会保留为整体。当在词频表中看不到目标关键词,但页面确实多次出现该词时,先检查是否被分词器打散了。
关键词密度更多是一个“负面信号”。Google 曾经在算法中使用过密度相关的规则,但现在更倾向于语义理解和整体页面质量。如果把密度强行拉到某个“最佳范围”而不关心内容本身是否自然,反而容易被判定为堆砌。密度分析的意义在于发现明显缺失或明显过量,而不是用来把数字调到一个理想区间。
延伸方向
现实中的搜索引擎不再依赖简单的词袋模型。算法会识别页面中提及的实体(人、事物、概念)以及它们之间的关系。在这种背景下,“相关”不再等同于“反复出现同一个词”,而是“围绕主题提供了足够的属性、同类概念和相关事实”。例如讨论 nodejieba 时,如果页面也提到了维特比算法、HMM 模型、新词发现,即使“nodejieba”这个词只出现两次,页面仍然可能被认为是高分结果。
从手工关键词分析迈入实体优化的门槛,通常需要接入实体识别 API 或知识图谱数据,这已超出本篇工具链的范围,但它提示了一种方向:当词频和密度都没问题但排名依旧不理想时,可以从“补充实体和语义上下文”的角度再审视页面内容。
参考链接
- [1] https://developers.google.com/search/docs/fundamentals/keyword-research?hl=zh-cn
- [3] https://support.google.com/google-ads/answer/2453982?hl=zh-Hans
- [4] https://support.google.com/webmasters/answer/9128668?hl=zh-Hans
- [5] https://trends.google.com/trends/?hl=zh-CN
- [6] https://developers.google.com/search/docs/fundamentals/how-search-works?hl=zh-cn
- [7] https://github.com/cheeriojs/cheerio
- [8] https://github.com/yanyiwu/nodejieba
- [9] https://developers.google.com/search/docs/appearance/title-link?hl=zh-cn
- [10] https://developers.google.com/search/docs/fundamentals/creating-helpful-content?hl=zh-cn
- [11] https://developers.google.com/search/docs?hl=zh-cn
