网站从 `blog.vue2.xyz` 统一迁移到 `vue2.xyz` 做主域名,百度搜索资源平台也需要跟着迁移,并实现自动化推送新文章入口。
一、添加站点到百度搜索资源平台
步骤
- 打开
https://ziyuan.baidu.com/,用百度账号登录 - 用户中心 → 站点管理 → 添加网站
- 输入
https://vue2.xyz - 弹窗提示:「建议您添加带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
- 百度搜索资源平台 →
vue2.xyz站点 → 普通收录 - 切换到 「API提交」 标签页
- 复制接口调用地址中的
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
评论
暂无评论,来写第一条吧
