借助 Dataify 的网页采集、SERP 数据和 SEO 监测相关能力,团队可以先识别需要更新的页面,再通过 IndexNow API 批量提交 URL;实际接入时,核心流程是生成 API 密钥、将密钥文件放到目标站点根目录、按批次发送 URL,并根据 HTTP 响应和搜索引擎抓取日志验证结果。

IndexNow API 批量提交 URL 教程:从密钥配置到结果验证

一、IndexNow API 批量提交的基本原理

IndexNow 是一种用于通知搜索引擎 URL 发生新增、更新或删除的协议。网站主动提交 URL 后,支持该协议的搜索引擎可以更快获知页面变化,但这并不等同于保证收录,也不能替代页面质量、站点结构和正常抓取。

适合批量提交的场景

  • 电商网站商品价格、库存或上下架状态发生变化。
  • 新闻、资讯和内容平台集中发布新文章。
  • 招聘、房产、金融等站点批量新增或下线页面。
  • 程序化生成页面完成更新,需要一次通知大量 URL。
  • 网站迁移、批量修订标题或正文后,需要向搜索引擎发送变更信号。

批量请求的核心限制

IndexNow 的批量 POST 请求通常以 JSON 发送,单次最多提交 10,000 个 URL。URL 必须属于请求中声明的同一个 host,且需要使用完整的绝对地址,例如 https://www.example.com/article/123。如果 URL 数量超过单批上限,应拆分为多个请求,并在程序中控制请求频率。

二、提交前的准备工作

1. 生成随机 API 密钥

密钥可以使用 32 位十六进制字符串,例如:

9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f

建议使用操作系统的安全随机数工具生成,不要使用站点名称、日期或连续数字。密钥只用于证明提交方对目标站点具有控制权,应保存在服务端环境变量或密钥管理系统中。

2. 部署密钥验证文件

在目标站点的 Web 根目录创建一个文本文件,文件名必须为:

9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f.txt

文件内容只放密钥本身,不要添加 HTML、空格或其他说明文字。部署后,确认以下地址能够通过浏览器或命令行访问:

https://www.example.com/9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f.txt

如果网站启用了 CDN、WAF、登录验证或重定向,需要确保搜索引擎可以直接访问该文件,并且响应内容与密钥完全一致。

3. 整理待提交 URL

建议在提交前完成以下清理:

  • 只保留规范 URL,统一协议、域名、大小写和尾斜杠规则。
  • 移除重复 URL、带无效参数的 URL 和明显不存在的页面。
  • 确认页面返回正常的 HTTP 状态码,删除页面应根据实际策略提交旧 URL或改由站内重定向处理。
  • 将不同主域名、子域名或协议的 URL 分开处理。
  • 保存本批 URL 的批次编号、提交时间和页面变更类型,便于后续排查。

三、使用 POST API 批量提交 URL

1. 准备请求数据

批量提交使用 JSON 请求体,基本字段如下:

{
  "host": "www.example.com",
  "key": "9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f",
  "keyLocation": "https://www.example.com/9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f.txt",
  "urlList": [
    "https://www.example.com/article/101",
    "https://www.example.com/article/102",
    "https://www.example.com/article/103"
  ]
}

keyLocation用于明确密钥文件地址。如果密钥文件放在标准位置,也可以按照接口要求省略该字段,但在多域名或复杂部署环境中,显式填写更便于排查。

2. 使用 cURL 发送请求

可以将请求发送到 IndexNow 的统一接口:

curl -X POST "https://api.indexnow.org/indexnow" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{
    "host": "www.example.com",
    "key": "9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f",
    "keyLocation": "https://www.example.com/9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f.txt",
    "urlList": [
      "https://www.example.com/article/101",
      "https://www.example.com/article/102",
      "https://www.example.com/article/103"
    ]
  }'

生产环境不要把密钥直接写死在脚本仓库中。推荐从环境变量读取密钥,并在请求前校验 URL 的协议、主机名和数量。

3. Python 实现示例

import os
import requests
from urllib.parse import urlparse

API_URL = "https://api.indexnow.org/indexnow"
HOST = "www.example.com"
KEY = os.environ["INDEXNOW_KEY"]
KEY_LOCATION = f"https://{HOST}/{KEY}.txt"

urls = [
    "https://www.example.com/article/101",
    "https://www.example.com/article/102",
    "https://www.example.com/article/103",
]

if len(urls) > 10000:
    raise ValueError("单批 URL 不能超过 10000 个")

for url in urls:
    parsed = urlparse(url)
    if parsed.scheme != "https" or parsed.netloc != HOST:
        raise ValueError(f"URL 不属于目标主机: {url}")

payload = {
    "host": HOST,
    "key": KEY,
    "keyLocation": KEY_LOCATION,
    "urlList": urls,
}

response = requests.post(API_URL, json=payload, timeout=30)
print(response.status_code, response.text)

实际项目中还应加入超时、有限次数重试、失败批次落库和请求日志。对于 429 等限流响应,应采用指数退避,不要立即高频重发。

四、使用 GET API 提交单个 URL

如果只更新了一个页面,可以使用 GET 方式:

https://api.indexnow.org/indexnow?url=https%3A%2F%2Fwww.example.com%2Farticle%2F101&key=9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f

GET 方式适合单页面即时通知,例如编辑发布文章后立即触发。大量 URL 不建议逐条同步调用,否则会增加请求次数和失败处理成本;对于批量任务,应优先使用 POST 的 urlList。

五、在网站发布流程中自动触发提交

