做蜘蛛池入口頁时,總有人想“多塞几條連結又不让用戶看见”。于是 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 再看一次,確認主要出口連結還在。
- 检查整站是否存在批量隐藏連結的模板痕迹。
- 確認没有用同色文字、零号字、屏幕外定位去堆放關鍵詞或連結。