skip to content
Posts · 2026-09

SEO 是什么:搜索引擎其实只做三件事

系列教程 小白话 SEO:让游戏网站被搜到 第 2 章 / 共 2 章
  1. 1 AI 时代还要不要学 SEO?
  2. 2 SEO 是什么:搜索引擎其实只做三件事

先说结论:SEO 是什么?就是让搜索引擎在做那三件事的时候,每一件都别在你这儿卡住。

三件事是抓取、索引、排名。它们是先后关系,不是并列关系。第 3 件做得再漂亮,前两件不成立,那就什么都不会发生。

这一章我们拿本站自己开刀。域名 freeourdays.com,2026 年 9 月 1 日实测,全部命令你可以照抄去跑你自己的站。查出来的东西有点难看——一个早就删掉的页面还留在 Google 的索引里,一个页面被收了两遍,索引里存的标题还是改版前那一版,上一章发出去 7 天也没进去。这些都留在下面,因为一个只有好消息的例子教不了你任何东西。

左右对照图:左列是搜索引擎做的三件事——抓取(爬虫把你的 HTML 整个下载走,它不执行你的 JS)、索引(决定这一页值不值得存进库里,抓到不等于收录)、排名(同一个词把谁放在前面,这一层才是竞争);右列是你能控制的三件事——让它进得来、让它值得存、让它挑你;底部一行写着顺序不能跳

抓取:爬虫怎么找到你的页面

爬虫是搜索引擎派出来的程序,它干的事和你按 Ctrl+U 看网页源代码几乎一样:请求一个网址,把返回的 HTML 存下来,从里面挑出链接,再去请求下一个。Google 的那只叫 Googlebot。

它怎么知道你的站存在?三条路:别人的页面链到了你、你自己提交的 sitemap、以及站内已抓到的页面里的链接。sitemap 就是你自己列的一份网址清单,放在站上一个固定地址,等于主动递给搜索引擎一句「我有这些页」。

先验证第一件事:爬虫来的时候,看到的和你在浏览器里看到的是同一个东西吗?

# 假装自己是 Googlebot 抓一次,只看 HTML 有多大
curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
  https://freeourdays.com/posts/does-seo-still-matter-2026/ | wc -c

# 再用普通浏览器的身份抓一次,对比
curl -s -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
  https://freeourdays.com/posts/does-seo-still-matter-2026/ | wc -c

-A 后面那一长串叫 User-Agent,是浏览器和爬虫访问网站时自报的身份。改掉它,服务器就以为来的是 Googlebot。

本站两次都是 141734 字节,一模一样。这是好事:说明服务器没有对爬虫另眼相待,正文实实在在写在 HTML 里。

把网址换成你自己的页面跑一遍。如果第一条命令的数字明显小于第二条,或者小得离谱(比如只有两三千字节),你的正文很可能是靠 JavaScript 在浏览器里现拼出来的。Googlebot 会渲染 JavaScript,但那是排在后面的另一道工序,不保证时机,也不保证每次都做。第 9 章会专门拆这个坑。

顺手再确认一件事——你有没有亲手把爬虫拦在门外。robots.txt 是放在网站根目录的一个纯文本文件,爬虫进门先读它,看哪些路径准进、哪些不准:

curl -s https://freeourdays.com/robots.txt

本站返回的是:

User-agent: *
Allow: /
Disallow: /api/

Sitemap: https://freeourdays.com/sitemap-index.xml

Allow: / 是全站放行,Disallow: /api/ 只挡住接口路径——那些地址返回的是 JSON,收录了对谁都没用。真正要命的写法是 Disallow: /,少一个 api 就从「挡住接口」变成「谢绝参观」,而这行经常是从别人的模板里抄来的。第 6 章会把这个文件逐行讲清楚。

这里有个细节值得单独说。 抓取搬走的只是文字,你在图里画了什么它一概不知。上一章那两张 AI 概览截图里有整整一屏的站名和数据,爬虫从图片文件里一个字也读不到。所以那一章的正文里另外用表格把同样的内容又写了一遍:

# 截图里出现的站名,正文里到底有没有对应的文字
curl -s -A "Googlebot" https://freeourdays.com/posts/does-seo-still-matter-2026/ \
  | grep -o "知乎专栏" | wc -l

结果是 7 次。这不是巧合,是写的时候刻意做的:截图只负责证明「这事真发生过」,它里面的每个数字都必须同时以文字形式出现在页面上。 图里的字、视频里的话、canvas 画出来的表格,对抓取这一步来说都等于不存在。

alt 是个例外,它是 HTML 文本,爬虫读得到。所以 alt 要写清图里在发生什么,而不是填个「示意图」交差。

索引:被抓到 ≠ 被收录

