抓取预算优化:让蜘蛛把额度花在正文上

一、抓取预算不是玄学,是排队加限速

很多站长第一次听到「抓取预算」这个词,是在 Search Console 的某个说明里,或者一篇讲「为什么新文章不收录」的文章中。概念本身不复杂:搜索引擎对每个站点分配了一个隐性的额度,在单位时间里最多抓多少个页面、并发多少个连接。额度不是固定的,它会随站点响应速度、内容更新频率、历史抓取成功率、站点重要性动态调整。额度用完了,剩下的 URL 就排队等着,等到下一个周期再抓。

这里容易被误解的一点是:抓取预算并不是「一天能抓多少页」这么简单。真实的调度模型至少有三个维度——并发连接数(同时开几个请求)、抓取速率(每秒或每分钟多少个请求)、主机负载容忍度(服务器返回 5xx 或超时时会立即降速)。三个维度里任何一个成为瓶颈,整体抓取量就上不去。理解这一点之后,优化就有了明确方向:不是去「申请更多额度」,而是把有限的额度花在值得抓的页面上,并且让每次抓取都能成功返回 200。

对个人站长来说,抓取预算真正产生影响的场景只有几类:文章数量上千、有大量分类和标签归档页、有站内搜索或筛选参数、有分页很深的列表。站只有几十篇文章的时候,额度永远用不完,这个优化做了也看不出效果。所以第一步先判断自己是不是那几类站,不是的话可以跳过。

二、先量:四个能看出问题的地方

没有数据支撑的优化全是猜。低成本能看到抓取状况的地方有四个,不需要任何付费工具:

  • 服务器访问日志:按 UA 里的 Googlebot、bingbot、Baiduspider 过滤,统计每天的请求数、状态码分布、抓取最多的路径。
  • Search Console 的抓取统计(如果站点已接入):能看每天总请求数、按响应类型拆分、按文件类型拆分。最有用的是「主机状态」里响应时间的趋势。
  • 已编入索引的页面数 vs 已发现但未编入索引的页面数:后者持续增长且不下降,通常意味着预算不够或者页面质量不足。
  • 站点自己的 URL 总清单:sitemap 里有多少条、这些条目里有多少是 200、多少是 3xx、多少是 404 或 500。

把访问日志里的数据聚合出来,只需要一条 awk 命令。下面这段按天统计 Googlebot 的请求数、状态码和平均响应时间:

awk '$0 ~ /Googlebot/ {
  split($4, t, ":");
  day = substr($4, 2, 11);
  cnt[day]++;
  code = $9;
  codes[day" "code]++;
  split($10, s, " ");
} END {
  for (d in cnt) printf "%s total=%d\n", d, cnt[d];
}' /var/log/nginx/access.log

真正要注意的是日志里那些抓取次数很多但没用的路径。典型的坏路径有三类:站内搜索结果页、带一堆筛选参数的列表页、每次请求都生成新 URL 的排序列页(比如 ?order=asc&page=3&r=123)。这些页面的共同特征是「URL 无限多、内容互相重复、对收录没有贡献」。如果日志里前二十个被高频抓取的 URL 有一半是这类,那预算基本都浪费在这里了。

三、给无限 URL 踩刹车:robots 与 noindex 的正确分工

处理参数页和搜索页,最常见的错误是把 Disallow 和 noindex 混在一起用。robots.txt 里的 Disallow 是「别来抓」,noindex 是「抓了也别收录」。这两个手段单独用都对,混用就会互相抵消:页面被 Disallow 之后,爬虫进不去,也就读不到页面里的 noindex,于是那个 URL 会一直挂在索引里(虽然内容可能是空的),或者反复被尝试抓取。

