先给一個大致结论:只要目标連結是寫在 HTML 源碼里的 a 标簽 href,搜尋蜘蛛抓取入口頁时通常都能提取到,哪怕它在頁面上被 CSS 隐藏了、用戶根本看不见。真正需要關心的不是“能不能發現”,而是這條連結拿到多少權重、被抓取的優先級有多高,以及這種隐藏寫法會不會让入口頁整体被判定為異常頁面。
搜尋蜘蛛看的是源碼,不是渲染後的画面
很多站長把“用戶看不到”等同于“蜘蛛看不到”,這是最常见的誤解。搜尋引擎抓取入口頁时,第一步拿到的是服務器返回的 HTML 源碼,連結解析也主要發生在這一步。連結在源碼里存在,就有被提取的机會;連結只存在于渲染之後的画面里,才需要靠渲染能力去补。
所以判断标准應该換一下:不是問“頁面上看不看得见”,而是問“href 有没有出現在返回的 HTML 里”。用 curl 或者浏览器的查看源代碼拉一次頁面,搜一下目标 URL,能不能搜到,答案其實立刻就清楚了。
不同隐藏方式,風險不一样
折叠面板、選項卡這類交互
内容被折叠起来、需要点击展開才能看到,属于正常的頁面交互设計。連結仍然在 HTML 中,蜘蛛可以正常解析。這類做法的風險相對低,但要注意折叠区域里的連結同样會因為位置靠後、可见性差而降低抓取表現。
纯作弊式隐藏,風險明顯更高
下面這些寫法是另一回事:
- 用 display:none 挂上几十上百條與頁面正文毫無關系的連結;
- 把文字颜色设成和背景完全一样,或者字号缩到 1px;
- 用绝對定位把整块連結推到可视区域之外;
- 把連結塞進隐藏的 div 里,頁面正文却看不出任何相關性。
這些做法的共同点是:對用戶完全不可见,纯粹為了给蜘蛛看。搜尋引擎對隐藏文本、隐藏連結的识別已经比較成熟,入口頁一旦被标记,後續的抓取频次和信任度都會受影响,得不偿失。
為什么有人還是發現“抓不到”
排除掉隐藏這個因素,連結没被蜘蛛跟進,通常問题出在別處:
- 連結是 JS 動態插入的。CSS 隐藏和 JS 渲染是两件事,連結如果不在初始 HTML 里,就需要蜘蛛完成渲染後才可能看到,被發現的時間會拉長,也不保證一定被跟進。
- 連結由 CSS 伪元素生成,比如用 content 属性拼出来的内容,這類内容不在 DOM 的 a 标簽里,一般不作為連結處理。
- 頁面本身有拦截,包括 robots.txt 屏蔽、nofollow、防火墙或安全插件返回異常狀態碼。
- 入口頁整体抓取频次就低,蜘蛛来得少,藏在角落里的連結自然更排不上号。
更稳妥的寫法
- 連結尽量放在頁面主干区域,靠近顶部或正文開头,而不是全部堆在隐藏容器里;
- 折叠区域可以保留,但让部分連結在預設狀態下就可见;
- 單頁連結數量控制在合理范围,避免把入口頁做成一個庞大的連結仓库;
- 锚文本寫清楚,別全是“点击這里”“更多”;
- 不要為了藏連結而使用同色文字、零字号這類老手法。
隐藏連結能否被抓到,和隐藏連結有没有效果,是两個完全不同的問题。前者多數情况下答案是“能”,後者往往因為触發風險识別而變成负數。入口頁的價值在于持續、稳定地被抓取,而不是短時間塞進大量連結。
怎么確認到底抓没抓
光看頁面判断不了,最直接的办法是查服務器日誌:筛出搜尋蜘蛛的 User-Agent,看它請求了哪些入口頁,再顺着看有没有請求目标 URL。如果入口頁被請求了、目标 URL 一直没有訪問记錄,那問题基本不在 CSS 隐藏上,應该去查連結是否真實存在于源碼、目标 URL 是否可訪問、以及是否存在 robots 层面的拦截。
把入口頁做得像正常頁面,比研究怎么藏連結更省事,也更经得起長期的抓取波動。