先说结论:该转的要转,但关键是别转两次
搜索蜘蛛抓取时,会把 URL 按规范做百分号编码(percent-encoding)后再发请求。中文、空格、引号、与号这类字符如果不编码就写进链接,浏览器、编辑器、CMS 各自按自己的规则补全,最终可能生成两个甚至更多地址,指向同一个页面却被当成不同 URL 统计。所以投放前要做编码处理,但重点不在“转不转”,而在统一:入口页上写的是什么形式,目标站内部链接和服务端接收的就该是什么形式。
编码不统一会带来什么问题
- 浏览器地址栏显示的是已解码的中文,复制出来却可能是编码后的形式,两种写法混用;
- 不同工具默认规则不一样,有的把中文转成 UTF-8 百分号编码,有的按 GBK 处理;
- 服务端按错误字符集解码时路径匹配失败,返回 404,或者干脆 302 跳到首页。
结果就是:链接本身能打开,但每次打开的都可能是“另一个地址”,抓取和统计对不上。
投放前建议逐项检查
检查一:有没有双重编码
例如把已经编码过的串再编一次,百分号本身变成 %25,服务端解码一次得到的是字面的百分号字符串,路径自然对不上。批量生成链接后,抽样在浏览器里打开,看地址栏变化和返回内容是否正常。
检查二:空格与特殊符号
空格应编码为 %20,加号只在查询串中按 application/x-www-form-urlencoded 的语义表示空格,用在路径里容易出错。井号后面的部分属于片段,不会发送给服务器,如果页面渲染依赖井号后的参数,蜘蛛抓到的永远是片段之前那个地址。
检查三:大小写、尾斜杠、默认端口
Linux 环境下路径通常区分大小写,尾斜杠同理,带与不带可能各自返回 200,形成重复。这些不算编码问题,但和编码一样都属于“同一页面对应多个 URL”的范畴,投放前最好定死一种写法,其余用跳转或 canonical 收敛。
检查四:字符集声明是否一致
页面里的 charset 声明或响应头里的字符集,要和实际输出一致。声明 UTF-8 实际输出 GBK,入口页上的中文链接在解析阶段就可能变形。
怎么快速验证
- 用 curl 直接请求编码后的地址,看返回码是不是 200,有没有 Location 跳到别处;
- 在服务器日志里按搜索蜘蛛 UA 过滤,看它请求的路径是编码形式还是原样中文;
- 把 sitemap 里的写法和页面内链写法对一遍,不一致时以能稳定返回 200 的那个为准,然后统一到这一种。
编码问题的本质不是“能不能抓”,而是“抓到的是不是同一个地址”。同一页面被拆成多个 URL,抓取预算和权重都会被摊薄,反馈到数据上就是投了却看不出变化。
投放时具体怎么处理
入口页和目标链接尽量都使用已编码、且服务端能正确解码的形式。如果目标站自己都处理不好中文路径,与其反复调编码,不如把固定链接改成 ID 或拼音形式,长期更省事。历史页面已经存在多种写法时,先用 canonical 指向规范地址,再按规范地址投放,不要几种形式一起投,否则等于自己制造重复 URL。
一个容易忽略的边界
URL 转码问题通常和服务器配置、CMS 路由规则绑在一起,不是蜘蛛池那一侧能解决的。投放前如果发现非 ASCII 路径大面积异常,先修站点,再谈 URL 发现,顺序反了就是白做。