蜘蛛在页面上看到链接时,拿到的是一串字符,而不是一个已经确认过的页面。它只能照着这串字符去发请求。所以链接写法的差异,会直接变成抓取行为的差异:同一份内容可能被请求三次四次,也可能因为写法不对而压根没人请求。
蜘蛛眼里的 URL 只是字符串
在浏览器里,很多写法差异会被自动抹平:大小写会自动纠正,多余斜杠会被忽略。但蜘蛛不会替你猜,它抓的是字符串本身。下面这几类差异最常见。
主机名与路径的大小写
按规范,域名不区分大小写,路径区分大小写。但不少服务器是大小写不敏感的,于是 /About 和 /about 都能返回 200。蜘蛛看到两个不同字符串、两个都是正常页面,就会分别抓取、分别入库。同一份内容被记成两条记录,内链权重也被拆开。
结尾斜杠
/page 和 /page/ 也是两个字符串。如果服务器对两者都返回 200 而不做重定向,蜘蛛就会把它们当成两个地址。这类问题在栏目页、标签页上尤其多,因为不同编辑、不同模板输出的写法可能不一致。
中文、空格与百分号编码
同样一个标签页,可能被写成原始中文,也可能被写成百分号编码形式,还可能把空格写成加号。对蜘蛛来说这是三个字符串。搜索引擎通常会做一定程度的编码归一,但归一不是保证,尤其是编码层级不同、字符被二次编码时。
参数顺序与无用参数
?a=1&b=2 和 ?b=2&a=1 指向的内容完全一样,字符串却不一样。再加上排序参数、来源追踪参数、分页参数的不同排列组合,一个列表页可以轻易膨胀出几十个地址。
相对路径与多余的路径符号
相对路径、以双斜杠开头的写法、路径里插入的点号,蜘蛛都会尝试解析。解析结果有时和你以为的地址并不一致,特别是页面本身层级较深、或者被放在不同目录下渲染时。
哪些写法蜘蛛基本不会去请求
除了重复,还有一类问题更直接:链接根本没被当成链接。
- 用脚本事件挂上去的假链接,没有可用的地址属性。
- 只写了井号或空值的锚点,指向当前页面自身。
- 邮件、电话协议开头的地址,不属于网页抓取范围。
- 表单提交、按钮点击后才生成的跳转,不产生可抓取的链接。
- 纯文本粘贴的地址,没有可点击标记,被识别的概率不稳定。
这些写法在用户视角能点、能跳,但在抓取视角里,路径就断在这里。
把每个页面收口到一个地址
与其事后分析重复抓取,不如在输出环节就统一。可以按这个顺序处理:
- 为每类内容确定唯一标准写法,包括大小写、是否带结尾斜杠、编码方式。
- 在服务器层面对变体做永久重定向,重定向比注释类声明更硬。
- 统一内链输出,让模板、面包屑、相关推荐都走同一套地址规则。
- 用规范化声明做兜底,处理那些无法重定向的变体,比如带追踪参数的地址。
- Sitemap 里只放标准版本,不要把变体也列进去。
顺序很重要:先重定向、再统一内链,最后才是声明。把所有希望都压在一行声明上,效果通常不理想。
上线前后可以做的几项检查
- 翻抓取日志,按路径统计大小写变体、斜杠变体各被请求了多少次。
- 抽查栏目页和标签页,看同一目标是否混用了两种写法。
- 把内链里出现的地址与 Sitemap 对照一遍,看有没有对不上的。
- 检查参数拼接逻辑,固定参数顺序,去掉无意义的空参数。
- 看服务器是否对变体返回了重定向,还是直接给了 200。
抓取资源不是省出来的,是别浪费出来的。同一份内容被写成多个地址,是最容易被忽视的一种浪费。
链接写法看起来是前端细节,落到抓取上却是很实在的路径问题。把地址收口这件事做干净,蜘蛛拿到的路径更短、更明确,站点也少了一堆重复的抓取记录。