索引是搜索引擎的库。抓取只是把你的页面下载走了,接下来它要判断这一页值不值得存进库里——存了,你才有资格参与排名;没存,你在搜索结果里就是不存在。

Google 自己把这两步分得很开。它那份《Google Search Essentials》里有一句话,位置很不显眼,但说得毫不含糊:

It's important to note that just because a page meets all of these requirements and best practices, doesn't mean that Google will crawl, index, or serve its content.

页面把每条技术要求和最佳实践都满足了,也不代表 Google 会抓取它、收录它、把它拿出来给人看。原文见 Google Search Essentials

「不代表」这三个字要当真。看本站的实测:

# 站上一共提交了几个网址(sitemap 是一整行 XML,所以按出现次数数,不能按行数数)
curl -s https://freeourdays.com/sitemap-0.xml | grep -o "<loc>" | wc -l

答案是 10 个。(这是本章发布前的数字。本章上线后你跑同一条命令会拿到 11,多出来的就是你正在读的这一页;它此刻只是进了 sitemap,收不收还得看下面那一节。)这 10 个还不是全部——/series/game-site-seo/ 能正常打开,却根本没写进 sitemap,是本站 sitemap 生成时漏了系列页。第 6 章讲 sitemap 的时候会一起修。

然后去 Google 搜 site:freeourdays.com,数一数它真收了几个。

Google 搜索 site.com 的结果截图:顶部显示「找到约 640 条结果」,下面依次是 freeourdays.com 首页(标题为 AI 游戏网站搭建教程,摘要注明 7 天前)、两条网址都是 freeourdays.com/terms 的服务条款结果(一条标题为「服务条款| Game Site Academy」,另一条被接上了站名变成「服务条款| Game Site Academy - AI 游戏网站搭建教程」,摘要一字不差)、以及一条来自 nextjs.freeourdays.com 子域名的 Next.js 中文文档

截图顶上写着「找到约 640 条结果」。别高兴——这个数字基本没有参考价值。 640 里绝大多数不是这个站的页面,而是挂在同一个域名下的其他子域名:nextjs.freeourdays.comskillsmanager.freeourdays.compixverse.freeourdays.commoltbothub.freeourdays.com,那是另外几个项目。site: 是按域名后缀匹配的,子域名一律算进来。

这个数还会自己漂。同一天稍晚再查一次,它变成「约 649 条」,站上一个字都没动。

把范围缩到主域名,真实的收录清单是这样:

网址在 sitemap 里被收录
首页 /
/about/
/posts/
/terms/是(两条结果)
/posts/does-seo-still-matter-2026/
/posts/ai-game-website-guide/
/pricing/ /privacy/ /series/ /showcase/是(4 个)
/posts/producthunt-daily-2026-08-18/否,已删除
两个集合的对照图:左边写「提交的 10 个网址」,来自 sitemap-0.xml;右边写「它真收了的 4 个网址」,是首页、about、posts、terms;下方两个警示框分别写着「索引里还有一个已经删掉的页」(/posts/producthunt-daily-2026-08-18/ 现在返回 404,但搜索结果里还在)和「同一个页面被收了两遍」(/terms 和 /terms/ 都返回 200,末尾多一条斜杠就是另一个网址)

四处不对劲,一个一个说。

上一章那篇文章发了 7 天,还没进索引。 /posts/does-seo-still-matter-2026/ 在 sitemap 里,能正常打开,HTML 里有 14 万字节的正文,但搜不到。这不是出了故障,这就是新站的常态——一个几乎没有外部链接的新域名,Google 不着急。第 6 章会讲多久没收录才算真的出问题。

一个已经删掉的页面还在索引里。 那是 8 月做的一个 Product Hunt 日报页,后来撤掉了。现在访问它:

curl -s -o /dev/null -w "%{http_code}\n" \
  https://freeourdays.com/posts/producthunt-daily-2026-08-18/

返回 404。页面早没了,索引里的记录还在,别人搜到它就会点进一个死链。索引不是你网站的镜子,它是一份有延迟、会出错、按它自己的节奏更新的副本。 你删掉一个页面,Google 不会当场知道。

索引里存的标题是旧的。 同一次 site: 查询返回的结果里,/about/ 那条的标题是「关于我 - 弗雷FREE」,/posts/ 那条是「文章| 弗雷FREE」。这个站早就改过名了。看现在的真实标题:

for u in /about/ /posts/; do
  curl -s "https://freeourdays.com$u" | grep -o "<title>[^<]*</title>"
done

出来的是 关于 Game Site Academy | Game Site AcademyAI 游戏网站搭建教程 | Game Site Academy搜索结果里显示的标题,是 Googlebot 上次来的时候看到的那一版,不一定是你现在这一版。 所以改完 title 别急着看排名有没有变,先确认 Google 已经重新抓过。

