做蜘蛛池入口页时,总有人想“多塞几条链接又不让用户看见”。于是 HTML 注释、display:none、零号字体、同色文字这些手法反复出现。这些做法在蜘蛛眼里究竟是什么效果,值得单独说清楚。
蜘蛛解析的是 HTML 源码,不是渲染后的画面
搜索引擎爬虫拿到的是服务器返回的 HTML 文本。对大多数爬虫来说,一条链接是否“存在”,取决于它有没有出现在可被解析的 a 标签位置,而不是它在浏览器里占多少像素。用户看不到,不等于蜘蛛看不到;反过来,用户看得到,也不等于蜘蛛一定能解析到——如果链接是 JS 渲染后才插入 DOM 的,普通抓取可能就直接错过了。
HTML 注释里的链接:基本等于不存在
HTML 注释的用途是给开发者留说明,解析器在构建文档结构时会跳过注释节点。也就是说,写在注释里的 a 标签不会进入链接图,蜘蛛通常不会把它当成待抓取 URL。把入口页的出口链接藏在注释里,既没有发现效果,又白白撑大了页面代码。唯一会“读到”的,是某些用正则在源码上做匹配的自制工具,但主流搜索引擎不这么干活。
display:none 的链接:能被发现,但带着风险
display:none、visibility:hidden、opacity:0、font-size:0、文字与背景同色、把元素定位到可视区域之外,这些都属于“HTML 里在、视觉上不在”的做法。蜘蛛解析源码时一般仍能提取到链接,所以不少老教程说“这样能藏链接”。但这条路的代价是:
- 搜索引擎对隐藏文本和隐藏链接有明确的作弊判定规则,尤其是批量、模板化、与正文无关的隐藏链接。
- 一旦被判定,受损的是整个站点的信任度,不只是某一个入口页。
- 隐藏区域的锚文本往往缺乏上下文,就算被发现,传递效果也很有限。
折叠、悬浮与 Tab 内容属于另一类
用 details 与 summary 做的折叠区、hover 才展开的菜单、Tab 切换的内容,在 HTML 里都是正常节点,蜘蛛通常能读到,它们和“故意隐藏”不是一回事。真正的分界线是意图和规模:为了界面整洁而收起,和为了绕过审核而批量藏链,处理方式完全不同。
JS 注入的链接:看不见不是问题,跑不起来才是
如果链接由脚本在渲染后插入,情况取决于抓取端是否执行脚本。即便能执行,也存在渲染预算和延迟的问题。把关键出口链接直接写在初始 HTML 里,是最稳的做法。至于先藏在注释里、再靠脚本拼出来,等于同时踩了两个坑。
真要藏,先问三个问题
- 这条链接是给用户用的吗?如果用户永远点不到,它存在的意义是什么。
- 如果是站内功能链接,比如跳过导航的无障碍锚点、打印页入口,它有没有明确用途、是否只出现一次。
- 如果目的只是“多导几条链接”,这条链接经得起人工查看吗。
更稳妥的替代做法
与其在隐藏上花心思,不如把可见区域用足:正文里的自然内链、相关阅读模块、分类导航、面包屑、页脚链接区。这些位置蜘蛛愿意爬,用户也能用,出了变化还容易排查。入口页的核心任务是把 URL 稳定、持续地暴露出去,而不是玩呈现技巧。
隐藏链接不是“蜘蛛看不见”,而是“人看不见”。而搜索引擎最终是拿人的标准来评估页面的。
上线前的简单自检
- 查看页面源码,确认关键链接出现在 a 标签里,而不是注释或脚本字符串里。
- 关掉 JS 再看一次,确认主要出口链接还在。
- 检查整站是否存在批量隐藏链接的模板痕迹。
- 确认没有用同色文字、零号字、屏幕外定位去堆放关键词或链接。