你的网站更新,搜索引擎知道吗?
刚在 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;
- 用
curl或requests推给百度 API。
不用多高深——一个 20 行的 Shell 脚本就能跑通。难点不在写,而在部署后怎么验证它真干活了。建议第一次先让它把变更 URL 打印到日志里,确认路径对了,再放开推送。
方法二:通过CI/CD工具自动化(最推荐)
如果你用 GitHub 托管代码,又用 GitHub Pages、Vercel 或 Cloudflare Pages 部署,那直接上 GitHub Actions 就行——不用碰服务器,配置一次,后续所有推送自动生效。
在项目根目录建 .github/workflows/seo-push.yml,内容大致分四步:
- checkout 代码;
- (可选)运行构建命令,确保静态文件已生成;
- 执行一个小型 Python 脚本,扫描
dist/或_site/目录,比对上次 commit,找出新增/修改的 HTML 文件,拼成 URL 列表; - 调用百度 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)
然后:
- 去 百度搜索资源平台 →「普通收录」→「添加站点」→「获取接口调用地址」,复制整段 URL;
- 把
yourdomain.com和token=xxxxxx换成你自己的; - 把
urls = [...]里的链接,换成你网站上一个真实存在的、刚更新过的页面; - 在终端里运行:
python push_test.py。
看到 200 和 {"success":1,"remain":999},就成了。
这一步打通了“人写代码 → 机器发请求 → 搜索引擎收件”的最小闭环。之后加 Git Hook、塞进 GitHub Actions,只是换个地方放这段逻辑而已。
今晚试试,明天起,你的更新就真的“有人看见”了。