发了文章等百度自己来抓?主动推和被动等的收录时间差了8倍,三套API脚本一次配置永久自动推送
同一个网站,同一天发的两篇文章。第一篇发完没管,等着百度蜘蛛自己来爬,第11天才在搜索结果里看到。第二篇发完就调了API推送到百度,40分钟后就已经能搜到了。这两篇的差距不是什么玄学,就是主动推送和被动等待的区别。百度自己也在站长平台里说过:主动推送的平均收录时间比被动抓取快5-8倍。但很多站长要么不知道有推送API这回事,要么觉得配置太麻烦一直没动手。
实际上现在的文章自动推送已经简单到可以一条命令搞定。百度、Bing(IndexNow)、Google三家的推送接口都不复杂,一次写好脚本挂到定时任务里,以后每发一篇文章自动推,完全不用人管。这篇文章把三家搜索引擎的推送方案讲清楚,从原理到代码到站群场景全覆盖。
三种推送方式 核心对比
| 推送方式 | 覆盖搜索引擎 | 是否需要Token | 单次推送上限 | 收录加速效果 |
|---|---|---|---|---|
| 百度API推送 | 百度 | 需要(站长平台获取) | 3000条/次 | ★★★★★ |
| IndexNow | Bing、Yandex、Seznam | 需要(生成Key文件) | 10000条/次 | ★★★★☆ |
| 百度JS自动推送 | 百度 | 不需要 | 无限制(每次访问触发) | ★★★☆☆ |
| Sitemap提交 | 百度、Google、Bing | 不需要Token | 50000条/sitemap | ★★☆☆☆ |
一、百度API主动推送,配置一次终身受用
百度站长平台(ziyuan.baidu.com)提供了三种推送方式:API推送、JS自动推送、Sitemap。其中API推送是收录最快的通道,也是唯一一个百度明确说"发现新链接后24小时内可能抓取"的方式。
第一步:获取推送接口地址。登录百度站长平台 → 站点管理 → 选择站点 → 数据引入 → 链接提交 → 找到"API提交"tab。你会看到一串接口地址,格式是:http://data.zz.baidu.com/urls?site=你的域名&token=你的token。记住这个地址,后面脚本要用。
注意事项:百度API推送的token跟站点绑定,一个站一个token。如果你有10个站点,就要获取10个token,推送时要分别调不同的接口地址。另外,百度对未备案域名的推送做了限制,没备案的站API推送可能不生效。

第二步:写推送脚本。下面是Python版的百度API推送脚本,核心就三步:收集要推送的URL列表 → POST到百度接口 → 解析返回结果判断是否推送成功。
#!/usr/bin/env python3# 百度API主动推送脚本(单站版)import requestsimport jsonfrom datetime import datetime# ====== 配置区 ======BAIDU_API_URL = "http://data.zz.baidu.com/urls?site=你的域名.com&token=你的token"# 要推送的文章URL列表(一行一个)URLS = ["https://你的域名.com/article/1.html","https://你的域名.com/article/2.html","https://你的域名.com/article/3.html",]# ====================headers = {"Content-Type": "text/plain"}body = "\n".join(URLS)print(f"[{datetime.now().strftime('%H:%M:%S')}] 开始推送 {len(URLS)} 条URL...")resp = requests.post(BAIDU_API_URL, data=body.encode("utf-8"), headers=headers, timeout=30)result = resp.json()print(f"返回结果: {json.dumps(result, ensure_ascii=False, indent=2)}")if result.get("success"):remain = result.get("remain", "未知")success_count = result.get("success", 0)print(f"推送成功: {success_count} 条 | 今日剩余配额: {remain}")else:print(f"推送失败: {result.get('error', '未知错误')}")百度API的返回结果很简单:success 是成功推送的条数,remain 是今天还剩多少配额。普通站点每天3000条,如果是认证站点可以到10万条。
URL从哪里来?两种收集方式
方式一(实时推送):WordPress可以用hook,文章发布时自动触发。在functions.php里加一段代码,监听publish_post钩子,拿到新文章URL直接调百度API。这样文章一发布就推送,最快。
方式二(定时批量推送):先写一个脚本读取sitemap.xml,提取所有URL,去重后批量推。然后用cron定时任务每天跑一次。适合非WordPress的网站或者已经有sitemap的老站。
二、IndexNow,一条请求同时推给Bing、Yandex、Seznam
IndexNow是微软牵头发起的开放协议,最大的优势是推一次,Bing、Yandex、Seznam三家同时收到。不像百度,你不需要分别对接Bing Webmaster API、Yandex Webmaster API——一个IndexNow请求全搞定。而且IndexNow没有每日推送条数限制,单次最多可以推10000条。
第一步:生成Key文件。随便生成一个32位以上的字符串作为你的Key(比如UUID去掉横线),然后把这个Key以文本文件的形式放到网站根目录:https://你的域名.com/你的Key.txt。文件内容就是Key本身,不用加任何其他东西。搜索引擎会通过这个文件验证你是不是网站的拥有者。
第二步:发送推送请求。IndexNow的API格式极其简洁:
#!/usr/bin/env python3# IndexNow 批量推送脚本import requestsimport jsonKEY = "你的32位Key"SITE = "https://你的域名.com"INDEXNOW_URL = "https://api.indexnow.org/IndexNow"urls = ["https://你的域名.com/post/1.html","https://你的域名.com/post/2.html",]payload = {"host": SITE.replace("https://", "").replace("http://", ""),"key": KEY,"keyLocation": f"{SITE}/{KEY}.txt","urlList": urls}headers = {"Content-Type": "application/json; charset=utf-8"}resp = requests.post(INDEXNOW_URL, json=payload, headers=headers, timeout=30)if resp.status_code == 200:print(f"IndexNow推送成功: {len(urls)} 条 → Bing+Yandex+Seznam 同时收到")else:print(f"推送失败: HTTP {resp.status_code} | {resp.text}")IndexNow推送后不会马上显示收录,一般需要等几分钟到几小时。它没有像百度那样的"剩余配额"机制,没有日限额,想推多少推多少。如果你做了外文站或者面向海外用户的站,IndexNow是必配的。
IndexNow的站群玩法