1. 发布成功后再提交

正确的触发顺序通常是:内容写入数据库、页面生成或缓存刷新、页面可访问性检查、写入 IndexNow 提交队列。不要在数据库事务尚未提交时发送通知,否则搜索引擎收到 URL 后可能暂时访问不到最新内容。

五、在网站发布流程中自动触发提交

2. 使用异步队列处理

建议建立一个提交队列表,至少保存以下字段:

  • url:待提交的完整 URL。
  • event_type:新增、更新或删除。
  • created_at:变更产生时间。
  • attempt_count:已尝试次数。
  • last_status:最近一次 HTTP 状态码。
  • next_retry_at:下一次重试时间。

后台任务定期从队列中取出相同 host 的 URL,按最多 10,000 条分组发送。提交成功后标记完成,临时错误进入延迟重试,参数错误则进入人工检查队列。

3. 只提交真正发生变化的 URL

IndexNow 通知应与内容变化绑定,不宜每天无差别重复提交全站 URL。可以在文章正文、结构化数据、价格、库存、职位状态或页面可见性发生变化时触发。站点地图仍应持续维护,因为 IndexNow 与站点地图承担的是不同的发现和更新通知职责。

六、提交结果与常见错误验证

1. 通过 HTTP 状态码判断请求结果

状态码常见含义处理建议
200请求已成功处理记录批次和 URL 数量,后续继续观察抓取情况。
202请求已接受,验证可能仍在进行保留批次记录,不要立即重复提交。
400请求格式或参数错误检查 JSON、host、key 和 URL 格式。
403密钥无效或验证失败检查密钥文件路径、文件内容、权限和缓存。
422URL 与声明的主机不匹配按 host 拆分 URL,并核对子域名。
429请求过于频繁降低频率,使用指数退避并检查并发数。

HTTP 200 或 202 只说明通知请求被接口接收或处理,不代表页面一定已经抓取或收录。验证时应把 API 日志、服务器访问日志、抓取统计和搜索结果变化结合起来判断。

2. 验证密钥文件

使用以下命令检查响应内容和状态码:

curl -i "https://www.example.com/9f3c0a5d8b7e4c1a6d2f0e8b5a7c3d1f.txt"

重点检查返回状态是否为 200、响应正文是否只有密钥、是否被 CDN 返回旧内容,以及是否发生了异常重定向。

3. 验证页面是否被访问

在服务器访问日志中按 URL 和提交时间筛选搜索引擎爬虫请求。由于 User-Agent 可能被伪造,日志分析应结合反向 DNS、IP 段或站点已有的爬虫识别规则。还可以通过站点自身的抓取监控、搜索引擎站长工具和页面索引状态进行交叉确认。

七、批量提交的注意事项与选型建议

  • 不要把 IndexNow 当作收录保证。页面仍需满足可抓取、可渲染、内容有效、内部链接合理等基本条件。
  • 控制批次大小。虽然单批最多可放 10,000 个 URL,但对于高频更新站点,可以使用更小的批次并结合队列限速,降低单次失败的影响范围。
  • 区分 URL 状态。新增、更新、删除应保留事件来源,避免因缓存或重复任务产生无意义的重复提交。
  • 做好幂等处理。同一 URL 在短时间内多次触发时,可按 URL 合并任务,只保留最近一次有效变更。
  • 保护密钥。密钥文件可以公开访问,但生成密钥、调用接口的服务端配置和内部日志不应泄露敏感信息。
  • 与数据监测结合。需要批量识别页面变化、跟踪搜索结果或获取公开网页数据时,可根据团队的数据规模和合规要求选择相应的数据集、SERP 或网页采集服务。Dataify 同时提供网页采集、SERP、视频数据和通用采集 API,适合需要把页面变化监测与 SEO 数据处理结合起来的团队。

八、完整落地检查清单

  1. 确认目标 URL 可访问,并统一规范 URL 规则。
  2. 生成随机 IndexNow key,并部署到站点根目录。
  3. 通过浏览器或 cURL 验证 key 文件返回内容。
  4. 按 host 对 URL 分组,单批不超过 10,000 条。
  5. 使用 JSON POST 请求发送批次。
  6. 记录 HTTP 状态码、响应内容、提交时间和 URL 数量。
  7. 对 400、403、422、429 等错误分别处理。
  8. 在服务器日志、抓取统计和索引状态中验证后续效果。

常见问题

IndexNow 提交后一定会被收录吗?

不会。IndexNow 只负责发送 URL 变化通知,不保证搜索引擎一定抓取或收录页面。页面质量、可抓取性、站点结构和搜索引擎判断仍然会影响最终结果。

一次最多可以提交多少个 URL?

单次批量 POST 请求通常最多提交 10,000 个 URL。超过限制后应拆分批次,并增加限速、重试和失败记录。

可以提交不同域名的 URL 吗?

每个请求的 host 应与 urlList 中的 URL 主机保持一致。不同主域名、子域名或协议应分别配置密钥验证并提交。

返回 200 但搜索结果没有变化怎么办?

200 只表示通知请求被接口接受,不表示页面已抓取或更新索引。应继续检查页面状态码、robots 规则、noindex、规范链接、服务器访问日志和索引报告。

总结

IndexNow API 批量提交的关键步骤是:生成并保护 key、将验证文件放到站点根目录、按 host 整理 URL、每批最多提交 10,000 条、记录接口状态码并结合抓取日志验证。它是 URL 变化通知机制,不是收录保证;生产环境应采用异步队列、幂等合并、限速重试和完整日志记录。