收录量突然掉光:从状态码、robots 到抓取预算的六步排查法

一个真实的场景:百度收录量一夜掉光

上周有个做工具站的站长找我,说他一个跑了三年的站,百度收录量从 12000 多掉到 300,流量直接腰斩。他第一反应是"被 K 了",准备删库重做。但我让他把 百度搜索资源平台里的"抓取诊断"跑一遍,结果出来了:他的服务器返回给百度的首页状态码是 403。

问题不在内容,而在他上个月给服务器加的一条 Nginx 规则。为了挡掉某个采集站的爬虫,他写了这么一句:

if ($http_user_agent ~* "Baiduspider") {
    return 403;
}

他以为 "Baiduspider" 只匹配那个讨厌的采集站,但实际上百度的官方爬虫 UA 就叫 Baiduspider。一句话,把自己最大的流量来源拉黑了。

这件事说明一个常被忽视的事实:搜索引擎优化里,技术层面的"可抓取性"比内容质量更底层。内容再好,爬虫进不来、抓不到、或者抓到的是一堆 5xx,排名都无从谈起。这篇就把"抓取可访问性"这条链路从上到下拆一遍。

第一步:先确认爬虫真的能进来

遇到收录暴跌,别急着改内容,先做"可访问性体检"。按顺序排查四个点:

1. 状态码是否正常

爬虫拿到的必须是 200。任何 4xx/5xx 都是收录杀手。用 curl 模拟一次:

curl -sI -A "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" \
  https://www.example.com/ | head -20

重点看返回码,以及有没有 X-Robots-Tag 这种会在 HTTP 头层面阻止索引的指令。有些 CDN 或 WAF 默认会拦截"看起来像机器人"的 UA,这是最常见的隐形杀手。

2. robots.txt 是否误封

很多人写 robots.txt 时随手加了一句 Disallow: / 用于测试环境,结果忘了删。检查:

curl -s https://www.example.com/robots.txt

