自动推送 vs 主动推送
百度推送主要有主动推送(API 提交)与自动推送(页面 JS 触发)两种。主动推送是发布即调用接口,效率高但有配额;自动推送是页面被访问时由浏览器执行 JS 把 URL 提交给百度,零配额限制但依赖真实访问。两者互补,自动推送特别适合历史长尾页面被自然访问后补充抓取。织梦要做好自动推送,必须先理解它的触发条件。
触发条件详解
条件一:页面被真实访问
自动推送 JS 必须在浏览器中执行,爬虫访问不触发。只有真实用户打开页面,JS 才会发起推送请求。
条件二:JS 正确加载
JS 代码必须放在页面中,且能正常加载执行。被广告拦截器或浏览器扩展拦截则不触发。
条件三:URL 可规范化
JS 会读取 location.href 作为推送 URL,如果 URL 带追踪参数(utm_source 等)会重复推送,需在 JS 中规范化。
条件四:页面 HTTP 200
404、500 页面不应触发推送,避免把无效 URL 推给百度。
条件五:未在短期内重复
同一 URL 短时间内多次访问只推一次,浏览器有去重逻辑。
织梦接入自动推送
步骤一:获取推送代码
百度搜索资源平台 → 链接提交 → 自动推送,复制 JS 代码,形如:
<script>
(function(){
var bp=document.createElement('script');
bp.src='https://zz.bdstatic.com/linksubmit/push.js';
var s=document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script>
步骤二:加入模板
编辑 templets/default/footer.htm(或对应模板的 footer),在 </body> 前插入:
{dede:global.cfg_auto_push/}
并在后台 系统 → 系统基本参数 → 添加自定义变量 cfg_auto_push,值为完整 JS。这样换推送代码时只改后台变量即可。
步骤三:URL 规范化
对 push.js 做二次封装,去掉无用参数:
<script>
window._push_url=location.origin + location.pathname;
// 仅在有 utm 参数时清理
if (location.search.indexOf('utm_') > -1) {
history.replaceState(null, '', window._push_url);
}
</script>
触发条件优化
仅在文章页触发
列表页、TAG 页索引价值低,不应推送。在模板加判断:
// article_article.htm 模板
{dede:field name='typeid' runphp='yes'}
if (@me) @me=$GLOBALS['cfg_auto_push'];
else @me='';
{/dede:field}
排除无意义页面
- 搜索结果页:
/plus/search.php - 会员页:
/member/ - 分页参数过多的列表
- 需要登录的页面
用 JS 判断当前 URL 前缀,不在白名单则不推送。
结合主动推送
新文章发布即主动推送(即时),后续访问触发自动推送(补充),双管齐下:
// 发布时主动推送
push_to_baidu([$newUrl]);
// 模板加载自动推送 JS 给历史访问补推
触发效果监控
| 指标 | 观察方式 |
|---|---|
| JS 加载率 | 前端埋点统计 |
| 推送 URL 数 | 百度后台自动推送报表 |
| 蜘蛛抓取增量 | Nginx 蜘蛛日志 |
| 索引提升 | 百度索引量曲线 |
注意事项
- JS 必须放在所有页面,否则部分页面无法触发。
- 移动站与 PC 站要分别接入对应 token。
- 不要与主动推送重复推同一 URL,浪费配额。
- 页面加载慢会导致 JS 未执行用户已离开。
- 百度已逐步弱化自动推送,建议以主动推送为主。
建议与展望
自动推送是“被动等访问”的补充手段,建议把它定位为长尾页面的兜底抓取入口,新内容仍以主动推送为主。把 JS 加载率、触发 URL 数接入监控,发现某类页面未触发时及时排查模板。同时关注百度推送政策变化,及时切换到新的推送方式,让织梦站点的内容触达能力持续在线,不因单一通道失效而掉队。