发现的前提是链接可解析
搜索蜘蛛发现 URL 的路径,最终还是落在 HTML 里能被解析出来的链接上。它不需要真的去点击,只需要从文档中提取出目标地址。所以问题不是用户能不能点,而是这个地址有没有以它能读到的形式出现在页面代码里。同一次跳转,写成 a 标签加 href,还是写成按钮加一段脚本,对用户几乎没有区别,对发现却完全不同。
最稳的写法:a 标签加 href
只要目标地址出现在 a 标签的 href 属性里,并且这个 a 标签存在于初始 HTML 中,就属于最容易被发现的写法。有两点需要注意:一是 href 要写完整、可访问的地址,不要用井号或 javascript 前缀之类的占位;二是如果地址是靠脚本在点击时才拼出来的,那么初始 HTML 里并没有它,发现就会推迟到渲染阶段,甚至完全不发生。
常见非标准入口的实际情况
按钮与 onclick
用 button 或 div 加 onclick 做跳转的写法,抓取端通常看不到目标地址,除非脚本同时设置了 href,或者服务端渲染时已经把链接输出了。比较省事的做法是在按钮外层再放一个真实的 a 标签,或者让服务端把目标地址写进 href 里,脚本只负责交互效果。
图片、图标与热区
图片本身不是链接,只有当它被 a 标签包住、且 href 指向目标页面时才有发现价值。图片的 src 只代表素材地址,不会被当成页面入口。热区(map、area)里的 href 一般可以被解析,但维护成本高、出错后不容易排查,能用普通链接就别用热区。
表单与 GET 提交
表单提交产生的地址通常不会被主动发现,抓取端不会替你去填表。如果筛选、排序这类结果页确实值得被发现,更好的做法是同时提供静态链接,把常用组合写成 a 标签,而不是只留一个下拉框。这样既方便抓取,也方便用户直接分享。
iframe 与异步加载
iframe 内部的链接,以及通过接口请求后再插入 DOM 的链接,在初始 HTML 中都不存在。前者依赖渲染,后者还要看抓取端是否执行脚本以及执行到什么程度。对于必须被发现的页面,尽量不要让它们只存在于这两种位置,至少在服务端先输出一份链接清单。
锚文本顺带说一句
锚文本不影响链接是否被提取,但会影响抓取端对目标页面主题的初步判断。写清楚比写“点击这里”“更多”要友好一些,尤其在栏目入口这类位置,锚文本本身就是一份简短的说明。
一份可以照着核对的清单
- 栏目页、列表页、详情页这些关键入口,是否都有 a 标签加可访问的 href。
- 翻页、筛选、排序是否有静态链接,而不是纯脚本按钮。
- 图片和图标按钮是否被 a 标签包裹,href 是否指向真实页面。
- 依赖脚本生成的链接,服务端能否先输出一份可解析的版本。
- 重要入口是否被随手加上了 nofollow 属性,确认这是有意的选择。
- 用抓取日志里的 Referer 核对,从首页出发能否把主要栏目都带出来。
哪些情况不必过度处理
不是所有链接都必须可被发现。登录后页面、购物车内页面、一次性操作结果页,本来就不需要被抓取,用脚本或表单处理反而更合适。判断标准很简单:这个地址出现在搜索结果里有没有价值。有,就给它一条可解析的链接;没有,就不必为了所谓的规范再增加一个入口。
改造成本与收益
把脚本跳转改成真实链接,通常只是模板里改一处标签,改动量不大,但影响的是整类页面的发现通道。上线后观察抓取日志中这些地址的首次出现时间与来源,比凭感觉判断更可靠,也更容易发现遗漏的位置。
能被发现的链接,不是用户点得动的链接,而是代码里写得清楚的链接。