蜘蛛抓取一个页面的第一步不是发请求,而是解析:它把 HTML 里的这类链接元素读出来,按规则拼成完整的绝对 URL,再决定要不要进队列。这一步如果出错,页面看着入口密布,蜘蛛手里却是一堆取不到的地址,或者指向了完全不相干的地方。所以排查抓取问题时,除了看服务器和日志,也值得回头看一眼:链接本身写对了吗。
把相对地址拼成绝对地址,是蜘蛛的基本动作
页面里写 href="/list/1/" 还是 href="https://www.example.com/list/1/",对人来说点到的地方一样,对蜘蛛来说却要先做一次拼接。拼接的基准默认是当前页面的 URL,但如果页面里存在 base 标签,基准就会被整页替换掉。
base 标签:一行代码改掉整页链接的落点
base 标签写在 head 里,用来指定页面内所有相对链接的基准地址。它常出现在几类场景:模板替换时预留的占位、多域名共用同一套 HTML、把静态资源指向 CDN。
问题在于它的作用范围是整个文档,而不只是资源文件。有人只是想用 <base href="https://cdn.example.com/"> 让图片从 CDN 加载,结果页面里所有相对形式的站内链接也被带到了 CDN 域名下。蜘蛛走过去的可能是 CDN 上并不存在的路径,或者一个无法访问的地址。
几个容易踩到的地方
- base 的 href 缺少结尾斜杠,相对路径的拼接结果会多切或少切一层目录。
- base 指向的域名与站点实际域名不一致,蜘蛛抓到的是另一套环境。
- 多个 base 标签同时出现,浏览器通常只用第一个,蜘蛛的处理也未必如你所愿。
- 把 base 写在 body 里,位置本身就不规范。
如果只是为了资源走 CDN,更稳妥的做法是把资源地址写成完整 URL,而不是用 base 改变整页基准。
相对路径的层级陷阱
相对路径靠 ../ 回退目录,写起来省事,但把同一段模板复用到不同深度的路径下时,就容易错位。比如一段导航模板同时用在一级栏目页和三级详情页,模板里写的是 href="../about/",在一级页面上指向的是站点的 about,到了三级页面却变成了别的层级。
表现通常是:某些页面上的内链能正常抓到,另一些页面上的同类链接却返回 404,或者干脆指向了不存在的目录。这类问题在模板复用时最隐蔽,因为出错的不是某一个链接,而是一整类页面。
站内链接尽量用根路径(以 / 开头)或完整 URL,能省掉大量这类排查成本。
URL 里的编码、空格和中文
带空格、中文、特殊符号的路径,不同写法可能指向同一个资源,也可能指向不同资源,取决于服务器怎么处理。常见情况包括:空格写成 %20 还是 +,中文是否做了百分号编码,大小写是否敏感,结尾有没有斜杠。
对蜘蛛来说,写法不同往往就是不同的 URL,容易在站内形成一批内容相同、地址略有差异的入口。与其事后靠规范化规则收拾,不如在生成链接时就统一格式:同一类页面用同一种写法,结尾斜杠保持前后一致。
看着像链接、其实不是的写法
下面这些写法在浏览器里能点,但蜘蛛从里面取不到有效目标:
- href="javascript:void(0)" 配合脚本跳转:蜘蛛只看到一个脚本调用,看不到去向。
- href="#" 或只带锚点的地址:指向当前页面自身,不产生新入口。
- 用 div、span 加 onclick 实现跳转:没有链接元素,蜘蛛不会把它当入口。
- href="mailto:"、href="tel:":属于其他协议,不是网页地址。
- 整块用图片或图标承载跳转、旁边没有可读文本链接:即使能解析,锚文本也基本为空。
重要入口别只挂在脚本上,配一个真实的 a 标签href,成本和风险都低得多。
协议相对链接与域名混用
//example.com/page/ 这种写法会沿用当前页面的协议。站点同时存在 http 和 https 版本、或者页面本身在 http 下被打开时,蜘蛛从这里拼出来的地址可能落到非预期的那一份上。全站启用 HTTPS 后,这类历史写法残留在模板里的情况并不少见。
另外要注意 www 与非 www、主域名与备用域名的混用。同一篇文章的内链一会儿指向 A 域名、一会儿指向 B 域名,在蜘蛛看来就是两套入口,权重和抓取都会被分散。
一条链接自查清单
- 页面里是否存在 base 标签,它的 href 是否真的需要覆盖全站链接基准。
- 站内链接是否统一用了根路径或完整 URL,而不是层层 ../ 的相对写法。
- 同一类页面的 URL 写法是否一致:大小写、结尾斜杠、参数顺序、编码方式。
- 关键入口是否有真实 href,而不是脚本或 onclick 伪装出来的。
- 内链指向的域名是否统一,有无 www、协议版本混用。
链接解析出的偏差,往往不会报错。蜘蛛只是安静地少走了一些路,或者走到了别的地方。定期用抓取工具把重点页面的链接抽出来看一眼实际地址,比事后从日志里倒推要省力。