很多站点都会有站内搜索功能,用户输入关键词就能找到内容,体验上没问题。但对搜索引擎来说,搜索页是一类比较麻烦的地址:一个关键词一个 URL,加上排序、筛选、翻页参数,组合起来几乎是无穷的。如果缺少约束,蜘蛛很容易把大量时间花在这些页面上。
站内搜索页为什么容易被蜘蛛盯上
常见原因有三个。第一,搜索框通常出现在每个页面的头部或侧边,链接随处可见;第二,搜索页本身会自动生成大量内部链接,指向站内文章,形成一张不断扩张的链接网;第三,同一个搜索页可以带不同参数反复访问,蜘蛛会认为这是新地址。三者叠加,结果就是抓取请求大量集中在搜索页上。
带来的影响也比较直接:真正需要被收录的内容页抓取频次下降,服务器要处理更多动态查询,日志里塞满相似请求,分析时很难看清真实情况。
自查:先确认蜘蛛到底抓了多少
不要凭感觉判断,先用数据确认。可以按下面的顺序看一遍:
- 在服务器访问日志里筛出搜索路径(比如 search、?q=、?keyword=、?s= 这类特征),统计近一周的抓取次数和占比;
- 看这些请求的状态码分布,是否有大量 200、也有 302 或 5xx,5xx 往往说明动态查询把服务器压出了问题;
- 用站内搜索页的地址反查收录情况,确认是否已经有搜索结果页进了索引;
- 检查 Sitemap 里是否混进了搜索页地址,这种情况要优先修掉;
- 翻一下栏目模板和文章模板,看搜索框的链接是不是全站输出,有没有给搜索链接加 rel 属性或做收敛。
如果搜索结果页的抓取量占全站的一半以上,基本可以确定需要处理了。
处理思路:按页面类型分开对待
纯功能型搜索页
只服务于用户查找、本身没有独立内容价值的搜索页,通常建议不让它进入索引。这里有一个容易踩的坑:如果直接在 robots.txt 里屏蔽搜索路径,蜘蛛就看不到页面里的 noindex 标签,也就无法按 noindex 处理;反过来,如果先用 noindex 让页面退出索引,再用 robots.txt 屏蔽,逻辑上更稳妥,但前提是页面确实已经不再需要被抓取了。两种手段不要同时上,避免互相干扰。
有内容价值的聚合页
有些站点的搜索页其实是聚合页,比如按品类、按主题整理的列表,本身有稳定的标题、简介和一批固定结果。这类页面如果确实能解决用户问题,可以考虑做成静态或半静态的固定地址,配好标题、描述和规范地址,再让它正常参与收录。判断标准很简单:这个页面会不会被用户主动分享、反复访问,而不是只能靠输关键词才能到达。
已被收录的旧搜索页
如果发现搜索结果页已经进了索引,不要急着一次性全删。先确认这些页面有没有外链或内链指向,再决定是让它随抓取自然失效,还是保留一个提示页面做跳转。同时要停止继续生成新的可索引搜索地址,否则清理速度赶不上生成速度。
内部链接与接口也要管住
页面层面的设置只是一半,另外一半在链接和接口上:
- 搜索链接尽量写成表单提交或按钮触发,减少可被直接跟随的 a 标签;
- 搜索结果页里的分页链接,避免把参数无限拼接下去;
- 搜索建议、下拉补全这类接口,注意别暴露成可批量请求的公开地址;
- 热门搜索词、历史搜索这类模块,如果输出的是固定词表,可以做成固定地址;如果每次都不一样,最好不要直接输出链接;
- 给搜索功能加上频率限制,既保护服务器,也避免被异常请求刷量。
验证与长期维护
调整完不要就此不管,隔一两周再回日志里看一次,确认搜索路径的抓取量确实降下来了,同时核心内容页的抓取次数有没有回升。如果发现某个搜索地址仍然被频繁访问,顺着它的来源查一下是哪个页面在输出链接。
站内搜索是给用户用的工具,不是给蜘蛛准备的入口。把它管好,抓取预算才能落到真正需要被看到的内容上。
最后提醒一句:搜索页的处理方式没有统一答案,关键看它对你站点是功能还是内容。功能就收敛,内容就规范,别让它处在两者之间的模糊状态。