在蜘蛛池的日常运维里,入口页的链接大多是用模板批量生成的,很少有人逐条检查最终指向。相对路径写起来省事,但一旦层级、base 标签或者协议写法出问题,搜索蜘蛛解析出来的绝对 URL 可能和你预期的不一样,等于把抓取请求送到了别的地方。
搜索蜘蛛是怎么把链接变成绝对 URL 的
蜘蛛拿到页面 HTML 后,会对每个 href 做一次解析:先取当前页面的地址作为基准,再按规则拼出完整的 绝对 URL,然后才决定要不要发请求。这个过程和浏览器地址栏的行为基本一致,常见的处理顺序是:
- 如果 href 已经带 http:// 或 https://,直接使用;
- 如果以 // 开头,继承当前页面的协议,再补上域名;
- 如果以 / 开头,拼到当前域名的根目录后面;
- 如果是 ../ 、./ 或者纯文件名,则从当前页面所在目录向上或向下推导。
问题基本都出在第 3、4 步——蜘蛛眼里的“当前目录”取决于它抓取的那个页面地址,而不是你本地文件夹的结构。
相对路径容易踩的几类坑
目录层级与结尾斜杠
入口页地址是 https://a.com/pool/index.html 还是 https://a.com/pool/ ,同样的 href="target.html" 解析结果可能不同。如果入口页写成 https://a.com/pool (没有结尾斜杠),不少服务器会先把它 301 到 /pool/ ,href="target.html" 在修正前后会经历一次基准变化,中间多一次跳转,也容易和真正的目标错位。
base 标签会改变基准地址
模板里如果残留了 <base href="..."> ,蜘蛛解析相对链接时会以 base 指定的地址为准。这个标签在采集模板和一些老后台里很常见,结果就是入口页上所有相对链接全部指到另一个域名,而你在页面上看不出任何异常。
协议相对与大小写
以 // 开头的协议相对链接会继承入口页自身的协议。入口页如果是被以 http 抓取,链接就会解析成 http:// ,即便目标是 HTTPS 站点,也会先经过一次跳转。路径部分的大小写同样要注意,在 Linux 服务器上 /Target.html 和 /target.html 是两个地址,搜索引擎通常按原样抓取,不会自动帮你纠偏。
URL 编码与参数
目标 URL 里带中文、空格或者 & 时,相对路径拼接后很容易被截断。& 在 HTML 里应该写成 & ,否则蜘蛛解析参数时会丢掉后半段。带中文的路径则建议先做百分号编码再放进 href。
为什么入口页建议直接用绝对 URL
- 不受页面地址、目录层级、base 标签的影响,解析结果唯一;
- 方便批量核对,链接列表可以直接和目标清单做比对;
- 减少 301、302 这类中间跳转,蜘蛛一次请求就能落到目标;
- 目标跨域名时,不会因为协议继承而走到错误的 http 版本。
已经用了相对路径,怎么排查
- 用浏览器打开入口页,右键查看链接,确认解析出来的绝对 URL 和目标一致;
- 查看页面源码,确认没有多余的 base 标签;
- 在服务器日志里对比蜘蛛请求的路径,看是否出现 404 或莫名其妙的目录;
- 把入口页上的链接抓取下来,和目标 URL 清单做一次批量比对。
链接能不能被发现,取决于蜘蛛解析出的那个地址能不能正常返回内容。相对路径本身没有错,但蜘蛛池是批量场景,越少依赖上下文,越容易定位问题。
最后提醒一句:把链接写对,只是让蜘蛛顺利发出请求。能不能被抓取、能不能被收录,还要看目标页面自身的状态、站点整体质量和抓取配额,没有哪一步能单独决定结果。