搜索抓取

抓取覆盖率上不去:站点里大半 URL 没被蜘蛛碰过,问题通常在这几处

Sitemap 提交了几万条 URL,服务器日志里被抓过的却只有一部分。本文先区分 URL 发现与抓取的区别,再分析入口过深、孤岛页、参数地址稀释预算、服务器长尾延迟等常见原因,并给出用日志与 Sitemap 做差集、补内链、压缩层级的可执行做法。

搜索抓取

抓取覆盖率上不去:站点里大半 URL 没被蜘蛛碰过,问题通常在这几处

不少站长核对服务器日志时都会遇到同一个问题:Sitemap 里提交了几万条 URL,被蜘蛛真正抓过的却只有一部分,剩下的大半像是不存在。这不一定是内容质量问题,更常见的原因是抓取覆盖率没做起来——站点里可被抓取的 URL 有多少,蜘蛛实际走过多少,两者之间的差距往往出在结构和入口上。

URL 被“发现”和被抓取,是两件事

蜘蛛先通过外链、内链、Sitemap、提交入口知道某个地址存在,把它放进待抓队列,然后再按队列顺序、抓取预算和站点响应情况决定什么时候来。也就是说,URL 被写进 Sitemap 只是拿到了号码牌,并不等于会被立刻叫号。如果一个页面既没有内链指向,也没有外链提到,Sitemap 就是它唯一的入口,优先级自然偏低。

覆盖率上不去,通常卡在这几处

入口太深,内链太稀

从首页点五层才到详情页,中间还只有一条链接,蜘蛛爬到这里时预算已经消耗得差不多了。深层页面不是不能被抓,而是抓取频率会被明显压低,站点一更新,它们往往排在队尾。

孤岛页:只有 Sitemap 认识它

有些页面是程序生成后直接塞进 Sitemap 的,站内没有任何地方链过去。这种页面在蜘蛛看来缺乏上下文,既不知道它和哪些页面相关,也拿不到锚文本信息,很容易长期停在“已发现未抓取”。

参数地址稀释预算

筛选、排序、分页参数组合出的地址动辄成千上万,内容却大同小异。蜘蛛在这些地址上花掉的请求数,会直接挤占正常内容的抓取额度。用 robots.txt 屏蔽无意义参数、给必要参数固定顺序,能把预算还回来一部分。

服务器慢,预算耗在等待里

平均响应时间看着还算正常,但长尾请求偶发很慢,蜘蛛的并发连接会被这些慢请求占住。抓取预算是按时间和并发算的,等待久了,能抓的页面数就下来了。数据库慢查询、未缓存的列表页、第三方脚本阻塞,都可能造成这种结果。

重复内容与状态码问题

同一份内容挂在多个地址、软 404、层层重定向,都会让蜘蛛把力气花在走回头路上,而不是去发现新的 URL。

怎么算一遍自己的抓取覆盖率

  1. 导出 Sitemap 或用站内爬取工具跑一遍,得到站点可抓 URL 列表;
  2. 从服务器日志里筛出主流搜索蜘蛛的请求,去重后得到被抓 URL 列表;
  3. 两边做差集:从未被抓过的、只被抓过一次的、被抓过但状态码异常的,分开看;
  4. 按目录和模板类型归类,判断是某类页面整体缺失,还是零散分布。

差集里如果某一类模板集中出现,多半是内链或入口的问题,而不是内容本身。

把覆盖率提上来的几个动作

  • 补内链:从相关文章、聚合页、导航里给出至少一条稳定路径,锚文本写清楚指向什么。
  • 压缩层级:重要内容尽量控制在三到四跳以内,列表页用分页或加载更多保留可抓入口。
  • 减少无效地址:参数、会话 ID、排序变量能固定就固定,不能固定就屏蔽。
  • 保证响应稳定:单独观察蜘蛛请求的长尾延迟,缓存高频访问页面,避免高峰时段整站变慢。
  • Sitemap 与内链配套:Sitemap 负责告诉蜘蛛有哪些地址,内链负责告诉它值不值得走,缺了哪一边效果都会打折。
抓取覆盖率是长期运营指标,不是一次性任务。站点结构每变一次、内容模板每加一种,都值得重新算一遍差集,看看蜘蛛是不是又被挡在了某条路径之外。