这一步顺带露出另一个毛病:/posts/ 现在的 title 和首页一字不差,两个页面在抢同一个标题。第 7 章讲 title 的时候会把全站重复标题一次查干净。

同一个页面被收录了两遍。 这条最值得你现在就去查自己的站:

# 同一个页面,网址末尾差一条斜杠
for u in /terms /terms/; do
  curl -s -o /dev/null -w "$u → %{http_code}\n" "https://freeourdays.com$u"
done

两个都返回 200。对搜索引擎来说,/terms/terms/ 是两个不同的网址,内容却一字不差。截图里那两条服务条款结果就是这么来的,标题还不一样:一条是「服务条款| Game Site Academy」,另一条被 Google 接上了站名,成了「服务条款| Game Site Academy - AI 游戏网站搭建教程」,下面的摘要则完全相同。

这条证据有个坑。 同一天稍晚重搜一次,那两条只剩一条了——Google 会把同一个站的近似结果折叠起来,不同请求折叠得还不一样。所以别把搜索结果页当检测工具,上面那两行 curl 才是稳的:两个网址都返回 200 且内容相同,问题就客观存在,这一刻能不能在结果页看见它是另一回事。

sitemap 里那 10 个网址,我们一个个试过,带斜杠和不带斜杠都返回 200,一个例外都没有。这是本站实际存在的一个缺陷,第 9 章讲重复内容的时候会把它修掉,并且把过程写出来。

先记住这个判断:页数多不等于收录多,收录多也不等于内容多。 一份内容拆成两个网址,不会让你多一份曝光,只会让搜索引擎在两个几乎一样的页面之间反复犹豫。

排名:同一个词凭什么排你在前面

前两步是资格审查,这一步才是比赛。库里所有跟这个词有关的页面排成一队,谁在前面。

