百度搜索资源平台接入与 API 推送全记录

2026年6月27日 blogTech 11 分钟阅读 8 次阅读
📖 文章摘要

网站从 `blog.vue2.xyz` 统一迁移到 `vue2.xyz` 做主域名,百度搜索资源平台也需要跟着迁移,并实现自动化推送新文章入口。

一、添加站点到百度搜索资源平台

步骤

  1. 打开 https://ziyuan.baidu.com/,用百度账号登录
  2. 用户中心 → 站点管理 → 添加网站
  3. 输入 https://vue2.xyz
  4. 弹窗提示:「建议您添加带www的主站」

这里要注意:百度默认推荐 www.vue2.xyz,但我的主域名是裸域 vue2.xyz,选择 「不带有 www」 继续即可,保持一致最重要。

验证方式

百度与 Google 不同,根域名验证默认给的是 HTML 文件验证,而不是 DNS TXT 记录。

会下载一个 baidu_verify_codeva-xxxxx.html 文件,需要放到网站根目录下能通过 https://vue2.xyz/baidu_verify_codeva-xxxxx.html 访问到。


二、坑:Nuxt 运行时不会自动加载新增文件

Nuxt 构建后,public/ 目录下的静态文件被打包进 .output/public/但运行时不会实时扫描该目录的变化

手动往 .output/public/ 丢验证文件后,访问仍返回 404。原因:Nuxt SSR 运行时启动时缓存了静态文件列表,中途添加的文件不生效。

解决方案:Nginx 直读

在 Nginx 配置中添加一条正则匹配规则,绕过 Nuxt 直接由 Nginx 返回文件:

location ~ ^/baidu_verify_ {
    root /root/blog/frontend/.output/public;
}

关键点:

  • ~ 表示正则匹配,^/baidu_verify_ 匹配所有以该前缀开头的路径
  • 这条规则要放在 location / 之前(Nginx 先匹配最长前缀,然后按文件中顺序匹配正则)
  • 多个百度验证文件共用一条规则,不用每个文件单独加

添加 Nginx 规则的位置

在第一个 server 块(server_name vue2.xyz)中找到 location /uploads/,在其后面插入:

location /uploads/ {
    alias /root/blog/data/uploads/;
}

# 新增:百度验证文件直读
location ~ ^/baidu_verify_ {
    root /root/blog/frontend/.output/public;
}

location / {
    proxy_pass http://127.0.0.1:3000;
    ...
}

添加完成后 nginx -t && nginx -s reload


三、清理旧验证文件

因为之前曾经为 blog.vue2.xyz 做过百度验证,服务器上残留了旧的文件,不清理的话百度先读到旧文件就验证旧的去了。

需要检查的目录(两个都要检查!):

# 1. 构建产物目录
/root/blog/frontend/.output/public/baidu_verify_codeva-*.html

# 2. 源码 public 目录(用于下一次构建)
/root/blog/frontend/public/baidu_verify_codeva-*.html

删除命令:

ssh -p 2894 root@服务器IP "rm /root/blog/frontend/.output/public/baidu_verify_codeva-*.html"
ssh -p 2894 root@服务器IP "rm /root/blog/frontend/public/baidu_verify_codeva-*.html"

本地 frontend/public/ 下的也要一起删,防止下次构建又带进去。


四、提交 sitemap

验证通过后,在站点管理中进入 「普通收录」 → sitemap 提交,输入:

https://vue2.xyz/api/sitemap.xml

配额限制

百度对新站有严格的每日 sitemap 提交配额限制:

阶段 配额 说明
第一天 0 条 只能等,系统还在评估站点质量
几天后 逐步放开 根据站点质量自动提升

第一天配额为 0 时 sitemap 提交会提示余额不足,这是正常的。不过 robots.txt 中已经声明了 Sitemap 地址,百度爬虫定时爬取 robots.txt 时会自动发现 sitemap,不依赖手动提交。

等配额放开后重新提交即可。


五、API 推送脚本

获取 token

  1. 百度搜索资源平台 → vue2.xyz 站点 → 普通收录
  2. 切换到 「API提交」 标签页
  3. 复制接口调用地址中的 token 参数值

接口信息

接口地址:http://data.zz.baidu.com/urls
参数:
  site  = https://vue2.xyz
  token = xxxxxxxxxxxxxxxxxxxxxxxxxx

注意:接口是 HTTP 而非 HTTPS。

脚本实现

最终脚本位于 deploy/baidu_push.py,核心逻辑:

