很多站点并不是没有链接,而是链接在蜘蛛眼里被解析成了另一个地址。相对路径、base 标签、编码声明这三件事如果处理得不一致,蜘蛛沿着页面拿到的 URL 可能指向不存在的目录,或者指向一个已经改版的旧结构。本文讲的是蜘蛛解析 URL 时的几个常见误判点,以及怎么自己动手排查。
相对路径的解析基准
蜘蛛解析 href 时,需要先确定一个基准地址。这个基准默认是当前页面的 URL,规则和浏览器一致。问题通常出在两类页面上:
- 带参数或带尾斜杠的列表页。比如 /list/1 和 /list/1/ 是两个不同的基准,前者会把 ../../ 解析成上一级,后者会回退两层,同一段链接可能得到不同结果。
- 多级目录下的页面,如果链接写成 ../../detail/100,一旦目录层级调整,链接就会指向错误位置。
结论很简单:站内链接尽量用绝对路径,从根目录写起。多写几个字符,换来的是路径不会随页面位置漂移。
base 标签会把基准挪走
如果页面头部写了 base href,蜘蛛解析相对链接时会以这个地址为准,而不是当前页面。这个标签常被用于统一去掉参数,或者作为历史遗留的模板,但它会让所有相对链接都指向 base 指定的目录。
常见后果是,页面在 /a/b/ 下,链接写着 detail/100,base 却指向 /,蜘蛛最终访问的是 /detail/100,而不是 /a/b/detail/100。如果这个地址恰好能打开一个空壳页,问题就更隐蔽了,日志里看不出明显报错,只是抓取到的内容一直不对。
编码与字符集的影响
HTML 声明的字符集和服务器响应头返回的字符集如果不一致,蜘蛛按其中一种解码,中文或特殊字符的路径就可能解析错误。表现为日志里出现大量乱码 URL,或者页面里的链接地址与手动打开时看到的不一样。
- 确保响应头 Content-Type 中的 charset 与 meta 声明一致,优先以响应头为准。
- URL 中的非 ASCII 字符统一做百分号编码,不要在 HTML 里直接写中文路径。
- 检查页面能否被正常解析,避免因编码错误导致后半段链接被整体吞掉。
容易被忽略的转义问题
href 里的 & 没做实体转义,解析时可能被当成实体的一部分;链接里夹杂空格、换行,或者模板变量没有替换成功,都会让蜘蛛拿到一个拼接坏的地址。另外,协议相对写法 //example.com/a 在 http 与 https 混用的站点里也可能带来意外跳转。
自己动手排查的步骤
- 用抓取工具或命令行拉取页面的原始 HTML,而不是看浏览器渲染后的 DOM。
- 列出页面里所有 href 与 src,逐条判断是绝对路径还是相对路径。
- 检查是否存在 base 标签,确认它指向的目录与预期一致。
- 对照日志里的蜘蛛访问记录:如果大量访问 404 或奇怪目录,通常是解析基准出了问题。
- 抽查几个深层页面,确认蜘蛛实际走的路径和你在浏览器里点出来的路径一致。
链接能不能被跟随,取决于解析后的地址是否正确,而不只是链接存在与否。
一个稳妥的写法约定
站内链接统一使用以 / 开头的绝对路径,不带多余参数;需要跨域时写完整的 https 地址;模板里拼接 URL 的地方做一次校验,避免出现双斜杠、末尾空格或未替换的变量。把这些约定固化到模板和发布流程里,比事后从日志里找错更省事,也更容易长期维持一致的抓取路径。