Skip to content
概述
SEO 通常被理解为“让网站在搜索结果里排得更靠前”,但这个描述只覆盖了工作的一部分。搜索引擎优化的实际范围包括三个层面:让爬虫正确抓取并索引页面、让页面被视为某个主题的可靠结果,以及保证用户打开页面后不会因卡顿或布局跳动而离开。这三条线分别对应抓取与索引控制、内容相关性与权威信号,以及页面加载体验。
本文先为这些指标建立一个分类框架,然后通过一个简单的 Node.js 脚本演示网页标题抓取,模拟爬虫的部分行为,最后简要列出后续篇章会深入的方向。
核心指标的两个观察角度
SEO 指标可以从两个角度来审视:搜索引擎如何看待页面,以及真实用户在使用时的感受。两者会相互影响——搜索引擎会收集用户体验数据来校准排名,而页面在搜索引擎眼中的可索引性又决定了它有没有机会被展现。
搜索引擎视角:可抓取、可索引、相关性与权威
Google 处理网页的流水线大致是 抓取 → 索引 → 排名。一个页面要出现在搜索结果里,至少得保证前两步不被阻断。
- 可抓取:爬虫需要请求到页面的 HTML 文本。如果
robots.txt禁止了重要的 CSS 或 JS 文件,爬虫就无法得到完整的渲染结果,这样的页面可能在“网页索引编制”报告中消失。 - 可索引:即使页面被抓取回来,也不代表会被加入索引库。用
robots.txt禁止抓取并不能阻止已经存在的外部链接或站点地图指向的页面被编入索引——要阻止索引应该使用<meta name="robots" content="noindex">或 HTTP 头X-Robots-Tag: noindex。 - 链接作为发现信号:爬虫依赖
<a href="...">形式的链接发现新页面和评估权威。按钮上的onclick跳转、没有href的<a>元素都不会被当作可抓取的链接。当图片作为链接时,img的alt文本则会被当作锚文本使用。
相关性与权威涉及页面内容与查询主题的匹配程度,以及外链的数量与质量。这些属于排名体系的核心输入,具体运作方式将在下一篇文章展开。
用户体验视角:LCP、INP、CLS
Google 将一组衡量真实用户体验的指标称为 Core Web Vitals。它们也是排名系统的信号之一,分别关注加载速度、交互延迟和视觉稳定性:
- LCP(最大内容绘制):记录视口内最大内容元素的渲染时机,衡量页面主要内容变为可见的时间。建议在页面开始加载后的 2.5 秒内完成。
- INP(交互到下次绘制):收集用户在整个会话中的每一次交互延迟(例如点击、键盘输入),取第 98 百分位的值作为评价。建议控制在 200 毫秒以内。
- CLS(累积布局偏移):衡量页面在加载过程中视觉元素是否发生意外的位置移动,比如图片突然撑开布局、广告嵌入导致文字下坠。分数是偏移量百分比之和,目标值应小于 0.1。
这三个指标本身并不断言“页面好不好用”,但能把体验上的短板量化出来。LCP 不达标通常意味着首屏内容长时间不出现,INP 偏高说明页面反馈迟钝,CLS 问题则直接造成用户点错按钮或阅读中断。
常见方案分类
解决上述两类视角下的问题,可以把方案大致归为三类:技术基础、内容标记和性能体验。这里只勾勒轮廓,具体实施会在后续文章中分别展开。
技术基础:robots.txt 与站点地图
robots.txt 放在网站根目录,用来声明哪些路径不允许遵守规则的爬虫抓取。它只能约束守规矩的爬虫,并且不能用来阻止索引。典型的规则形如:
User-agent: *
Disallow: /admin/表示禁止所有爬虫抓取 /admin/ 下的内容。文件遵循 用户代理:指令 的简单格式,细节在系列后续章节展开。
站点地图是一个 XML 文件,列出网站上需要被重点发现的 URL,还可以附带 <lastmod>(最后修改时间)和 <changefreq>(页面变化频率)等可选信息。对于内容更新频繁或内部链接网络不完善的站点,提交站点地图可以加快新页面的发现速度。
内容标记:结构化数据与 JSON-LD
结构化数据是让搜索引擎理解页面中实体含义的手段,例如一篇文章的作者、发布日期、产品价格和评分。Google 推荐使用 JSON-LD 格式来注入结构化数据,它独立于 HTML 结构,便于维护:
html
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "SEO核心指标概述",
"author": {
"@type": "Person",
"name": "作者名"
},
"datePublished": "2025-01-01"
}
</script>这段脚本可以放在页面的 <head> 或 <body> 中,不会影响 UI。如果标记准确,搜索结果就有可能展示富摘要(如星级评分、面包屑等),这本身不直接提高排名,但通常会带来更高的点击量。
性能体验:Core Web Vitals
提升 LCP 的常见方向包括:使用 CDN 缩短传输延迟、压缩和优化主要资源、避免阻塞渲染的 JavaScript。改善 INP 需要减少主线程的长任务,通过代码分割与拆分大型任务来实现。控制 CLS 的实践则包括为媒体元素预留尺寸、避免在已有内容上方动态插入元素。这些手段与现代前端性能优化手段重合,系列后续会有一篇专门讨论测量与改进。
示例:抓取网页标题
下面用 Node.js 写一个简单的脚本,模拟爬虫请求页面并提取标题。这可以直观地建立“抓取”是怎么回事,同时为理解后续的 XML、结构化数据等内容打下一些代码基础。
基本用法
安装 node-fetch(Node.js 18 及以上可用内置 fetch):
bash
npm install node-fetch创建脚本 fetch-title.js:
javascript
import fetch from "node-fetch";
async function getPageTitle(url) {
const resp = await fetch(url);
const html = await resp.text();
// 简单正则匹配 <title> 标签
const match = html.match(/<title>([^<]*)<\/title>/i);
return match ? match[1].trim() : "(未找到标题)";
}
const url = "https://www.baidu.com";
const title = await getPageTitle(url);
console.log(`页面标题: ${title}`);运行:
bash
node fetch-title.js
# 页面标题: 百度一下,你就知道脚本发起了一个 HTTP GET 请求,获取到的 HTML 文本通过正则表达式提取 <title> 标签的内容,最后打印在控制台。
注意点
- 这个脚本只发送 HTTP GET 请求,不会执行页面中的 JavaScript。真实的 Google 爬虫在抓取后会运行 JS 并渲染最终 DOM,因此得到的标题可能不同。
- 如果目标站点要求特定的
User-Agent或部署了反爬措施,请求可能被拒绝。 - 网页编码不是 UTF-8 时,
resp.text()可能出现乱码。生产级抓取需要解析响应头中的Content-Type,或使用http.get配合iconv-lite转换编码。
这一小段程序背后实际对应着搜索引擎面对的典型问题:发出的请求是否被接受(对应 robots.txt 的遵守与否)、返回的内容是否完整、以及能不能从标记中提取到正确的语义信息。
后续篇章
本文覆盖了 SEO 指标与方案的平面地图,但没有深入任何一条路径。下一篇将切入搜索引擎的工作原理:抓取器的调度机制、索引的构建方式,以及影响排名的核心因素,包括链接分析和内容质量评估的常见思路。
