本文约 3,645 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:抓过了,就是不给收录
这是最让人窝火的一类状态:URL 检查工具里显示「抓取成功」,页面 HTML 完整、状态码 200,但索引状态一栏写着“已抓取,当前未编入索引”。你提交重新索引、等两周、再提交,状态纹丝不动。
“抓过了但不要”和“没抓到”是两件完全不同的事。后者是抓取路径或配额问题(对应「已发现,尚未编入索引」,见 已发现尚未编入索引的处理),前者是质量判定结果——Google 已经拿到内容并做出了“不值得进索引”的判断。所以解决方向也不在提交索引上,而在内容本身与页面携带的信号上。
原理分析:Google 为什么抓了却不收录
Google 的索引是有成本的:存储、更新、服务都要资源。因此对每一个页面都会做一个划算与否的评估。触发“不收录”判断的常见原因有四类:
一是内容稀薄(thin content)。 正文信息量过低、只有几行字、或者内容由模板生成、大量页面共享同一段正文。自动生成的聚合页、只有一句描述的分类页、以及“XX 怎么样”这类模板化页面是重灾区。
二是高度重复。 站内存在大量内容近乎一致的页面(参数组合、城市页换地名、产品页换型号),Google 会索引其中一个,其余标记为重复而排除。注意:这时报告里也可能显示「替代网页」而不是「已抓取未索引」,两者经常同时出现。
三是质量信号缺失。 没有作者、没有更新时间、没有内部链接指向、没有外部引用、页面停留时间极短——这些不构成直接的“不收录”原因,但会累积成低质量判断。
四是技术信号矛盾。 页面返回 200 但正文靠 JS 渲染(抓取到的快照是空的)、canonical 指向不存在的页面、noindex 被误加在某个模板里、移动端与桌面端内容差异过大。
| 排查方向 | 验证方法 | 判定标准 |
|---|---|---|
| 内容稀薄 | 统计正文字数与独有段落 | 正文低于 300 字且无独有内容 |
| 内容重复 | 与站内其他页面做相似度比对 | 相似度 > 80% 且无差异化信息 |
| JS 渲染 | 看 URL 检查工具里的抓取页面 HTML | 快照里没有正文 |
| canonical 矛盾 | 查看页面源码 canonical 目标 | 目标页 404 或不在索引中 |
| 误加 noindex | 搜索源码中的 robots meta | 模板里存在无条件的 noindex |
| 内链缺失 | 统计指向该页的内部链接数 | 内链数为 0 |
保姆级实操
步骤 1:用 URL 检查工具看“抓取到的页面”。 在 GSC 顶部搜索框输入问题 URL,进入后点「查看抓取到的页面 → 更多详情」,对照三个标签页:HTTP 响应(状态码、IP)、HTML(快照源码)、网页可用性和截图(渲染结果)。如果 HTML 快照里没有正文,先解决渲染问题。
步骤 2:确认没有误加 noindex 或 canonical 矛盾。 直接看源码里 <meta name="robots"> 与 <link rel="canonical"> 的值。WordPress 站点常见的是 SEO 插件在某个模板(比如归档页)默认输出了 noindex。
步骤 3:批量筛出稀薄内容。 与其凭感觉挑,不如让脚本把正文字数过低的页面全部列出来:
<?php
// WordPress 稀薄内容检测:列出正文字数低于阈值的已发布文章
require_once( '/path/to/wp-load.php' );
$query = new WP_Query( [
'post_type' => [ 'post', 'page' ],
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
] );
$threshold = 300; // 中文正文字符数阈值
$thin = [];
foreach ( $query->posts as $post_id ) {
$raw = get_post_field( 'post_content', $post_id );
$text = trim( wp_strip_all_tags( strip_shortcodes( $raw ) ) );
$length = mb_strlen( preg_replace( '/\s+/u', '', $text ), 'UTF-8' );
$internal_links = 0;
if ( preg_match_all( '/<a\s[^>]*href=["\']https?:\/\/[^"\']*example\.com[^"\']*["\']/i', $raw, $m ) ) {
$internal_links = count( $m[0] );
}
if ( $length < $threshold || 0 === $internal_links ) {
$thin[] = [
'id' => $post_id,
'title' => get_the_title( $post_id ),
'length' => $length,
'inlinks' => $internal_links,
'url' => get_permalink( $post_id ),
];
}
}
usort( $thin, fn( $a, $b ) => $a['length'] <=> $b['length'] );
foreach ( $thin as $row ) {
printf( "%6d 字 | 内链:%2d | %s | %s\n",
$row['length'], $row['inlinks'], $row['title'], $row['url'] );
}
printf( "\n合计 %d 个页面需要复核\n", count( $thin ) );
步骤 4:对稀薄页面做三选一处置。 有补充价值的就补充(加真实数据、案例、步骤、截图说明);能被其他页面覆盖的就 301 到覆盖它的页面;既没价值也不该存在的,返回 404 或 410。不要留着不动,留着只会持续拉低整站质量评估。
步骤 5:给保留的页面补差异化信息与内链。 补上作者、更新时间、数据来源、以及相关页面的内部链接。对城市页、型号页这类模板页,务必加入真实差异(本地价格、库存、具体参数),只换地名必死。
步骤 6:重新提交并观察。 用 URL 检查工具点「请求编入索引」,然后在索引报告的对应分组里点「验证修复」。注意:大规模提交无效,Google 不会因为提交次数多就改变质量判断。
常见踩坑
- 反复点「请求编入索引」。 提交不改变质量判定,只会浪费配额。
- 只补字数不补信息。 把 300 字扩到 1500 字但全是同义改写,判定不会变。
- 给分类页、标签页写一大段通用介绍。 这仍然是与所有同类页面重复的模板内容。
- 认为改了 canonical 就能立刻收录。 canonical 只做归一,不提升质量。
- 忽略移动端差异。 移动优先索引下,移动端正文缺失等于页面缺失。
- 用 iframe 或懒加载藏正文。 抓取快照里没有,就等于没有。
- 案例: 一个 SaaS 站有 240 个“XX vs YY”对比页,全部由模板生成:换两个产品名,正文三段通用描述。GSC 里 210 个页面长期处于「已抓取,当前未编入索引」。后来团队只保留 18 个真实有对比数据的页面(含功能对照表、价格对比、迁移成本),其余 222 个 301 到对应的产品页。两个月后,那 18 个页面全部进入索引,其中 6 个拿到了精选摘要。模板化规模生产在 Google 这里是负资产。
总结
遇到「已抓取,尚未编入索引」,第一步永远是看 URL 检查工具里的抓取快照——先排除渲染与 noindex/canonical 的技术问题;第二步用脚本筛出稀薄内容并按模式归类;第三步对每个页面做「补充 / 归并 / 下线」三选一。判断标准:如果这个页面消失了,用户会不会失去一个独特答案?不会,那它就不该存在于索引里。把这个标准套到每一批被排除的页面上,决策会快很多。