正确的分工是:

  • 完全无价值、且 URL 数量无限的页面用 Disallow:站内搜索结果页、后台路径、带会话 ID 的临时链接。Disallow: /search、Disallow: /*?s= 这种粗粒度规则,用通配符一次覆盖。
  • 有价值但不需要被收录的页面用 noindex:筛选后的列表页、排序页、重复的归档页。这些页面需要爬虫进来读到 meta 标签,所以不能 Disallow。
  • 不存在或已删除的页面返回 404 或 410:不要让它们 301 到首页。软 404 会让爬虫反复回来确认,纯属浪费预算。

robots.txt 里的通配符只有 * 和结尾的 $ 两个,没有正则。想覆盖 ?page= 这种任意取值的参数,写 Disallow: /*?page= 就够,不需要穷举。Allow 的优先级在同一长度下高于 Disallow,所以可以在整体 Disallow 之后单独放行某个必要路径,这是常见写法。

四、sitemap 只放该抓的,别把所有 URL 塞进去

sitemap 的作用是「告诉爬虫哪些页面值得抓」,不是「把站上所有 URL 列一遍」。把搜索页、标签云、分页第 50 页全塞进 sitemap,等于把预算摊薄到没有价值的页面上。

一个健康的 sitemap 应该满足三条:只包含返回 200 的 URL、只包含希望在搜索结果里出现的页面、lastmod 时间真实反映内容修改时间。第三条经常被忽略——很多自动生成工具会把 lastmod 写成生成时刻,于是每次重新生成,所有页面的 lastmod 都变成今天。爬虫看到「一千个页面同时更新」,实际访问发现内容没变,会对这个信号的可信度打折。

正确做法是 lastmod 取自数据库里文章的真实修改时间,只有发布时间没有修改时间就去发布时间。生成的 sitemap 在更新之后,主动通知搜索引擎:Google 用 Search Console 提交或在 robots.txt 里声明 Sitemap: 行;百度和必应各有自己的推送接口,能一条一条提交 URL,比等着爬虫来发现快得多。推送有配额,别把配额花在列表页和标签页上。

五、让每次抓取都成功:响应速度和状态码

抓取预算是动态的,服务器响应慢会直接把它压下去。Google 官方对 Crawl Budget 的说明里明确提到:如果服务器响应时间持续偏高(比如超过一秒),爬虫会自动降低并发。这意味着「服务器慢」不只是用户体验问题,它还会让新文章更晚被发现。

针对爬虫的响应速度优化,比通用的性能优化更有针对性,做起来也简单:

  • 动态页面生成要快:文章详情页如果有数据库查询,加缓存层;实在快不起来,把热门文章生成静态文件,Nginx 直接返回。
  • 不要对爬虫返回 5xx:限流、WAF 误杀、备份时锁表,都会让爬虫吃到 500 或 503。连续几次 5xx 之后爬虫会退回几天后再来,非常伤。
  • 对爬虫宽容一点:限流规则里给 Googlebot 和 bingbot 单独放行,或者给一个更高的速率上限。但别用 UA 做白名单——UA 可以伪造,伪装成爬虫的采集器非常多。更稳的做法是同时做反向 DNS 校验,正查反查都对得上才当作真爬虫。
  • 避免重定向链:一个 URL 跳三次才到目标,等于三次请求的预算。所有重定向都应该是一跳,直接到最终地址。

六、分页与归档页的处理:最容易漏的一块

一个一千篇文章的站点,详情页一千个,分类归档十来个,标签几百个,分页如果按每页十篇算还有一百个。标签页和分页加起来可能比正文还多,这是抓取预算被摊薄的主要来源。

处理原则按价值分层:

  1. 分类归档页保留并收录:分类是主题聚合的入口,有真实的搜索需求,值得被收录。但只保留一层,不做「分类第 7 页」这种深分页。
  2. 标签页看情况:标签数量少、每个标签下有五篇以上真实相关文章,可以保留;标签有几百个、每个标签只挂一两篇,整片 noindex,并考虑在后台合并标签。
  3. 分页第二页之后统一 noindex,follow:分页本身不收录,但链接要跟,保证爬虫能顺着翻到老文章。别在分页上加 rel="canonical" 指回第一页——那会让第二页上的文章链接被认为属于第一页,反而丢掉发现路径。
  4. 不要有「无限制翻页」:前端做「加载更多」时用按钮而不是无限滚动,无限滚动会让爬虫抓不到后面的内容。

七、把抓取预算变成月度巡检

抓取预算不是一个改完就结束的项目,它随着站点内容增长会重新恶化。最简单的做法是每月做一次十五分钟的巡检,固定四个动作:

第一,看日志里被抓取次数前二十的路径,有没有新出现的垃圾路径。第二,看 sitemap 里的 URL 总数和实际返回 200 的数量是否一致,差太多说明有死链堆积。第三,看有没有爬虫在疯狂重试某个返回 5xx 的地址。第四,统计每天被抓取的 URL 里,有多少是最近三十天内发布或修改过的——这个比例越高,说明预算越花在「新鲜的、真正需要被收录的内容」上。

grep 'Googlebot' /var/log/nginx/access.log \
  | awk '{print $7}' | sort | uniq -c | sort -rn | head -20

这条命令给出的是「谁被抓得最多」的原始清单。如果排在前面的全是 /tag/、?page=、/search 这类路径,就说明前面的规则没生效或者被站内链接重新暴露了——爬虫是靠链接发现 URL 的,robots 挡得再严,只要页面上还在输出这些链接,它就会一直尝试。这种情况下除了改 robots,还得把页面上的「标签云」「热门搜索」这类大量输出链接的模块收一收。

八、三个常见误区

误区一:抓取次数越多越好。 抓取次数多但都是垃圾页面,比抓得少但每篇都是正文更糟。判断标准不是总量,而是「被抓起的新内容占总抓取量的比例」。

误区二:用 CDN 就能解决抓取问题。 CDN 能降低响应时间,对抓取速率有帮助;但如果返回的 HTML 里还挂着大量无用链接,预算照样被摊薄。CDN 解决的是「每次抓取快不快」,解决不了「抓的是不是该抓的」。

误区三:新站不用管预算。 新站的预算最小,反而更敏感。新站上线时如果一次性提交了五千个 URL,其中大部分是空分类和标签页,爬虫抓一轮之后会认为整站质量不高,把额度降下来,后面发的好文章反而排不上队。新站应该反过来做:只提交正文,等收录稳定了再逐步放开归档页。

九、小结

抓取预算的三句话总结:它是动态额度,由响应速度和历史成功率决定;它只对特定类型的站点才有实际影响;优化的方向是「减少无价值 URL」而不是「争取更多额度」。具体落地的顺序是——先用日志量出问题在哪,再用 robots 和 noindex 把无限 URL 掐掉,再用 sitemap 精准提交,最后把爬虫的响应速度和状态码保住,然后每月巡检一次看有没有回潮。这套动作做下来,通常能明显缩短新文章从发布到被发现的时间。

Last modification:November 4th, 2026 at 09:31 pm

Leave a Comment