做入口頁或蜘蛛池的时候,常有人問:能不能把連結換個寫法,让它“低調”一点,或者看看搜尋蜘蛛到底認不認。源碼里看着連結還在,和搜尋蜘蛛實际能不能提取到,是两回事。判断标准只有一個——解析後的文档里是否存在可跟進的連結地址。
搜尋蜘蛛提取連結的大致流程
抓取 HTML 响應体之後,搜尋蜘蛛會解析文档、构建 DOM,再從节点里提取連結属性,做一次規范化(补全域名、去掉無用片段等),最後放進待抓取队列。任何在“构建 DOM”之前就被丢掉的内容,都不會产生後續抓取。所以問“這個寫法能不能被發現”,本质上是問“它會不會變成 DOM 里的一個連結节点”。
几種常见寫法的實际结果
1. 寫在 HTML 注释里的連結
比如 <!-- <a href="..." > --> 這種形式,注释内容不會被解析成頁面节点,因此一般不會被搜尋蜘蛛跟進。驗證方法很直观:在浏览器里選中所属区域,没有可点击的連結,就說明它没有進入 DOM。
2. 用 CSS 隐藏起来的連結
display:none、visibility:hidden、font-size:0、把元素绝對定位到屏幕外、用同色文字盖住……這些做法連結节点依然存在于 DOM 中,href 照样能被提取,搜尋蜘蛛大概率會發現並尝试抓取目标 URL。但要注意:被發現不等于没風險。頁面上出現大量堆叠的隐藏連結,容易被当成刻意操纵的痕迹,可能影响整站评價。入口頁要放連結,放在正常可见的位置更稳妥。
3. HTML 實体编碼的連結
href 里寫成 & 表示 &,或者把中文、空格编碼成百分号形式,在解析时都會被還原,属于完全正常的寫法。實体编碼只影响你讀源碼时的观感,不影响連結提取和後續請求的地址。
4. href 為空、為 # 、為 javascript: 的情况
href="" 和 href="#" 指向的都是目前頁面本身,href="javascript:void(0)" 也不是一個可抓取的網址。這類寫法通常不會带来新的抓取任務,即使它們在 DOM 里看起来像連結。想通過它們“堆积連結數量”,基本没有意义。
5. 靠 JavaScript 拼接出来的連結
這里要分两種:拼接结果最终被寫進 DOM 里某個連結的 href,那么在执行渲染的引擎里仍有机會被發現;如果地址只是存在變量或資料里,從来没有插入文档,就不會被当成連結。入口頁的關键連結建议服務端直接輸出,不依赖脚本执行。
6. 放在 template 或 noscript 里
template 内部的内容不會渲染成頁面节点,一般不會被当作頁面連結處理。noscript 里内容的處理方式在不同引擎之間並不统一,所以不要把入口頁的關键目标連結只放在這些位置,風險不值得冒。
自己就能做的四步自查
- 用 curl 或浏览器“查看網頁源代碼”拿到原始 HTML,確認連結在源碼中的寫法。
- 在浏览器里临时禁用 JavaScript,看頁面上是否還有那些連結。
- 打開開發者工具的 Elements 面板搜尋連結标簽,確認解析後的 DOM 里确實存在目标地址。
- 對照服務器日誌,看搜尋蜘蛛有没有真的請求目标 URL。有訪問记錄,才算走通了這一步。
入口頁寫法的几個建议
- 用标准連結标簽加真實可訪問的地址,放在正文、列表等正常可见区域。
- 不要用注释、隐藏样式、伪协议来“凑數量”,收益有限,風險不小。
- 連結數量增加时,優先保證頁面能正常渲染、响應時間稳定,這比寫法花样重要得多。
- 改完寫法後,用日誌核對一遍抓取情况,而不是凭感觉判断。
連結被提取只是第一步,能不能被真正抓取、抓取结果是否保留,還取决于目标 URL 的可訪問性和站点的整体质量。任何“換個寫法就一定能被抓”的说法都站不住脚。