def push_urls(urls: list[str]) -> dict:
    data = "\n".join(urls)
    api_url = f"{BAIDU_API}?site={SITE}&token={TOKEN}"
    cmd = ["curl", "-s", "-H", "Content-Type: text/plain",
           "--data-binary", data, api_url]
    result = subprocess.run(cmd, capture_output=True, text=True)
    return json.loads(result.stdout.strip())

踩坑记录

1. Python urllib 兼容问题(坑)

一开始用 Python 标准库 urllib.request 发送 POST 请求,结果一直报 400 Bad Request。同一组参数用 curl 却能正常返回。

调试后发现原因:

# 这样写不行——site 参数中的 :// 被 urlencode 转义了
params = urllib.parse.urlencode({"site": SITE, "token": TOKEN})
api_url = f"{BAIDU_API}?{params}"

urllib.parse.urlencode 会把 https://vue2.xyz 编码为 https%3A%2F%2Fvue2.xyz,百度的服务器似乎不识别被编码后的 site 参数值。

但即便手动拼接 URL(不编码),urllib.request 仍返回 400(可能是环境特定问题,Windows Git Bash + Python 兼容问题)。

最终方案: 改用 subprocess.run 调系统 curl。

# 这样写没问题
api_url = f"{BAIDU_API}?site={SITE}&token={TOKEN}"
cmd = ["curl", "-s", "-H", "Content-Type: text/plain",
       "--data-binary", data, api_url]

2. 配额耗尽时仍继续发送(坑)

第一次测试时 curl 推了 1 条成功(消耗了当日配额),然后脚本继续推 125 条,百度返回 {"error": 400, "message": "over quota"}

但原代码只检查了 result.get("success"),没处理 "error" 字段,导致后续批次静默失败,没有任何输出。

修复: 先检查 "error" 字段,有错误立刻停止:

if "error" in result:
    print(f"❌ {result.get('message', result)}")
    break

3. 分批提交

百度建议每次提交不超过 20 条。脚本按 20 条一批自动分批:

BATCH_SIZE = 20
for i in range(0, len(urls), BATCH_SIZE):
    batch = urls[i : i + BATCH_SIZE]
    result = push_urls(batch)

如果全量提交 125 条可能会超时或被拒绝。

4. 双击运行时窗口秒关(坑)

脚本写好后双击运行,窗口一闪而过看不到结果。需要在主流程末尾和异常捕获中都加上暂停:

input("\n按回车退出...")

这样无论是成功还是失败,窗口都会保持打开等待用户确认。


六、完整脚本用法

# 从 sitemap 拉取所有 URL 并推送
python deploy/baidu_push.py

# 推送单条 URL
python deploy/baidu_push.py --url https://vue2.xyz/p/new-article

# 从文件读取 URL 推送
python deploy/baidu_push.py --urls urls.txt

输出示例:

从 sitemap 读取 URL...
共发现 125 个 URL
  推送第 1-20 条... ✅ 20 条
  推送第 21-40 条... ✅ 20 条
  推送第 41-60 条... ✅ 20 条
  ...
📊 合计: 成功 125 条, 剩余配额 99975 条
按回车退出...

七、总结

百度搜索资源平台接入的关键点和面试知识点:

Nginx 正则匹配 location

location ~ ^/baidu_verify_ { ... }
  • ~ 表示路径为正则匹配
  • 正则 ^/baidu_verify_ 匹配以 /baidu_verify_ 开头的路径
  • 多个文件共用一个规则

Nuxt 构建产物目录

目录 作用 运行时生效
public/ 源码静态文件目录 仅开发模式(npm run dev
.output/public/ 构建后的静态文件输出 生产模式(SSR)
.output/server/ 构建后的服务端代码 生产模式

生产环境手动往 .output/public/ 添加的文件,Nuxt 运行时不会自动识别,需要 Nginx 直读或重启服务。

百度 API 特点

  • 接口是 HTTP(不是 HTTPS),请求的 Content-Type 必须是 text/plain
  • body 为 URL 列表,每行一条
  • 每日有配额限制,新站从 0 开始逐步放开
  • 返回 {"success": N, "remain": N, ...} 结构
  • urllib 在某些环境下与百度 API 存在兼容问题,推荐使用 curl + subprocess
最后更新:2026年6月29日CC BY-NC-SA 4.0

评论

暂无评论,来写第一条吧

© 2026 My Blog. Built with Nuxt.js + FastAPI.