新站为什么收录慢

域名刚上线时,搜索引擎对它一无所知:没有历史、没有外链、没有抓取记录。爬虫发现的途径只有几条——别人链接了你、你在 sitemap 目录站登记了、或者你手动提交过。

即便 sitemap 提交了,排队也慢。Google 官方说法是「发现到抓取可能需要几天到几周」,新域名更要等。这段时间里,你的内容等于不存在。

有一个协议专门解决「主动敲门」这件事:IndexNow。

IndexNow 是什么

一个由 Microsoft 和 Yandex 推动的开放协议(2021 年发布),机制极简:

  1. 你在站点根目录放一个 <key>.txt 文件,内容是 key 本身——证明你控制这个域名
  2. 你 POST 一个 JSON 到它的 API,列出「这些 URL 有变化」
  3. 搜索引擎收到后,把它们加入抓取队列

参与方:Bing、Yandex、Seznam、Naver,以及一些下游搜索引擎(DuckDuckGo 的部分结果来自 Bing,所以间接受益)。

Google 不参与 IndexNow,这条要记住——Google 只能靠 sitemap + Search Console 手动请求编入索引。

关键区别在于:sitemap 是「我这份清单你什么时候想看就看」,IndexNow 是「这条内容变了,现在去看」。

部署 key 文件

先造一个 key,任意 8~128 位十六进制字符串:

1
2
python -c "import secrets; print(secrets.token_hex(16))"
# 5d8e7cc06ed678995baa492258001796

把它做成站点根目录的 5d8e7cc06ed678995baa492258001796.txt,文件内容就是这串 key 本身(不要加换行以外的任何东西)。

部署后必须能访问:

1
curl -s https://example.com/5d8e7cc06ed678995baa492258001796.txt

返回 200 且内容是 key,才算通过验证。这一步是硬门槛——后面所有提交都依赖它,key 文件不可访问时 API 会返回 403,而且这个 key 可能被标记为不可信。

⚠️ 顺序不能颠倒。我一开始的脚本是「生成 key → 立刻提交」,结果全站提交失败,因为文件还在本地、没有构建部署。正确顺序是:生成 key → 构建 → 部署 → 确认线上 200 → 再提交。

提交 API

请求体:

1
2
3
4
5
6
7
8
9
{
"host": "example.com",
"key": "5d8e7cc06ed678995baa492258001796",
"keyLocation": "https://example.com/5d8e7cc06ed678995baa492258001796.txt",
"urlList": [
"https://example.com/posts/abc/",
"https://example.com/posts/def/"
]
}

POST 到任意一个通用端点,它会转发给所有参与方:

  • https://api.indexnow.org/indexnow
  • https://www.bing.com/indexnow
  • https://yandex.com/indexnow

返回码含义:

状态码 含义
200 已接收
202 已接收,key 待验证(最常见)
400 请求格式错误
403 key 验证失败(文件不可访问或内容不匹配)
422 URL 不属于该 host,或数量超限
429 提交过于频繁,被限流

可复用的脚本

把它做成可重复执行的小工具,比每次手写 curl 靠谱:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env python3
"""IndexNow 提交器:只推最近 N 天有新内容的 URL。"""
import json, re, sys, urllib.request, urllib.error
from datetime import datetime, timedelta
from pathlib import Path

BASE = "https://example.com" # 换成你的域名,或从配置文件读
KEY = "5d8e7cc06ed678995baa492258001796"
ENDPOINTS = [
"https://api.indexnow.org/indexnow",
"https://www.bing.com/indexnow",
]

def post(url: str, payload: bytes, via_proxy: bool) -> int:
handler = urllib.request.ProxyHandler(
{"http": "http://127.0.0.1:7890", "https": "http://127.0.0.1:7890"}
if via_proxy else {}
)
opener = urllib.request.build_opener(handler)
req = urllib.request.Request(
url, data=payload, method="POST",
headers={"Content-Type": "application/json; charset=utf-8"},
)
with opener.open(req, timeout=25) as r:
return r.status

def submit(urls: list[str]) -> bool:
payload = json.dumps({
"host": BASE.split("://", 1)[-1],
"key": KEY,
"keyLocation": f"{BASE}/{KEY}.txt",
"urlList": urls,
}).encode()
for ep in ENDPOINTS:
for via_proxy in (False, True): # 直连失败转代理
try:
if post(ep, payload, via_proxy) in (200, 202):
print(f"✓ {ep} 已提交 {len(urls)} 条")
return True
except urllib.error.HTTPError as e:
print(f"· {ep} HTTP {e.code}")
except Exception as e:
print(f"· {ep} {type(e).__name__}")
return False

两个设计细节值得说明:

直连与代理双通道。IndexNow 的端点在部分网络环境下不可直连,脚本先试直连、失败转代理,比写死一种方式稳。注意直连时要显式传 ProxyHandler({})——否则 urllib 会去读系统代理环境变量,反而绕不开。

只推增量。不要每次都把全站 URL 推一遍。虽然协议允许(单次上限 10000 条),但频繁的全量提交会被判定为噪音。按文章日期过滤最近 3 天,是合理的粒度。

挂进发布流程

最关键的一步不是提交本身,而是让它自动发生。发布脚本里部署成功后直接调用:

1
2
3
4
5
6
7
if grep -q "Deploy done" "$DEPLOY_LOG"; then
if python tools/seo/indexnow.py --days 3; then
log "[indexnow] OK"
else
log "[indexnow] WARN 提交失败(不影响发布)"
fi
fi

注意这里是 if/else 而不是 set -e 之下的裸调用——收录提交失败不能拖垮发布。发布是主线,收录是加分项,两者的失败等级不同。

它做不到什么

诚实地说清楚边界,避免误判效果:

  • 不提升排名。它只影响「多快被发现」,不影响「排第几」。排名还是看内容质量、外链、域名权重
  • 不保证收录。搜索引擎有权忽略你的通知。内容质量差、页面重复,通知了也不收
  • 不覆盖 Google。Google 占中文搜索之外的大头,但它不走这条路
  • 不解决「搜不到」。如果你的标题没人搜,收录了也带不来流量——这个问题 IndexNow 帮不上

最后一条最重要。收录是必要条件,不是充分条件。让内容被看见的前提是「有人在找这个东西」,而这件事由选题决定,不由提交协议决定。

收口

对新建站点,收录流程可以固定成三步:

  1. sitemap + robots.txt 就位,GSC / Bing Webmaster 提交
  2. IndexNow key 部署并验证可访问,接入发布流程自动提交
  3. GSC 手动「请求编入索引」 处理重点页面(Google 的唯一加速途径)

第 1 步是一次性的,第 2 步之后全自动,第 3 步按需手动。三条加起来,新站从上线到被搜到的时间能从「数周」压到「数天」。


这个脚本已经跑在博客的每日刷新链路里,实际执行记录见 用本地 Ollama 模型批量重写了 112 篇文章的 meta description。域名迁移的收尾清单见 Hexo 换域名后 canonical 和 sitemap 还指着旧域。