搜索抓取

发现不等于抓取:URL 被蜘蛛看到之后还要过几道关

蜘蛛发现一个 URL,并不等于它马上就会去抓。发现、抓取、索引是三件不同的事,中间还隔着排队的等待、robots.txt 的拦截和服务器响应的考验。本文拆解这几个环节各自管什么,并给出让重要 URL 少绕路的实操做法。

搜索抓取

发现不等于抓取:URL 被蜘蛛看到之后还要过几道关

做站点运营时,很容易把两件事混为一谈:蜘蛛在日志里出现了一次,就以为这个 URL 已经被抓;在 Sitemap 或内链里放了一个新地址,就以为蜘蛛马上会来。实际上“发现”只是这条路的起点,后面还有几道关要过。

发现、抓取、索引是三件独立的事

把这三个动作拆开看,很多困惑会自己消失:

  • 发现:蜘蛛从某个入口知道了这个 URL 存在。入口通常是站内链接、Sitemap、外站链接,或者历史抓取记录里出现过的地址。
  • 抓取:蜘蛛真的发起了请求,取回了 HTML、状态码和响应头。这一步由抓取调度决定,和“知不知道”没有直接关系。
  • 索引:抓回来的内容通过了质量与重复判断,才可能进入索引参与展示。

三段路各自有各自的规则。发现靠链接结构,抓取靠调度节奏和 robots.txt,索引靠内容判断。用其中一段的指标去推断另一段的结果,往往会得出错误结论。

被发现的 URL 只是进了一份待办清单

蜘蛛不会随发现随抓。它更常见的做法是先把这个地址记下来,之后按自己的节奏安排请求。同一天被发现的 URL,抓取时间可能相差很远,原因通常不在单个页面上,而在于:

  • 站点整体被抓取的频率高低,历史表现好的站点往往排得更靠前;
  • 这个 URL 有多少入口、入口在什么位置,导航和正文里的链接通常比页脚、深层列表更受重视;
  • 上一次抓取这个目录时的响应情况,如果经常超时,调度会趋于保守;
  • URL 本身的形态,带大量参数的地址往往被当成低优先级。
想验证一个 URL 有没有被抓,看服务器访问日志比看收录结果可靠得多。前者是事实,后者是判断。

robots.txt 管的是抓取,不是索引

很多人把 robots.txt 当成“下架开关”,这是最常见的误用。Disallow 拦的是抓取动作:蜘蛛不会去取这个页面。但如果这个 URL 在别处有链接被看到,它仍然可能出现在结果里,只是没有摘要和快照。

真正决定“要不要展示”的是 noindex,而它站在更后面一道。这里有个容易踩的顺序问题:noindex 必须被读到才生效,而被 robots.txt 拦住的页面,蜘蛛读不到那行 meta。所以想让一个页面既不收录也不被抓,两个指令要配合使用;如果只想让它不被抓,就别指望 noindex 起作用。

服务器状态决定 URL 能不能顺利走下去

URL 从清单里被挑出来之后,还要过服务器这一关。持续返回 5xx、连接被中断、响应时间过长,都会让调度对这个目录甚至整站降低抓取意愿,重试也可能被推迟。常见的影响包括:

  • 单个栏目频繁超时,该栏目下新 URL 的抓取会被一起拖慢;
  • 间歇性的 5xx 比稳定错误更难排查,因为抓取记录看起来时好时坏;
  • 抓取高峰时段资源被占满,蜘蛛正好赶上,会误判站点状态。

所以服务器稳定性不是一个纯技术指标,它直接影响 URL 从被发现到被取回之间要走多久。

让重要 URL 少绕路的几个做法

  1. 新页面别只放进 Sitemap,同时在栏目页或相关文章里给出真实入口,多一个入口就多一次被发现的机会。
  2. Sitemap 保持准确,只放返回 200 的地址。塞进大量无效 URL,会让这份文件的可信度下降。
  3. 新 URL 分批上线,一次放出几百个地址,调度上很难都被同等对待。
  4. 减少中间跳转,重要页面尽量直达,别让蜘蛛穿过好几层重定向才拿到内容。
  5. 定期看日志,找出长期没有抓取记录的目录,回头检查它们的内链入口和响应状态。

复查是另一条更慢的队列

页面抓到之后并不结束。内容更新了,蜘蛛还需要再来一次,而复查的节奏通常比首次抓取更慢。Sitemap 里的 lastmod 与实际修改时间保持一致,能帮助它判断哪些页面值得优先回访;如果这个字段长期乱写,反而会被忽略。

把发现、抓取、索引分开看,运营动作就有了明确的落点:入口不足就补内链,抓取不来就查 robots 与日志,抓了不收录就回到内容本身。混在一起想,只会得出“蜘蛛不爱我的站”这类没有操作价值的结论。