Google 只爬首页,从不爬文章页

Search Console 天天爬你首页,文章页却卡在 "Discovered — currently not indexed"。先分清是发现失败还是抓取预算失败,再对症修。

Search Console → Crawl Stats 显示 Googlebot 每天访问首页几十次,但 /articles/* 加起来都没几次。新文章发布几周都不被抓。Sitemap 早就提交了,也不见效。

最快的一步判断(60 秒): 跑一下 curl -sL https://yourdomain.com/ | grep -c "/articles/"。如果这个数接近 0,说明 Google 从首页 HTML 里根本看不到你的文章链接(属于发现失败)——先修这个。如果数量正常、但页面还是卡在 “Discovered — currently not indexed”,那是抓取预算 / 质量失败,修法完全不同。下面 Step 1 会把这个判断做精确。

症状

  • Crawl Stats 显示首页每日被命中,但 /articles/* 很少被命中
  • 新文章 2-4 周才被发现(远超正常的 3-7 天)
  • Sitemap 已提交,但 Google 很少抓里面的 URL
  • URL Inspection 把文章 URL 报成 “Discovered — currently not indexed”“URL is unknown to Google”

你属于哪一类?

这两种根因要用相反的修法。动手前先用下表确认自己属于哪一类。

信号发现失败抓取预算 / 质量失败
curl 首页后数 /articles/ 链接0 或少于 5数量正常
URL Inspection 状态”URL is unknown to Google""Discovered — currently not indexed”
URL 是否在 sitemap 里、且能通过 <a href> 到达?
Google 实际在说什么”我从没发现过这个 URL""我发现了,但暂时不想花预算”
去看Step 2-3Step 4-8

“Discovered — currently not indexed” 的确切含义是:Google 知道这个 URL(来自你的 sitemap 或某个链接),但还没去抓——这几乎总是抓取预算、排队或感知质量的决策,而不是技术性封锁。(Google 的抓取预算文档指出,抓取预算只有在站点超过 100 万页、或超过 1 万页且内容每天大改时才会成为真正的瓶颈——所以小站上这通常是质量 / 内链信号,而非真的撞到预算上限。)

常见原因

1. 首页用 JS 渲染文章链接,Google 看不到

最常见。首页”最新文章”列表是 React/Vue/Svelte 在 hydration 之后挂上去的,所以 Googlebot 首次抓到的原始 HTML 里没有任何指向文章的 <a href>

如何判断:

# 不执行 JS 看首页(这大致就是 Googlebot 首次抓到的内容)
curl -sL https://yourdomain.com/ > home.html

# 数原始 HTML 里的文章链接
grep -oE 'href="/articles/[^"]+"' home.html | wc -l
# 0 或很少 = 链接靠 JS 渲染,不在 HTML 里

Google 确实会渲染 JS,但渲染是单独排队的,可能比首次 HTML 抓取晚几天到几周。出现在首个 HTML 响应里的链接会被立即发现;只在 hydration 之后才出现的链接不会。

2. 首页只展示最新 5-10 篇,老文章要点 3 次以上才能到

首页(5 篇最新)→ /blog(分页 page 1)→ /blog/page/2 → 文章

距首页 3 次以上点击 = Google 把它当低优先级,很少去抓。

3. Sitemap 里没有文章 URL,或 sitemap 超出上限

# 数 sitemap 里的 URL
curl -s https://yourdomain.com/sitemap.xml | grep -c "<loc>"
# 应大致等于你站的实际文章数

手动维护的 sitemap 经常漏掉新文章。按 sitemaps.org 协议,单个 sitemap 文件最多含 50,000 个 URL,且未压缩不得超过 50MB;任一上限被突破,Google 会拒收该文件,你必须拆成 sitemap index。

4. 文章页太薄,Google 把整个路径降优先级

如果 Googlebot 头几次抓 /articles/* 抓到的都是不足约 300 字、或模板化的页面,它会学到”这类 URL 不值得回访”,然后把整个目录的优先级降下来,而不只是那一篇薄文。

5. 内链锚文本太通用(“read more”)

<a href="/articles/foo/">read more</a>
<a href="/articles/bar/">查看全文</a>

通用锚文本是弱发现信号。Google 看到有链接,却完全不知道它指向什么主题,于是目标页几乎得不到排名或抓取优先级上的加成。

6. 文章页 URL 被 robots.txt 屏蔽

Disallow: /articles/draft/

写得太宽的规则(比如 Disallow: /a)会悄悄屏蔽掉 /articles/。用 URL Inspection → “Page indexing” 确认——如果中招,它会显示 “Blocked by robots.txt”。注意:在这里用 noindex 比没用还糟——Google 仍会花一次抓取把页面取回来才看到标签,所以 robots.txt 只用于你真的永远不想被抓的页面。

7. 服务器对 Googlebot 慢 / 返回 5xx

当你的服务器响应又快又稳时,Google 的抓取容量上限会上升;变慢或报错时则下降。频繁超时或 5xx 会让 Google 主动给整站降速。

如何判断: Crawl Stats → “Crawl responses” → 看平均响应时间以及 5xx / 超时响应的占比。响应时间上升、或错误占比不低,就是该动手的信号(Google 没有公布硬性的毫秒阈值)。

最短修复路径

Step 1:先分清是发现失败还是抓取预算失败

# 关 JS 看首页源码,数文章链接
curl -sL https://yourdomain.com/ | grep -c "/articles/"
  • 0 或少于 5 → 发现失败 → Step 2-3
  • 数量正常 → 抓取预算 / 质量失败 → Step 4-8

再在 URL Inspection 里交叉验证某一篇具体文章:“URL is unknown to Google” 确认为发现失败;“Discovered — currently not indexed” 确认为预算 / 质量这一类。

Step 2:把列表组件改成服务端渲染(SSR / SSG)

如果用 Next.js:

// 错:客户端 useEffect 后 fetch(链接不在首个 HTML 里)
function LatestPosts() {
  const [posts, setPosts] = useState([]);
  useEffect(() => { fetch('/api/posts').then(r => r.json()).then(setPosts); }, []);
  return posts.map(p => <a href={p.url}>{p.title}</a>);
}

// 对:getStaticProps(链接直接写进 HTML)
export async function getStaticProps() {
  const posts = await getAllPosts();
  return { props: { posts } };
}

Astro 默认就是 SSG,它的 <a href> 链接本来就在 HTML 里。纯 React 的 SPA 可以用 react-snap、Prerender.io 预渲染,或迁到一个会直接输出 HTML 的框架。部署后再跑一遍 curl ... | grep -c,那个数应该会跳上去。

Step 3:加一个分页的 /articles 总索引,并从导航链接它

---
// src/pages/articles/index.astro
import { getCollection } from 'astro:content';
const posts = await getCollection('posts');
const sorted = posts.sort((a, b) => b.data.publishedAt - a.data.publishedAt);
---
<h1>全部文章 ({sorted.length})</h1>
<ul>
  {sorted.map(p => (
    <li>
      <a href={`/articles/${p.slug}/`}>{p.data.title}</a>
      <span>{p.data.publishedAt.toLocaleDateString()}</span>
    </li>
  ))}
</ul>

首页和主导航都链到 /articles/,这样任何文章从站内任何位置都最多两次点击可达。

Step 4:修正 sitemap

每篇文章 URL 都要有真实的 lastmod

<url>
  <loc>https://yourdomain.com/articles/foo/</loc>
  <lastmod>2026-05-21</lastmod>
</url>

lastmod 必须是真实修改时间。给每个 URL 都盖上今天的日期不会加速任何事——Google 会把不可靠的 lastmod 当噪音,进而对你整站忽略这个字段。

超过 50,000 个 URL 或 50MB,就拆成 sitemap index:

<!-- sitemap-index.xml -->
<sitemapindex>
  <sitemap><loc>https://yourdomain.com/sitemap-articles.xml</loc></sitemap>
  <sitemap><loc>https://yourdomain.com/sitemap-pages.xml</loc></sitemap>
</sitemapindex>

Step 5:用 URL Inspection 强制抓取 5-10 篇优先文章

这是确认页面本身没被屏蔽最快的办法,同时在你的结构性改动生效之前先把收录启动起来。

  1. Search Console → URL Inspection → 粘贴文章 URL。
  2. “Test Live URL”——确认 “URL is available to Google”,并且渲染后的 HTML 里有你的正文(不是空壳)。
  3. “Request Indexing”

截至 2026 年 6 月,这个按钮被限速到每个资源每天约 10-12 个 URL,超额后会灰掉 24 小时——所以把它花在价值最高的页面上。需要批量提交,就用 URL Inspection API,配额高得多。(针对 Google 别折腾 IndexNow:截至 2026 年,Google 仍消费 IndexNow,只有 Bing/Yandex 用。)

Step 6:审最近 10 篇文章的质量基线

每篇应当具备:

  • 仅一个真正的 <h1>
  • 一段导语(80 字以上)
  • 正文 600 字以上
  • 至少 2 处来自其他文章、指向本篇的内链
  • 至少 1 张带 alt 文本的图片

低于这条线的页面先改好再发,否则会拖累整个 /articles/* 的优先级。

Step 7:修内链锚文本

<!-- 差 -->
<a href="/articles/foo/">read more</a>

<!-- 好 -->
<a href="/articles/foo/">Astro 部署到 Vercel:完整指南</a>

带主题词的锚文本是很强的发现与排名信号。每篇新文章发布后一天内,从已收录的高流量页面给它加 2-3 处上下文相关的内链——这是让 “Discovered” 页面真正被抓取的最大杠杆。

Step 8:修服务器对 Googlebot 的响应时间

# 用 Googlebot 的 user-agent 给一个页面请求计时
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
  -w "%{time_total}\n" -o /dev/null https://yourdomain.com/articles/foo/
# 目标是远低于 1.5s

慢 → 加 CDN、静态化缓存、压缩服务端渲染时间。更快更稳的响应会抬高 Google 给整站的抓取容量上限。

如何确认修好了

  1. 再跑 curl -sL https://yourdomain.com/ | grep -c "/articles/"——链接数现在应能反映你真实的文章数。
  2. URL Inspection 里,原本卡住的文章应从 “Discovered — currently not indexed” 转到 “Crawled”,再到 “Indexed”(排队需要几天到几周)。
  3. Crawl Stats → “By response → OK (200)” 在随后 1-2 周里应显示 /articles/* 命中数上升。确认恢复看的是目录级的趋势,而不是某一天。

哪些情况可能不是你操作错了

大站上 Google 会刻意给每个目录的抓取率限速。这不是站坏了,而是 Google 判定你的站赚到了多少预算。这里的杠杆是权威度:积累外链、提升整站质量,让 Google 随时间分配更多抓取预算。

容易误判的情况

  • 在 sitemap 里设 <priority> 有用——Google 几乎完全忽略它。
  • 反复重交 sitemap 有用——Google 早有你的 sitemap,重交并不会重新排抓取优先级。
  • 往首页堆关键词有用——堆词反而触发 spam 信号。
  • Ping sitemap 能加速——Google 已在 2023 年彻底废弃 sitemap ping 接口,旧的 /ping?sitemap= 现在返回 404。

预防建议

  • 重要页面绝不只靠 JS 渲染链接,永远在 HTML 里输出 SSR / SSG 的 <a href>
  • 让每篇文章从站内任何位置都最多两次点击可达(首页 → /articles 索引 → 文章)。
  • 内链按主题组织成 cluster,用 hub 页集中链接。
  • 每条内链锚文本都用主题词,绝不用 “more” / “read”。
  • 盯着 Crawl Stats → 响应时间和错误率,任一上升就动手。

FAQ

Q:现在 Ping sitemap 还有用吗? A:没用。Google 在 2023 年废弃了 sitemap ping 接口,旧 endpoint 现在返回 404。最强的发现信号是这个 URL 能否从你自己站内权威页通过 <a href> 直接到达。

Q:我的文章显示 “Discovered — currently not indexed”,最有效的单点修法是什么? A:从已收录的高流量页面给它加 2-3 处上下文内链,然后用 URL Inspection → “Request Indexing”。这一组合同时处理了优先级信号和抓取排队。

Q:每天能强制抓取多少个 URL? A:截至 2026 年 6 月,URL Inspection → “Request Indexing” 每个资源每天约 10-12 个 URL,超额后灰掉 24 小时。要更大量,用 URL Inspection API。

Q:把 XML sitemap 换成 JSON 有用吗? A:没用——sitemap 格式不是瓶颈,发现(内链)和质量才是。

Q:用 Cloudflare 缓存能改善 Googlebot 响应时间吗? A:能。文章页可静态缓存时,命中缓存能把响应时间从几百毫秒降到几十毫秒,从而抬高 Google 给整站的抓取容量上限。

相关阅读

标签: #SEO #Google #Search Console #收录 #排查 #抓取预算