你的网站更新,搜索引擎知道吗?

刚在 Git 提交完新文章,切到浏览器刷新预览,心里还美着——结果一搜自己写的标题,首页空空如也。
不是没上线,是压根儿没被搜到。这种“我写了,它看不见”的憋屈感,你肯定不陌生。

为什么Git提交后,收录推送不能等?

搜索引擎不会盯着你的仓库看。它靠爬虫定期来翻,而爬虫的访问频率,取决于你网站的权重、更新习惯、甚至服务器响应速度。小站、新站、静态站,最容易被晾在一边。

手动去百度搜索资源平台或 Google Search Console 提交链接?可行,但每次改个标题、调个样式都得点一遍,三天两头就忘。团队协作时更麻烦:谁推了什么?哪几个页面是新增的?没人实时同步。

自动化推送的本质,就是让搜索引擎“养成习惯”:你一更新,它就来收件。

有个技术博客站长试过这个方案:以前发完文章,等收录要靠刷屏、外链、反复提交,平均拖到一周以后;接入自动推送后,多数页面2天内就能被发现。内容越有时效性,比如教程、版本更新说明、安全通告,这种“快一步”就越实在。

自动推送收录的3个核心原理

整个流程其实就三步:触发 → 找链接 → 发出去

触发
Git 本身支持钩子(Hook),比如 post-receive(收到推送时)或 post-commit(本地提交后)。只要代码进库,它就能立刻喊一声:“有新东西!”

找链接
脚本得知道哪些文件变了,再把这些文件映射成线上可访问的 URL。比如你改了 content/posts/git-auto-push.md,网站生成后对应的是 https://example.com/posts/git-auto-push/。别一股脑推全站,只推真实变更的公开页面。

发出去
把整理好的 URL 列表,用 HTTP 请求发给搜索引擎。

  • 百度走它的普通收录 API,POST 一个 JSON;
  • Google 不直接收单条 URL,但会认你提交的 sitemap.xml 更新,或者你向它的 Ping 地址 发个 GET 请求,告诉它:“我的地图更新了”。

就像你写完稿子,不是扔进邮箱就完事——得装信封、写地址、贴邮票,最后塞进邮筒。这三步缺一不可。

方法一:利用Git Hook + 脚本(最直接)

适合自己搭服务器、用 Git 托管网站源码的人(比如用 Hugo / Hexo 部署到 VPS 或 NAS)。

操作位置就在你的 Git 仓库目录里:./git/hooks/post-receive(注意不是工作区里的 .git/hooks,而是裸仓库的 hooks 目录)。给它加上执行权限,写一段 Shell 或 Python 脚本。

作用很简单:

  • 解析这次 git push 带来了哪些文件变动;
  • 过滤出 .md.html 或其他能生成页面的源文件;
  • 把它们转成线上 URL;
  • curlrequests 推给百度 API。

不用多高深——一个 20 行的 Shell 脚本就能跑通。难点不在写,而在部署后怎么验证它真干活了。建议第一次先让它把变更 URL 打印到日志里,确认路径对了,再放开推送。

方法二:通过CI/CD工具自动化(最推荐)

如果你用 GitHub 托管代码,又用 GitHub Pages、Vercel 或 Cloudflare Pages 部署,那直接上 GitHub Actions 就行——不用碰服务器,配置一次,后续所有推送自动生效。

在项目根目录建 .github/workflows/seo-push.yml,内容大致分四步:

  1. checkout 代码;
  2. (可选)运行构建命令,确保静态文件已生成;
  3. 执行一个小型 Python 脚本,扫描 dist/_site/ 目录,比对上次 commit,找出新增/修改的 HTML 文件,拼成 URL 列表;
  4. 调用百度 API 或 Google Ping。

所有步骤都有日志,失败会发通知(GitHub 本身就支持邮件/钉钉机器人)。你不需要守着服务器,也不用担心脚本半夜崩了没人修。

方法三:使用第三方服务或开源方案(最省心)

不想写代码?也有现成轮子可用。

  • 静态站生成器插件:Hugo 有 hugo-seo 这类插件,构建完成后自动更新 sitemap.xml 并 Ping Google;Hexo 用户常用 hexo-baidu-url-submit 直接推百度。
  • 轻量 Webhook 工具:如果平台支持 Webhook(比如 GitHub 的 Settings → Webhooks),你可以配一个简单的云函数(腾讯云 SCF、阿里云 FC),收到推送后解析 payload、提取 URL、转发 API。不用自己运维,几行代码搞定。
  • 别碰 IFTTT/Zapier:它们对中文 URL 支持不稳定,且免费版限制多,容易卡在中间断连。小站长慎选。

这些方案的核心逻辑一样:有人替你监听 Git,有人替你算 URL,有人替你按发送键。你只需要确认它推的是对的链接、推的是该推的页面。

避开这些坑,你的自动化流程才顺畅

踩过坑才懂什么叫“看似跑通,实则白干”。

第一坑:乱推一气
脚本没做 diff,每次推送都把整站 URL 列表发一遍。百度 API 有调用量限制,Google 也不喜欢被刷。后果?接口被限流,甚至被标记为异常行为。
✅ 正确做法:只取 git diff --name-only HEAD^ HEAD 中新增或修改的 .md/.html 文件,再映射成 URL。

第二坑:失败静音
脚本里没加错误处理,API 返回 401 或超时,它一声不吭就退出。你以为推成功了,其实一条都没发出去。
✅ 正确做法:所有 HTTP 请求必须判断状态码;失败时把错误信息写进日志,并触发一次钉钉/邮件通知(GitHub Actions 可直接用 dawidd6/action-send-mail)。

第三坑:密钥裸奔
把百度的 token 或 API 地址直接写在脚本里,一不小心提交到公开仓库……等于把家门钥匙挂微博上。
✅ 正确做法:GitHub Actions 用 Secrets,GitLab CI 用 Variables,服务器脚本用环境变量加载。.env 文件千万别提交。

今天下班前,你就能搞定第一步

别想着一步到位。先让“推送”这件事,在你电脑上跑通一次。

打开 VS Code 或任意编辑器,新建一个 push_test.py 文件。
粘贴这段极简代码(只需改两处):

import requests

# 替换成你在百度搜索资源平台拿到的接口地址(含token)
API_URL = "https://data.zz.baidu.com/urls?site=https://yourdomain.com&token=xxxxxx"

# 替换成你刚写的某篇文章的真实URL
urls = ["https://yourdomain.com/posts/git-auto-push/"]

response = requests.post(API_URL, data="\n".join(urls))
print("状态码:", response.status_code)
print("返回内容:", response.text)

然后:

  1. 百度搜索资源平台 →「普通收录」→「添加站点」→「获取接口调用地址」,复制整段 URL;
  2. yourdomain.comtoken=xxxxxx 换成你自己的;
  3. urls = [...] 里的链接,换成你网站上一个真实存在的、刚更新过的页面;
  4. 在终端里运行:python push_test.py

看到 200{"success":1,"remain":999},就成了。
这一步打通了“人写代码 → 机器发请求 → 搜索引擎收件”的最小闭环。之后加 Git Hook、塞进 GitHub Actions,只是换个地方放这段逻辑而已。

今晚试试,明天起,你的更新就真的“有人看见”了。