还要注意通配符的坑。Disallow: /*.php$ 会连正常的动态页面一起封掉;Disallow: /search 会把 /search-tools/ 这种正常栏目也一起封掉,因为 robots 的前缀匹配不看目录边界。

3. 页面是不是纯 JS 渲染

百度爬虫对 JavaScript 的执行能力远不如 Google。如果你的正文完全靠前端框架异步加载,爬虫看到的可能是一个空壳 HTML。验证方法:关掉浏览器 JS,或者直接 curl 拿原始 HTML:

curl -s https://www.example.com/article/123 | grep -o '.*'
curl -s https://www.example.com/article/123 | wc -c

如果返回的 HTML 里完全没有正文文字,只有一堆 <div id="app"></div>,那就是首屏内容没有服务端渲染。对个人站长而言,最省事的方案是回到服务端渲染,而不是硬啃 SSR 框架。

4. 入口页面是否可达

爬虫靠链接发现页面。如果新文章只存在于 sitemap 却没有任何内链指向,收录会慢很多。至少要做到:首页有新文章入口、栏目页有分页、文章页之间有相关推荐。

第二步:把抓取预算花在刀刃上

爬虫每天在你站上花的抓取次数是有限的,这叫做抓取预算(Crawl Budget)。小站预算小,一旦浪费在无意义页面上,真正重要的文章就排不上号。

常见的预算黑洞有三类:

  • 无限组合的筛选参数:?color=red&size=xl&sort=price 这种参数组合能生成上万条 URL,内容却几乎相同。解决办法是在 robots.txt 里屏蔽参数,或给这类页面加 noindex。
  • 站内搜索结果页:?s=关键词 这种页面会被无限生成。必须屏蔽。
  • 失效的分页和归档:日期归档 /2021/03/、标签归档 /tag/xxx/ 如果内容重复严重,建议合并或 noindex。

具体做法:在 robots.txt 里用 Disallow: /*?s=、Disallow: /*?sort=,然后在 sitemap 里只提交真正需要收录的规范化 URL。记住一条原则:sitemap 是你想被收录的清单,robots.txt 是你不希望被浪费的清单,两者要配合使用,不要互相矛盾(比如一个 URL 既在 sitemap 里又被 robots 屏蔽,那纯属浪费)。

第三步:让收录变快的三个实操手段

主动推送而不是等爬

百度有"普通收录"里的 API 推送,Google 有 IndexNow 和 Search Console 的 URL 检查。个人站长最实用的是 IndexNow——它被 Bing、Yandex、Seznam 等共同支持,一次提交多平台可见。发完文章后立刻推送:

curl -X POST "https://api.indexnow.org/indexnow" \
  -H "Content-Type: application/json" \
  -d '{
    "host": "www.example.com",
    "key": "你的32位密钥",
    "keyLocation": "https://www.example.com/你的32位密钥.txt",
    "urlList": ["https://www.example.com/new-post.html"]
  }'

密钥文件要放在站点根目录,内容就是那串密钥本身。这一步能让新文章从"等几天"变成"几小时内"被感知。

把 sitemap 做对

sitemap 里每个 URL 都应有真实的 <lastmod>,并且这个时间必须是内容实质更新的时间,不是每次构建都刷新。如果 lastmod 天天变,爬虫会认为你在作弊,反而降低信任度。另外单文件 URL 数量不要超过 5 万,超过就拆成 sitemap 索引文件。

用日志验证抓取行为

最可靠的证据在服务器访问日志里。看百度爬虫最近都抓了什么:

grep -i "Baiduspider" /var/log/nginx/access.log | tail -50
grep -i "Baiduspider" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

如果发现爬虫一直在抓那些无意义的参数页,说明预算被浪费;如果最近一周完全没有爬虫记录,说明抓取通路出了问题——这时候回去查第一步的状态码和防火墙。

第四步:排查"抓到了却不收录"的原因

有时候状态码正常、robots 也没问题,但页面就是不收录。这时候要往"内容质量判定"方向查:

  • 内容太薄:几百字的页面,搜索引擎倾向于直接不索引。个人站应保证每篇有实质信息量。
  • 重复内容:同一篇文章有多个 URL 版本(带 www / 不带 www、http / https、带尾斜杠 / 不带),会被判定重复。用 canonical 标签指明主版本,并做好 301 归一。
  • 模板占比过高:如果站内所有页面的正文之外都是同一套导航、侧栏、页脚,正文又很短,容易被判为低质。
  • 新站沙盒期:新域名普遍有 1-3 个月的观察期,收录慢是正常的,别乱改。

特别注意 canonical 的写法必须绝对 URL 且自指。比如 https://www.example.com/a.html 的页面上,canonical 就应该写它自己,而不是写首页或栏目页。写成首页是新手最常见的错误,会让搜索引擎放弃索引这篇文章。

第五步:建立一套可重复的收录巡检

排查一次不够,要把这件事变成例行检查。建议每周做一次固定动作:

  1. 拉取最近 7 天的爬虫日志,统计总抓取次数和抓取的 URL 分布;
  2. 对比 sitemap 里的 URL 数量与索引量(在搜索资源平台看"索引量"曲线);
  3. 抽查 5 篇最新文章的 curl -sI 状态码和 title,确认没有异常;
  4. 检查 robots.txt 是否被意外改动(可以用 git 管理它,或者每周 diff 一次备份)。

把这套流程写成一个 shell 脚本挂到 cron 里,出问题时你第一时间就会知道,而不是等流量掉了半个月才发现。这也是个人站长相比大团队唯一能赢的地方——你的站小,所以你能把每个细节都盯住。

小结

收录问题的排查顺序永远是:状态码 → robots → 渲染方式 → 内链入口 → 抓取预算 → 内容质量。前面几项是"能不能抓",后面几项是"值不值得收"。大多数人一上来就纠结内容,其实前面任何一环出错,内容再好也没用。

回头开头那个例子,那位站长最终只是把那条 403 规则删掉,两周后收录恢复到 9000 多。技术排查的价值就在于此:它不玄学,一行命令就能证伪一个猜测。

补充:移动端适配与收录的关系

还有一类收录问题常被忽略——移动端可访问性。百度有独立的 Baiduspider-mobile 爬虫,Google 则已经全面转向移动优先索引(Mobile-first indexing)。如果你的桌面版正常但移动版布局错乱、弹窗遮挡正文,或者移动端返回了不同的、更薄的 HTML,收录和排名都会直接受影响。

排查方法很简单,用移动端 UA 请求一次,对比返回的 HTML 大小与正文内容:

curl -s -A "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15" \
  https://www.example.com/article/123 | wc -c

如果移动端返回的字节数和桌面端相差巨大,就要检查是不是做了"按 UA 分流"的跳转。移动端和桌面端应该呈现完全一致的内容,只是样式不同。历史上还有过 m. 子域名的做法,现在已不推荐,因为会造成内容重复,需要额外的 canonical 和 alternate 标注来纠正。

另外,移动端首屏加载速度也是排名因素。如果你的站用了未压缩的大图、阻塞渲染的外部字体、或者一堆同步加载的统计脚本,移动端体验会明显下降。建议至少做到:图片用 loading="lazy" 懒加载、CSS 内联首屏关键部分、非关键 JS 加 defer。

补充:HTTPS 与混合内容问题

现在 HTTPS 已是收录的基本门槛,但很多站点存在"部分资源仍是 http 引用"的混合内容(Mixed Content)问题。浏览器会拦截这些资源,导致页面显示不完整;而搜索引擎在渲染时也会看到残缺的页面,从而降低质量判定。

检查方法:用浏览器开发者工具看 Console 面板,或者抓取页面后搜索 http 引用:

curl -s https://www.example.com/article/123 | grep -o 'http://[^"'"'"' ]*' | head -20

输出中除了合法的 http://www.w3.org/2001/XMLSchema 这类命名空间声明外,其余的都应该是 https://。修复方式是统一替换为相对协议(//)或直接改成 https,同时确认 CDN 本身支持 HTTPS 回源。

Last modification:September 30th, 2026 at 08:24 pm

Leave a Comment