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