如果你的站群每个站都是独立域名,那每个站要单独生成一个Key文件。但如果你的多个站用的是同一个域名的子域名(site1.example.com、site2.example.com),只需要在根域名下放一个Key文件,所有子域名共用。脚本里把host参数改成对应的子域名就行。如果你还要同时推百度,就需要两套脚本并行——IndexNow管Bing系,百度API管百度。
三、WordPress自动推送插件,不想写代码的终极方案
如果你用的是WordPress,而且不想写任何代码,插件方案是最省事的。目前主流的选择是这几个:
| 插件名称 | 支持平台 | 推送方式 | 适合谁 |
|---|---|---|---|
| 果果推送 | 百度、Bing、神马、Google | API推送 + IndexNow | 需要同时推多家引擎的WP站长 |
| SEO合集 | 百度、Bing、Google、头条 | API推送 + 定时任务 | 需要SEO全功能(不只是推送) |
| 站长帮 | 百度、Bing、360 | API推送 + Sitemap | 中文站为主的站长 |
| BSL Pro | 百度、Bing、360 | API推送 + 推送记录 | 需要详细推送日志的商业站 |
这些插件的使用方式都差不多:安装 → 在设置页填Token → 开启自动推送。一般都会在文章发布/更新时自动触发推送,有些还支持定时批量推送历史文章。果果推送是免费插件里功能最全的,百度、Bing、IndexNow三家都支持,还有推送记录可以查看每次推送的状态。
插件推送的局限性
插件方案最大的局限是站群管理不方便。每个站都要装插件、配置Token,10个站就要操作10次。而且插件只能推本站的文章,无法实现"从一个中心节点控制所有站的推送"。如果你的站点数超过5个,用插件管理的性价比就急剧下降,不如自己写脚本集中管理。
四、站群批量推送方案,从"手动一个站一个站配"到"一条命令全搞定"
站群场景下,你需要的是一个统一的推送调度器——把所有站的Token和域名配置好,脚本自动读取各站的新文章URL,按站分组推送到对应的API。下面这个脚本模板可以适配大部分站群场景:
#!/usr/bin/env python3# 站群批量推送脚本(百度 + IndexNow)import requestsimport json# ====== 站群配置 ======SITES = [{"domain": "site1.com","baidu_token": "TOKEN_1","indexnow_key": "KEY_1","urls": ["https://site1.com/article/new1.html","https://site1.com/article/new2.html",]},{"domain": "site2.com","baidu_token": "TOKEN_2","indexnow_key": "KEY_2","urls": ["https://site2.com/news/update1.html",]},# ... 继续添加更多站点]# ========================def push_baidu(domain, token, urls):api_url = f"http://data.zz.baidu.com/urls?site={domain}&token={token}"body = "\n".join(urls)resp = requests.post(api_url, data=body.encode("utf-8"),headers={"Content-Type": "text/plain"}, timeout=30)return resp.json()def push_indexnow(domain, key, urls):payload = {"host": domain,"key": key,"keyLocation": f"https://{domain}/{key}.txt","urlList": urls}resp = requests.post("https://api.indexnow.org/IndexNow",json=payload, timeout=30)return resp.status_code == 200for site in SITES:domain = site["domain"]urls = site["urls"]print(f"\n{'='*50}")print(f"站点: {domain} | 推送 {len(urls)} 条URL")# 推送到百度if site.get("baidu_token"):result = push_baidu(domain, site["baidu_token"], urls)success = result.get("success", 0)remain = result.get("remain", "?")print(f" 百度: 成功{success}条 | 剩余配额{remain}")# 推送到IndexNow(Bing/Yandex/Seznam)if site.get("indexnow_key"):ok = push_indexnow(domain, site["indexnow_key"], urls)print(f" IndexNow: {'成功' if ok else '失败'}")print(f"\n{'='*50}")print("全部站点推送完成")把这个脚本部署到一台服务器上,配合cron定时任务(比如每天凌晨2点和下午2点各跑一次),就实现了一个全自动的多站推送系统。URL的来源可以是各站的sitemap.xml,也可以是你自己维护的一个URL数据库表。
五、推送的节奏和频率,推太快反而可能被降权

