常见问题

入口页里的相对路径链接,搜索蜘蛛解析出的目标 URL 会不会跑偏?

入口页里写了链接,不等于蜘蛛抓到的是你以为的那个地址。相对路径、base 标签、跳转后的基准 URL 都会让解析结果发生偏移。本文梳理搜索蜘蛛解析相对路径的基本规则,列出几个常见跑偏场景,并给出用 HTML 源码和抓取日志自查的方法。

常见问题

入口页里的相对路径链接,搜索蜘蛛解析出的目标 URL 会不会跑偏?

做蜘蛛池或站内互链时,很多人把精力放在“链接放没放”上,却忽略了一个更基础的问题:这个链接的地址,搜索蜘蛛读出来的和你以为的是不是同一个。相对路径少写一个斜杠、多一层目录,蜘蛛请求的可能就是一个 404 地址,入口页等于白做。

搜索蜘蛛怎么解析相对路径

HTML 里的 href 如果是相对路径,浏览器和搜索蜘蛛都要先把它和“当前页面的 URL”做一次拼接,才能得到完整地址。这个拼接规则由 RFC 3986 定义,核心是:以当前文档 URL 为基准,替换掉最后一段路径。

举例,入口页地址是 https://a.com/dir/page.html:

  • href="target.html" → https://a.com/dir/target.html
  • href="/target.html" → https://a.com/target.html
  • href="../target.html" → https://a.com/target.html
  • href="./target.html" → https://a.com/dir/target.html

规则看着简单,但真正的坑在于“当前页面 URL”到底是什么。它不一定是你在浏览器地址栏里看到的那个。

几个容易跑偏的场景

1. 页面是通过跳转或重写到达的

如果入口页是经过 301、302,或者服务器内部重写后才返回内容,蜘蛛解析相对路径时用的基准,通常是最终返回内容的那条 URL,而不是你最初请求的那条。比如 /go/123 跳转到 /article/456,页面里写 href="a.html",蜘蛛会去请求 /article/a.html,而不是 /go/a.html。这类误差在日志里会表现为“我明明没放这个地址,却被请求了”。

2. base 标签

页面里如果存在 <base href="...">,所有相对路径都会以它为准,当前页地址反而不参与解析。批量生成的模板里如果残留了一个 base 标签,整站相对链接可能全部指向另一个域名。检查入口页时,顺手搜一下源码里有没有这个标签。

3. 协议相对和上级路径

href="//b.com/x" 这种写法会沿用当前页面的协议:http 页面里就是 http,https 页面里就是 https。如果你的站点正在做 http 到 https 的迁移,这类链接可能出现协议混乱,蜘蛛跟过去先吃一次 301。而 ../ 用得过多,容易跳出预期目录,把蜘蛛带到你并不希望它抓的路径上。

4. URL 里的中文、空格和特殊字符

相对路径里带中文、空格、&、# 时,解析结果依赖编码。空格在有些解析器里被当成路径分隔,& 会被误认为参数分隔。稳妥做法是对这些字符做百分号编码,或者干脆不用。

怎么确认蜘蛛读到的到底是哪个地址

  1. 用抓取工具(curl、无痕浏览器或本地小爬虫)按蜘蛛的 UA 抓一次入口页,重点看返回的 HTML 原文,而不是渲染后的 DOM。
  2. 把 HTML 里所有 href 抽出来,用当前页 URL 逐个做一次解析,再和你的目标地址清单对照。
  3. 看完工日志里蜘蛛实际请求的路径。如果出现大量 404,而且路径和入口页所在目录拼得上,基本就是相对路径解析问题。
一个经验:入口页面向蜘蛛时,链接尽量写完整的绝对地址,把解析环节的变量降到零。相对路径省的是编辑成本,付出的可能是排查成本。

修正建议

  • 入口页里的目标链接统一用绝对 URL,包含协议和域名。
  • 确认页面源码里没有多余的 base 标签。
  • 入口页不要先做多级跳转再输出链接。
  • 模板批量生成后,抽样检查 HTML 源码里的 href 原值。
  • 日志里出现非预期路径时,先回头核对入口页 HTML,再怀疑其他环节。

相对路径本身没有问题,绝对路径也一样。真正要紧的是:搜索蜘蛛解析出的地址,和你希望它抓的地址,是不是同一个。入口页上多花几分钟做这个核对,比事后在日志里猜要省事得多。