常见问题

入口页里的链接用相对路径还是绝对路径:搜索蜘蛛解析目标 URL 时容易踩的坑

搜索蜘蛛拿到入口页 HTML 后,要先把你写的 href 解析成绝对 URL,这一步出错,目标 URL 就不会被请求。本文说明相对路径、base 标签、协议相对路径、未转义字符与脚本链接容易造成的解析偏差,并给出一份可执行的自查清单。

常见问题

入口页里的链接用相对路径还是绝对路径:搜索蜘蛛解析目标 URL 时容易踩的坑

很多站点检查 URL 发现环节时,习惯盯着入口页有没有被抓、日志里有没有出现目标 URL,却忽略了一个更靠前的步骤:搜索蜘蛛拿到入口页的 HTML 之后,必须先把你写在 href 里的那串字符,解析成一个完整的、可请求的绝对 URL。这一步出错,后面的抓取和收录都无从谈起。

搜索蜘蛛怎么把 href 变成要抓的 URL

搜索蜘蛛读到的是 HTML 源码,而不是浏览器渲染后的结果(现代搜索引擎会执行部分 JS,但链接发现的第一优先级仍是源码里的 a 标签)。解析时它需要一个基准地址,通常是当前入口页自身的 URL;如果页面里写了 base 标签,则以 base 为准。基准变了,同一个相对链接指向的目标就会跟着变。

几类容易解析错的写法

相对路径:完全跟着入口页地址走

写 href="/a/1.html" 或 href="a/1.html",解析结果取决于入口页自己的域名和目录层级。同一段 HTML 放在不同入口页上,会解析出不同的目标 URL。

  • 入口页若能通过多个域名或子目录访问,同一个相对链接会产出多个目标版本
  • 入口页地址结尾带不带斜杠,会改变上一级目录的判断,/dir 与 /dir/ 下的 a.html 解析结果并不相同

base 标签写错或写成相对值

base 标签本意是给相对链接定基准。若 base 指向了另一个域名,或本身写成了相对路径,页面上所有相对链接都会整体偏移,蜘蛛请求的就不是你想推送的那个目标 URL。

协议相对路径与混合协议

href="//example.com/a" 这种写法在 HTTP 与 HTTPS 入口页下会被解析成不同协议。入口页是 HTTPS、而目标站只支持 HTTP 时,请求可能直接失败,URL 发现环节就在这一步断掉了。

未转义的特殊字符与中文路径

空格、中文、# 在 URL 里都有特定含义。参数分隔用的 & 在 HTML 中应写成实体形式,否则解析可能断在这里;带空格或中文的路径没有做编码时,容易被截断或被理解成另一个地址;# 后面的内容属于页内锚点,一般不会作为独立的抓取目标。

写在 JS、onclick、data-* 里的 URL

这些位置默认不作为链接被提取。如果入口页的目标地址只存在于脚本拼接或点击事件中,能被发现并进入抓取队列的概率,明显低于直接写在 a 标签 href 里的情况。

结尾斜杠与大小写

/a 与 /a/、/Page 与 /page,在服务器上可能是同一页面,也可能不是。解析出的版本如果和规范版本不一致,容易造成重复抓取,日志里看起来“蜘蛛来了”,实际上抓的是另一个 URL 版本。

自查与统一写法

  1. 从入口页源码里复制一个 href,按 URL 拼接规则手动与入口页地址合并,看结果是否等于你要推送的目标 URL
  2. 抽查日志中蜘蛛实际请求的 URL 字符串,与目标清单逐条比对,重点看斜杠、大小写、参数顺序
  3. 检查入口页是否存在 base 标签,确认它指向的基准符合预期
  4. 尽量统一写成带协议的绝对路径,减少对入口页地址的依赖
  5. 如果目标 URL 只由脚本生成,考虑在源码中补一个可直接解析的链接
链接能被正确解析出来,只代表进入了发现环节。后面还要经过抓取、内容判断、索引等步骤,任何一步的条件不满足,都不会出现在搜索结果里。

把 URL 解析这一步对齐,入口页的作用才能稳定落到目标 URL 上,日志里的记录也才有对照价值。