URL 是蜘蛛判断页面是否重复的第一道线索
蜘蛛池里入口页数量往往不少,真正影响蜘蛛愿不愿意继续抓、会不会反复抓的,除了页面内容本身,还有 URL 的写法。对蜘蛛来说,URL 是最基本的去重依据:同一个页面对应多个地址,或者一批地址长得几乎一样,抓取预算就容易耗在重复劳动上,真正想让它看到的页面反而被挤掉。
URL 结构不是玄学技巧,更像是一种减少歧义的基础工作。下面几个方面值得单独拿出来过一遍。
长度:不必刻意短,但要避免无意义堆叠
常见的说法是 URL 越短越好,其实蜘蛛并不会因为地址长就拒绝抓取。真正的问题在于长度往往伴随信息冗余。比如把栏目名、关键词、日期、编号一层层拼进去,最后得到一条又长又难读的地址,人看不出重点,蜘蛛也拿不到额外的判断依据。
可读性主要是给运营自己看的
一条结构清楚的 URL,在日志里排查问题时能省很多时间。看到 /topic/123 大概知道是什么页面,看到一长串拼接字符就只能回去查表。所以长度控制在能表达层级即可,不必为了短而把有用信息全砍掉。
参数:能用,但要控制数量和顺序
动态参数是入口页最容易失控的地方。带参数的地址本身没问题,问题在于参数一旦被复制、追加、换序,同一个页面就能裂变出很多条地址。
- 跟踪参数:utm_source、from、ref 这类参数不要留在入口页的默认链接里。它们对蜘蛛没有意义,却会让同一页面出现多个版本。
- 排序与分页参数:如果入口页支持排序,尽量固定一种默认顺序,不要让人和蜘蛛都能从任意排序进入。
- 参数顺序:同一组参数在不同链接里保持顺序一致,避免 ?a=1&b=2 和 ?b=2&a=1 被当成两条地址。
- 空参数:?type= 这种没有值的参数尽量不出现,容易被解析成独立地址。
静态化与伪静态:形式不同,重点在稳定
真静态的 .html、伪静态的 /a/123.html、纯路径的 /topic/123,蜘蛛都能抓。它并不区分这些形式,真正关心的是地址是否稳定、是否唯一、访问是否正常。
伪静态需要服务端做重写,这里有个容易踩的点:如果重写规则过于宽松,把不存在的路径也返回正常页面,就会凭空制造出大量内容相同的地址。宁可让不存在的地址明确返回 404,也不要让它返回一个空壳页面。
大小写、结尾斜杠与编码:小事,但会制造重复
- 大小写:在很多服务器上,/Abc 和 /abc 是两个不同地址。入口页链接里如果大小写混用,等于自己给自己制造重复。
- 结尾斜杠:/list 和 /list/ 是否指向同一页面,取决于服务器配置。最好统一一种写法,并在服务端把另一种跳转过去。
- 中文与特殊字符:带中文或空格的地址会被编码成百分号形式,编码方式不一致时,同一页面可能出现多种写法。能用英文和数字就用英文和数字。
同一内容出现多个 URL 时怎么处理
入口页做多了,多地址指向同一内容几乎难以避免。处理思路大致是三条:
- 能用 301 合并的,直接跳转到一个主地址,让蜘蛛只认一条。
- 跳转不方便的,在页面里用规范链接声明主地址,作为一种补充说明。
- 站内链接统一指到主地址,别一会儿链这个版本,一会儿链那个版本。
规范链接是提示,不是强制命令。如果站内链接、跳转和规范声明互相矛盾,蜘蛛多半会按自己的判断来,效果就打折了。
几个常见的坑
- 入口页地址里带随机字符串或时间戳,每次生成都是新地址。
- 把本该做参数的筛选条件硬塞进路径,越筛路径越长。
- 地址里带 session id 之类的会话标识,同一用户每次访问都是新 URL。
- 改版后旧地址直接删掉返回 404,没有做跳转,原有的访问路径断掉。
上线前花十分钟过一遍
- 随机抽几条入口页地址,看看是否存在大小写、斜杠、参数顺序不一致的情况。
- 确认不存在的路径返回的是 404,而不是一个内容空白的正常页面。
- 检查站内链接是否都指向同一个主地址版本。
- 翻一遍日志,看看有没有明显是同一页面却占了很多条记录的地址。
URL 结构不是用来讨好蜘蛛的技巧,而是把歧义提前消掉的基础工作。重复地址少一点,蜘蛛的抓取才更可能落在真正有内容的页面上。