做入口页或蜘蛛池的时候,常有人问:能不能把链接换个写法,让它“低调”一点,或者看看搜索蜘蛛到底认不认。源码里看着链接还在,和搜索蜘蛛实际能不能提取到,是两回事。判断标准只有一个——解析后的文档里是否存在可跟进的链接地址。
搜索蜘蛛提取链接的大致流程
抓取 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 的可访问性和站点的整体质量。任何“换个写法就一定能被抓”的说法都站不住脚。