推送不是越快越好,也不是越多越好。百度API对推送频率没有公开的硬性限制,但有几个实践出来的规律:
单次推送不要超过1000条
虽然百度API文档说单次最多3000条,但一次性推太多,百度可能会判定为异常行为。建议单次控制在500-1000条,分批次推。
不要重复推送同一篇文章
已经收录的文章不要再推,百度会认为你在刷推送。脚本里要做去重逻辑——推过的URL记下来,下次跳过。可以用一个本地文本文件或sqlite记录已推送的URL。
新站不要第一天就猛推
刚上线的新站,建议先通过Sitemap提交让百度认识你的站,运营一两周后再启用API推送。新站上来就每天推几百条,容易被判为垃圾站。
推送只是加速,不是保证收录
API推送的作用是"告诉百度有新页面",但百度会不会收录、排名好不好,最终还是看内容质量。推了不收录,问题在内容而不是推送方式。
一个比较好的推送节奏是:文章发布后立即推一次(通过WordPress hook或发布流程触发),然后每天凌晨用cron跑一次批量检查,把24小时内新发布但漏推的文章补推一次。这样既保证了时效,又有容错机制。
再补充一点容易被忽略的:推送的URL必须是200状态码的页面。如果你推了一个404、301跳转或者noindex的页面,百度会记录下来。推多了这种无效URL,会影响你的站在百度那里的"信誉分",后续正常URL的推送效果也会打折扣。推送前最好先用脚本批量检查URL状态码,只推200的。
六、三种推送方式的组合使用策略
百度API、IndexNow和Sitemap不是三选一的关系,是可以同时用的。它们覆盖的搜索引擎不同,推送机制不同,组合起来才是最优解:
| 使用场景 | 百度API | IndexNow | Sitemap |
|---|---|---|---|
| 新文章发布 | ✓ 立即推送 | ✓ 立即推送 | 不需要 |
| 历史文章批量 | 分批次推 | 一次性推 | ✓ 提交sitemap |
| 文章更新 | ✓ 重新推送 | ✓ 重新推送 | 自动更新 |
| 仅面向国内 | ✓ 必须配 | 可不配 | 作为兜底 |
| 面向海外 | 不需要 | ✓ 必须配 | ✓ Google+Bing |
说穿了:百度API管时效,IndexNow管Bing系,Sitemap管兜底。三管齐下,你的文章发出去的下一秒就已经进入搜索引擎的待抓取队列,而不是等蜘蛛自己爬过来发现你。
最后,如果你管的是多个站点,推送这件事就值得系统化——不是每个站分别装插件、配Token,而是在一个统一的平台上管理所有站的推送状态和推送日志。UC建站系统的内容中台就是走的这个思路:站群的文章发布后,中台自动读取各站的URL变化,按站点的搜索引擎策略(国内站推百度、海外站推IndexNow)自动分发推送,不需要站长手动干预。
回到开头那个问题:文章发布后是等着蜘蛛来爬还是主动推?答案是显而易见的——一套脚本、一次配置,就能让收录时间从11天缩短到40分钟,这种投入产出比在SEO里找不到第二个。
