搜索抓取

站内搜索页产生大量 URL:蜘蛛顺着搜索框走进来之后

站内搜索是很多站点被忽视的 URL 源头。一个可被抓取的 GET 搜索表单,能在短时间内让蜘蛛拿到成千上万个带参数的地址,把抓取预算摊薄到低价值页面上。本文讲清楚蜘蛛可能从哪些入口走进站内搜索、怎么从日志里确认泛滥范围,以及 robots.txt、noindex、表单改造几种收敛方式的先后顺序与注意事项。

搜索抓取

站内搜索页产生大量 URL:蜘蛛顺着搜索框走进来之后

站内搜索是很多站点最容易失控的 URL 源头。它的入口就在页面顶部,用户随手可用,蜘蛛也一样能顺着走进去。区别在于:用户点几次就停了,蜘蛛会沿着结果页里的链接一路展开,一旦搜索条件可以被组合,参数空间几乎是无限的。

为什么站内搜索会批量产出 URL

大多数站内搜索用的是 GET 表单,关键词直接拼在查询串里。当结果页本身返回 200 状态码、又不带任何禁止索引的标记时,每一个搜索词都对应一个可以被抓取、甚至被收录的地址。如果搜索还支持排序、分页、时间范围、分类筛选,参数组合就会成倍增长。搜索引擎会发现其中一部分,然后顺着结果里的内链继续发现更多,这个过程不需要人工干预。

蜘蛛可能从哪些地方走进站内搜索

  • 页面顶部的搜索表单,action 指向搜索路径,参数以 GET 方式提交。
  • 热门搜索词、关键词云、标签墙,这些模块通常直接输出带参数的链接。
  • 搜索结果页内部互相链接,例如结果页底部推荐的相关搜索。
  • 排序与分页控件输出的链接,带上 sort、page、range 等参数。
  • 站点地图或 RSS 输出里混入了搜索地址,这种情况排查时容易被忽略。

URL 泛滥带来的三个直接后果

  1. 抓取预算被稀释。蜘蛛把时间花在大量近似页面上,真正需要更新的详情页和栏目页被推迟。
  2. 重复内容增多。不同关键词可能命中同一批商品或文章,只是排列顺序不同。
  3. URL 发现的信号被噪声淹没。新页面出现在抓取日志里时,往往被成百上千条搜索地址盖过去,排查问题变得困难。

先从日志确认范围,再决定怎么收敛

动手之前建议先量化。在抓取日志里按路径筛选出包含 search、q、kw、s 这类关键词的请求,看三个数字:占全部抓取请求的比例、出现过的不同参数组合数量、这些请求的平均响应时间。如果占比超过一成,或者参数组合数远大于站内实际页面数,就值得处理。

同时确认一件事:真正被用户大量使用的筛选页,是否和搜索页共用同一个路径。如果共用,直接屏蔽整条路径会误伤有价值的页面,需要更细的规则。

几种收敛做法与使用顺序

robots.txt 屏蔽搜索路径

这是最直接的做法,写好规则后蜘蛛不会再请求该路径下的 URL。但要注意一个顺序问题:已经被抓取并建立索引的搜索页,如果先被 robots.txt 屏蔽,蜘蛛就无法读取页面上的 noindex,这类页面会长期留在索引里。更稳妥的顺序是,先放开抓取、让页面返回 noindex,等索引清理完成后再考虑屏蔽。

给结果页加 noindex

适合搜索页仍需要被用户访问、但不希望被索引的情况。noindex 只影响索引,不影响抓取,因此对抓取预算的节省有限,需要和屏蔽规则配合使用。

把搜索表单改为 POST

POST 提交的参数不会出现在 URL 里,蜘蛛无法通过表单构造出新的搜索地址。改造时要确认站内所有调用搜索的入口都同步调整,避免留下旧版 GET 链接。

控制链接的输出

热门搜索词、相关搜索这类模块,可以选择不给链接加 href,或者通过脚本触发跳转。这样用户点击仍然可用,蜘蛛不会把它当作可跟进的路径。分页控件则可以限制只输出前几页。

参数规范化

对保留下来的筛选参数,固定参数顺序、不输出空参数、把大小写和多余空格统一处理,能减少同一结果对应多个 URL 的情况。

收敛之后要复查什么

规则上线后,隔一段时间回看日志,确认三件事:搜索路径的请求数量是否明显下降;原本依赖搜索入口的页面是否仍然被正常抓取;被屏蔽的路径下有没有误伤正常栏目。改动通常不会立刻反映在日志里,需要观察一段抓取周期再下结论。

站内搜索本身不是问题,问题在于它产出的 URL 无人管理。把它当成一个需要设定边界的入口,而不是让它自由生长,抓取预算才能落在真正需要更新的页面上。