这一步的官方名字其实不叫排名,叫「呈现搜索结果」(Serving search results)。 差别不是文字游戏。Google 那份《How Search Works》讲到这一步时补了一句:Search Console 说某个页面已收录、你却在搜索结果里找不到它,可能是内容跟查询不相关、质量不够,或者 robots 元标记禁止了呈现。「被收录」和「会被拿出来给人看」还是两件事,这是第三层最容易被忽略的一半。(Google 搜索中心:How Search Works

这里不打算罗列排名因素。官方在同一页上只说了这么多:

Relevancy is determined by hundreds of factors, which could include information such as the user's location, language, and device (desktop or phone).

数百个因素,点名的只有三个:用户位置、语言、设备。Google 从来没有公布过完整清单。 所以那些「SEO 排名因素 200 条」的文章,能对上官方口径的就是上面这一句,剩下的都是各家自己的推测和逆向观察——不是说没价值,但它和官方说法不是一回事,中文互联网上转来转去的版本往往连这个区别都不标。

不看清单看什么?看第一页。排名是相对的——你不需要满足某个绝对标准,只需要比现在排第一页那几个更值得排。所以判断「我能不能排上去」的正确动作不是对着因素表打分,是去搜那个词,看第一页站着谁。

拿这篇文章自己举例。它想排的词是「seo是什么」。我们在动笔前测过一批词的竞争度(用哥飞版关键词难度估算,地区参数 gl=us,2026-08-25),seo是什么 是 24.9 分,属于「容易」,工具估算进前十约需 30 个引用域。同一批里最容易的 seo竞争度分析 只要 10 个;最难的 网站测速工具 84.5 分、需要 530 个——那个词第一页全是各家测速工具的官网,新站去碰只是浪费时间。

不是「我要做好 SEO」,是「这个词第一页那十个我能不能超过」。第 4 章会把这套判断拆成可执行的步骤。

还有一条现在就能用:排名是按查询词逐个算的,你的站没有一个统一的「排名」。同一个站,某个冷门长词可能排第 3,某个热词连前 100 都进不去。所以「我的网站排名怎么提升」问不出答案,「《原神》武器突破材料这个词我现在排第几」才问得出。

跟着一个游戏攻略页走完全程

假设你刚给自己的原神攻略站加了一页,讲某把新武器的突破材料要去哪刷。发布之后会发生什么:

第一天,什么都没发生。 页面在线上,Google 不知道它存在。你的站没有多少外部链接,Googlebot 不会没事就来转一圈。

它得先听说这一页。 三条路:sitemap 里出现了这个网址;站内某个已被抓到的页面链到了它;或者外站有人链了它。第三条最快,也最难安排。这就是第 8 章要专门讲内链的原因——内链不只是给读者的导航,它是爬虫在你站内的唯一路线图。

Googlebot 来抓。 它请求这个网址,把返回的 HTML 存走。如果材料表格是靠 JavaScript 从接口拉回来渲染的,它这一趟看到的可能是个空壳。

接着是收录判断。 如果你站上已经有三个页面在讲同一把武器的同一批材料(总览页、单武器页、材料反查页,内容大段重合),Google 会挑一个,剩下的可能就不收了。本站 /terms/terms/ 是这个问题的极端版本——两个网址内容完全相同。

最后才是排名。 有人搜「某武器 突破材料」,你的页面和另外几十个排队。这时候起作用的是:你到底有没有回答这个问题,还是绕了三段废话才给出材料清单。

整条链上,你能插手的地方比你想象的少,但每一处都有具体动作。

这三件事分别对应你能控制的哪三件事

页面不来流量,先定位它卡在哪一层:

卡在哪症状长什么样你的动作怎么算做到了
抓取爬虫身份抓回来的 HTML 明显比浏览器小;或者 robots.txt 里有 Disallow: /放开 robots.txt,把网址写进 sitemap,正文写在 HTML 里两个 User-Agent 抓回来的字节数一致,grep 能在里面找到正文原句
索引页面能打开、也在 sitemap 里,site: 就是查不到把重复网址收敛成一个,从已被收录的页面给它补内链,然后等site: 或 Search Console 的网址检查工具能看到它
呈现已经收录了,可搜目标词翻十页也找不到你换一个第一页打得过的词;一页只回答一个问题拿目标词搜,能在前 100 名里找到自己

三行里最不由你说了算的是中间那行。抓取有明确的开关,排名有明确的对手,收录既没有开关也没有对手——你只能把理由给足,然后等。本站那篇发了 7 天还没收录的文章,此刻确实没有任何「操作」可做,第 6 章会讲什么时候该催、什么时候催了也是白费力气。

动手清单

给自己的站做一次收录盘点。先手动数两张单子,再用脚本把三项检查一次跑完。

  1. 开无痕窗口搜 site:你的域名,把结果里属于主域名的网址全抄下来,子域名的不算。顶上那个「找到约 N 条」直接忽略;
  2. 打开你的 sitemap,把里面的网址也抄下来。地址一般写在 robots.txt 最后一行,常见的是 /sitemap.xml,也可能是 /sitemap-index.xml 套着几个子文件——那就先打开索引文件,找到真正列网址的那一个;
  3. 两张单子对着看,标出三类:在 sitemap 里但没被收录的、被收录但不在 sitemap 里的、同一份内容出现两次的;
  4. 第二类逐个 curl 一下状态码。返回 404 的,就是留在索引里的死链;
  5. 把下面这段存成 check-index.sh,改掉头两行的 SITE 和 sitemap 地址再跑。
SITE="freeourdays.com"
BOT="Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

# 一、sitemap 里列了哪些网址
curl -s "https://$SITE/sitemap-0.xml" \
  | grep -o "<loc>[^<]*</loc>" | sed "s/<[^>]*>//g" > urls.txt
echo "sitemap 里有 $(grep -c . urls.txt) 个网址"

# 二、每个网址两种写法各返回什么:带斜杠 / 不带斜杠
while read -r url; do
  bare="${url%/}"
  printf "%s %s   %s %s\n" \
    "$(curl -s -o /dev/null -w "%{http_code}" "$url")"  "$url" \
    "$(curl -s -o /dev/null -w "%{http_code}" "$bare")" "$bare"
done < urls.txt

# 三、首页在两种身份下抓回来一样大吗
echo "Googlebot: $(curl -s -A "$BOT" "https://$SITE/" | wc -c) 字节"
echo "浏览器:    $(curl -s "https://$SITE/" | wc -c) 字节"

怎么验证做对了

  • 你能报出两个数:sitemap 里几个网址,主域名实际被收录几个。报不出来就是没查;
  • 你手上有一份「被收录但站上已经没有了」的清单。它可以是空的,但必须是查过之后确认为空,不是猜的;
  • 第二项输出的每一行你都看过了。两个状态码都是 200 的行,就是你的重复网址清单,第 9 章要用;
  • 两个字节数你记下来了,差距在几百字节以内。差出一半以上的别等第 9 章,现在就去看页面源代码里有没有正文;
  • 如果 site: 一条主域名的结果都没有,这也是结论,不是查询失败:整站还没进索引。第 6 章就是为这种情况写的。

下一章开始选词。在你还不知道玩家到底在搜什么之前,上面这三件事都无处可用——它们保证的是「你能被搜到」,不保证有人搜。第 3 章讲三个不花钱的办法:搜索联想、玩家社区里反复出现的提问、竞品站的导航,产出你的第一批 20 个候选词。